s_client connects to given hostname

This commit is contained in:
Joseph Birr-Pixton 2016-05-30 10:11:22 +01:00
parent 2925f07636
commit 8362ae2518
1 changed files with 33 additions and 9 deletions

View File

@ -6,7 +6,7 @@ use mio::tcp::TcpStream;
use std::str;
use std::io;
use std::io::{Read, Write};
use std::io::{Read, Write, BufReader};
extern crate rustls;
@ -78,9 +78,12 @@ fn read_file(filename: &str) -> Vec<u8> {
}
impl TlsClient {
fn new(sock: TcpStream) -> TlsClient {
fn new(sock: TcpStream, hostname: &str) -> TlsClient {
let mut config = rustls::client::ClientConfig::default();
config.root_store.add(&read_file("test/ca.der"))
let certfile = std::fs::File::open("certs.pem")
.unwrap();
let mut reader = BufReader::new(certfile);
config.root_store.add_pem_file(&mut reader)
.unwrap();
let cfg = Arc::new(config);
@ -88,7 +91,7 @@ impl TlsClient {
TlsClient {
socket: sock,
closing: false,
tls_session: rustls::client::ClientSession::new(&cfg, "testserver.com")
tls_session: rustls::client::ClientSession::new(&cfg, hostname)
}
}
@ -115,10 +118,16 @@ impl TlsClient {
/* We might have new plaintext as a result. */
let mut plaintext = Vec::new();
self.tls_session.read_to_end(&mut plaintext).unwrap();
if plaintext.len() > 0 {
let rc = self.tls_session.read_to_end(&mut plaintext);
if rc.is_ok() && plaintext.len() > 0 {
println!("got {}", str::from_utf8(&plaintext).unwrap());
}
if rc.is_err() {
println!("plaintext read error {:?}", rc.unwrap_err());
self.closing = true;
return;
}
}
fn do_write(&mut self) {
@ -161,11 +170,26 @@ impl TlsClient {
}
fn main() {
let addr = "127.0.0.1:8443".parse().unwrap();
use std::net::ToSocketAddrs;
use std::env;
use std::process;
let args: Vec<String> = env::args().collect();
if args.len() != 2 {
println!("usage: {} hostname", args[0]);
println!("connects to <hostname> port 443, and sends a trivial HTTP request");
process::exit(1);
}
let hostname = &args[1];
let port = 443;
let addr = (hostname.as_str(), port).to_socket_addrs().unwrap().next().unwrap();
let sock = TcpStream::connect(&addr).unwrap();
let mut event_loop = mio::EventLoop::new().unwrap();
let mut tlsclient = TlsClient::new(sock);
tlsclient.write(b"GET / HTTP/1.0\r\n\r\n").unwrap();
let mut tlsclient = TlsClient::new(sock, &hostname);
tlsclient.write(format!("GET / HTTP/1.1\r\nHost: {}\r\n\r\n", hostname).as_bytes()).unwrap();
tlsclient.register(&mut event_loop);
event_loop.run(&mut tlsclient).unwrap();
}