tls_api_test/
google.rs

1use std::any;
2use std::net::ToSocketAddrs;
3
4use tls_api::runtime::AsyncReadExt;
5use tls_api::runtime::AsyncWriteExt;
6use tls_api::TlsConnector;
7use tls_api::TlsConnectorBuilder;
8
9use crate::block_on;
10use crate::TcpStream;
11
12async fn test_google_impl<C: TlsConnector>() {
13    drop(env_logger::try_init());
14
15    if !C::IMPLEMENTED {
16        eprintln!(
17            "connector {} is not implemented; skipping",
18            any::type_name::<C>()
19        );
20        return;
21    }
22
23    // First up, resolve google.com
24    let addr = t!("google.com:443".to_socket_addrs()).next().unwrap();
25
26    let connector: C = C::builder().expect("builder").build().expect("build");
27    let tcp_stream = t!(TcpStream::connect(addr).await);
28    let mut tls_stream = t!(connector.connect("google.com", tcp_stream).await);
29
30    info!("handshake complete");
31
32    t!(tls_stream.write_all(b"GET / HTTP/1.0\r\n\r\n").await);
33    let mut result = vec![];
34    t!(tls_stream.read_to_end(&mut result).await);
35
36    println!("{}", String::from_utf8_lossy(&result));
37    assert!(
38        result.starts_with(b"HTTP/1.0"),
39        "wrong result: {:?}",
40        result
41    );
42    assert!(result.ends_with(b"</HTML>\r\n") || result.ends_with(b"</html>"));
43}
44
45/// Download google.com front page.
46pub fn test_google<C: TlsConnector>() {
47    block_on(test_google_impl::<C>())
48}