1 use crate::SslStream;
2 use futures_util::future;
3 use openssl::ssl::{Ssl, SslAcceptor, SslConnector, SslFiletype, SslMethod};
4 use std::net::ToSocketAddrs;
5 use std::pin::Pin;
6 use tokio::io::{AsyncReadExt, AsyncWrite, AsyncWriteExt};
7 use tokio::net::{TcpListener, TcpStream};
8
9 #[tokio::test]
google()10 async fn google() {
11 let addr = "google.com:443".to_socket_addrs().unwrap().next().unwrap();
12 let stream = TcpStream::connect(&addr).await.unwrap();
13
14 let ssl = SslConnector::builder(SslMethod::tls())
15 .unwrap()
16 .build()
17 .configure()
18 .unwrap()
19 .into_ssl("google.com")
20 .unwrap();
21 let mut stream = SslStream::new(ssl, stream).unwrap();
22
23 Pin::new(&mut stream).connect().await.unwrap();
24
25 stream.write_all(b"GET / HTTP/1.0\r\n\r\n").await.unwrap();
26
27 let mut buf = vec![];
28 stream.read_to_end(&mut buf).await.unwrap();
29 let response = String::from_utf8_lossy(&buf);
30 let response = response.trim_end();
31
32 // any response code is fine
33 assert!(response.starts_with("HTTP/1.0 "));
34 assert!(response.ends_with("</html>") || response.ends_with("</HTML>"));
35 }
36
37 #[tokio::test]
server()38 async fn server() {
39 let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
40 let addr = listener.local_addr().unwrap();
41
42 let server = async move {
43 let mut acceptor = SslAcceptor::mozilla_intermediate(SslMethod::tls()).unwrap();
44 acceptor
45 .set_private_key_file("tests/key.pem", SslFiletype::PEM)
46 .unwrap();
47 acceptor
48 .set_certificate_chain_file("tests/cert.pem")
49 .unwrap();
50 let acceptor = acceptor.build();
51
52 let ssl = Ssl::new(acceptor.context()).unwrap();
53 let stream = listener.accept().await.unwrap().0;
54 let mut stream = SslStream::new(ssl, stream).unwrap();
55
56 Pin::new(&mut stream).accept().await.unwrap();
57
58 let mut buf = [0; 4];
59 stream.read_exact(&mut buf).await.unwrap();
60 assert_eq!(&buf, b"asdf");
61
62 stream.write_all(b"jkl;").await.unwrap();
63
64 future::poll_fn(|ctx| Pin::new(&mut stream).poll_shutdown(ctx))
65 .await
66 .unwrap()
67 };
68
69 let client = async {
70 let mut connector = SslConnector::builder(SslMethod::tls()).unwrap();
71 connector.set_ca_file("tests/cert.pem").unwrap();
72 let ssl = connector
73 .build()
74 .configure()
75 .unwrap()
76 .into_ssl("localhost")
77 .unwrap();
78
79 let stream = TcpStream::connect(&addr).await.unwrap();
80 let mut stream = SslStream::new(ssl, stream).unwrap();
81
82 Pin::new(&mut stream).connect().await.unwrap();
83
84 stream.write_all(b"asdf").await.unwrap();
85
86 let mut buf = vec![];
87 stream.read_to_end(&mut buf).await.unwrap();
88 assert_eq!(buf, b"jkl;");
89 };
90
91 future::join(server, client).await;
92 }
93