• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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