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