From 66131c1846b4f7f00882afe67fab80d6dd0b974c Mon Sep 17 00:00:00 2001 From: Yiming Jing Date: Thu, 19 Jul 2018 13:38:32 -0700 Subject: [PATCH] Add a simple example to test against Cloudflare's 0-rtt server implementation --- Cargo.toml | 5 ++++ examples/simple_0rtt_client.rs | 42 ++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 examples/simple_0rtt_client.rs diff --git a/Cargo.toml b/Cargo.toml index 68785c46..4520e666 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -59,3 +59,8 @@ path = "examples/tlsserver.rs" [[example]] name = "simpleclient" path = "examples/simpleclient.rs" + +[[example]] +name = "simple_0rtt_client" +path = "examples/simple_0rtt_client.rs" +required-features = ["logging"] diff --git a/examples/simple_0rtt_client.rs b/examples/simple_0rtt_client.rs new file mode 100644 index 00000000..648838b6 --- /dev/null +++ b/examples/simple_0rtt_client.rs @@ -0,0 +1,42 @@ +use std::sync::Arc; + +use std::io::{stdout, Read, Write}; +use std::net::TcpStream; + +extern crate rustls; +extern crate webpki; +extern crate webpki_roots; +extern crate env_logger; + +fn start_session(config: &Arc, domain_name: &str) { + let dns_name = webpki::DNSNameRef::try_from_ascii_str(domain_name).unwrap(); + let mut sess = rustls::ClientSession::new(config, dns_name); + let mut sock = TcpStream::connect(format!("{}:443", domain_name)).unwrap(); + sock.set_nodelay(true).unwrap(); + let mut stream = rustls::Stream::new(&mut sess, &mut sock); + let request = format!( + "GET / HTTP/1.1\r\n\ + Host: {}\r\n\ + Connection: close\r\n\ + Accept-Encoding: identity\r\n\ + \r\n", + domain_name + ); + + stream.write_all(request.as_bytes()).unwrap(); + let mut plaintext = Vec::new(); + stream.read_to_end(&mut plaintext).unwrap(); + stdout().write_all(&plaintext).unwrap(); +} + +fn main() { + env_logger::init(); + let mut config = rustls::ClientConfig::new(); + config.enable_early_data = true; + config + .root_store + .add_server_trust_anchors(&webpki_roots::TLS_SERVER_ROOTS); + let config = Arc::new(config); + start_session(&config, "mesalink.io"); + start_session(&config, "mesalink.io"); +}