From 3ac277b1f00331a07207f235dfbba1c42298800a Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Thu, 11 Dec 2014 20:27:37 -0800 Subject: [PATCH] fix(ssl): set_hostname on ssl connections --- benches/client_mock_tcp.rs | 2 +- src/client/request.rs | 2 +- src/mock.rs | 4 ++-- src/net.rs | 16 +++++++++++----- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/benches/client_mock_tcp.rs b/benches/client_mock_tcp.rs index c6ffc42b..1321a568 100644 --- a/benches/client_mock_tcp.rs +++ b/benches/client_mock_tcp.rs @@ -95,7 +95,7 @@ impl net::NetworkStream for MockStream { struct MockConnector; impl net::NetworkConnector for MockConnector { - fn connect(&mut self, _addr: To, _scheme: &str) -> IoResult { + fn connect(&mut self, _: &str, _: u16, _: &str) -> IoResult { Ok(MockStream::new()) } diff --git a/src/client/request.rs b/src/client/request.rs index 045c5093..28125174 100644 --- a/src/client/request.rs +++ b/src/client/request.rs @@ -60,7 +60,7 @@ impl Request { }; debug!("port={}", port); - let stream: S = try!(connector.connect((host[], port), &*url.scheme)); + let stream: S = try!(connector.connect(host[], port, &*url.scheme)); let stream = ThroughWriter(BufferedWriter::new(box stream as Box)); let mut headers = Headers::new(); diff --git a/src/mock.rs b/src/mock.rs index 0e650702..cc22a8a7 100644 --- a/src/mock.rs +++ b/src/mock.rs @@ -1,6 +1,6 @@ use std::fmt; use std::io::{IoResult, MemReader, MemWriter}; -use std::io::net::ip::{SocketAddr, ToSocketAddr}; +use std::io::net::ip::SocketAddr; use net::{NetworkStream, NetworkConnector}; @@ -69,7 +69,7 @@ impl NetworkStream for MockStream { pub struct MockConnector; impl NetworkConnector for MockConnector { - fn connect(&mut self, _addr: To, _scheme: &str) -> IoResult { + fn connect(&mut self, _host: &str, _port: u16, _scheme: &str) -> IoResult { Ok(MockStream::new()) } } diff --git a/src/net.rs b/src/net.rs index 11ad5ba1..4f9f1aec 100644 --- a/src/net.rs +++ b/src/net.rs @@ -5,13 +5,13 @@ use std::fmt; use std::intrinsics::TypeId; use std::io::{IoResult, IoError, ConnectionAborted, InvalidInput, OtherIoError, Stream, Listener, Acceptor}; -use std::io::net::ip::{SocketAddr, ToSocketAddr}; +use std::io::net::ip::{SocketAddr, ToSocketAddr, Port}; use std::io::net::tcp::{TcpStream, TcpListener, TcpAcceptor}; use std::mem::{mod, transmute, transmute_copy}; use std::raw::{mod, TraitObject}; use uany::UncheckedBoxAnyDowncast; -use openssl::ssl::{SslStream, SslContext}; +use openssl::ssl::{SslStream, SslContext, Ssl}; use openssl::ssl::SslMethod::Sslv23; use openssl::ssl::error::{SslError, StreamError, OpenSslErrors, SslSessionClosed}; @@ -62,7 +62,7 @@ impl StreamClone for T { /// A connector creates a NetworkStream. pub trait NetworkConnector { /// Connect to a remote address. - fn connect(&mut self, addr: To, scheme: &str) -> IoResult; + fn connect(&mut self, host: &str, port: Port, scheme: &str) -> IoResult; } impl fmt::Show for Box { @@ -239,7 +239,8 @@ impl NetworkStream for HttpStream { pub struct HttpConnector; impl NetworkConnector for HttpConnector { - fn connect(&mut self, addr: To, scheme: &str) -> IoResult { + fn connect(&mut self, host: &str, port: Port, scheme: &str) -> IoResult { + let addr = (host, port); match scheme { "http" => { debug!("http scheme"); @@ -249,7 +250,11 @@ impl NetworkConnector for HttpConnector { debug!("https scheme"); let stream = try!(TcpStream::connect(addr)); let context = try!(SslContext::new(Sslv23).map_err(lift_ssl_error)); - let stream = try!(SslStream::new(&context, stream).map_err(lift_ssl_error)); + let ssl = try!(Ssl::new(&context).map_err(lift_ssl_error)); + debug!("ssl set_hostname = {}", host); + try!(ssl.set_hostname(host).map_err(lift_ssl_error)); + debug!("ssl set_hostname done"); + let stream = try!(SslStream::new_from(ssl, stream).map_err(lift_ssl_error)); Ok(Https(stream)) }, _ => { @@ -264,6 +269,7 @@ impl NetworkConnector for HttpConnector { } fn lift_ssl_error(ssl: SslError) -> IoError { + debug!("lift_ssl_error: {}", ssl); match ssl { StreamError(err) => err, SslSessionClosed => IoError {