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 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
45pub fn test_google<C: TlsConnector>() {
47 block_on(test_google_impl::<C>())
48}