From f9f27f9c667189ff4f6d25dcfa2bc193e8d46365 Mon Sep 17 00:00:00 2001 From: Brian Henderson Date: Mon, 3 Jul 2017 21:06:33 -0400 Subject: [PATCH 1/2] format connect request with host:port and connect on http/1.0 responses --- src/connect.rs | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/src/connect.rs b/src/connect.rs index 634ceb8..7aadd9a 100644 --- a/src/connect.rs +++ b/src/connect.rs @@ -49,10 +49,14 @@ impl Service for Connector { for prox in self.proxies.iter() { if let Some(puri) = proxy::proxies(prox, &uri) { if uri.scheme() == Some("https") { - let host = uri.authority().unwrap().to_owned(); + let host = uri.host().unwrap().to_owned(); + let port = match uri.port(){ + Some(port) => port.to_string(), + None => 443.to_string() + }.to_owned(); let tls = self.tls.clone(); return Box::new(self.https.call(puri).and_then(move |conn| { - tunnel(conn, host.clone()) + tunnel(conn, host.clone(), port.clone()) .and_then(move |tunneled| { tls.connect_async(&host, tunneled) .map_err(|e| io::Error::new(io::ErrorKind::Other, e)) @@ -137,12 +141,12 @@ impl AsyncWrite for Conn { } } -fn tunnel(conn: T, host: String) -> Tunnel { +fn tunnel(conn: T, host: String, port: String) -> Tunnel { let buf = format!("\ - CONNECT {0} HTTP/1.1\r\n\ - Host: {0}\r\n\ + CONNECT {0}:{1} HTTP/1.1\r\n\ + Host: {0}:{1}\r\n\ \r\n\ - ", host).into_bytes(); + ", host, port).into_bytes(); Tunnel { buf: buf.into_buf(), @@ -183,7 +187,7 @@ where T: AsyncRead + AsyncWrite { if n == 0 { return Err(io::Error::new(io::ErrorKind::UnexpectedEof, "unexpected eof while tunneling")); } else if read.len() > 12 { - if read.starts_with(b"HTTP/1.1 200") { + if read.starts_with(b"HTTP/1.1 200") || read.starts_with(b"HTTP/1.0 200"){ if read.ends_with(b"\r\n\r\n") { return Ok(Async::Ready(self.conn.take().unwrap())); } @@ -219,10 +223,10 @@ mod tests { let listener = TcpListener::bind("127.0.0.1:0").unwrap(); let addr = listener.local_addr().unwrap(); let connect_expected = format!("\ - CONNECT {0} HTTP/1.1\r\n\ - Host: {0}\r\n\ + CONNECT {0}:{1} HTTP/1.1\r\n\ + Host: {0}:{1}\r\n\ \r\n\ - ", addr).into_bytes(); + ", addr.ip(), addr.port()).into_bytes(); thread::spawn(move || { let (mut sock, _) = listener.accept().unwrap(); @@ -242,9 +246,10 @@ mod tests { let mut core = Core::new().unwrap(); let work = TcpStream::connect(&addr, &core.handle()); - let host = addr.to_string(); + let host = addr.ip().to_string(); + let port = addr.port().to_string(); let work = work.and_then(|tcp| { - tunnel(tcp, host) + tunnel(tcp, host, port) }); core.run(work).unwrap(); @@ -256,9 +261,10 @@ mod tests { let mut core = Core::new().unwrap(); let work = TcpStream::connect(&addr, &core.handle()); - let host = addr.to_string(); + let host = addr.ip().to_string(); + let port = addr.port().to_string(); let work = work.and_then(|tcp| { - tunnel(tcp, host) + tunnel(tcp, host, port) }); core.run(work).unwrap_err(); @@ -270,9 +276,10 @@ mod tests { let mut core = Core::new().unwrap(); let work = TcpStream::connect(&addr, &core.handle()); - let host = addr.to_string(); + let host = addr.ip().to_string(); + let port = addr.port().to_string(); let work = work.and_then(|tcp| { - tunnel(tcp, host) + tunnel(tcp, host, port) }); core.run(work).unwrap_err(); From 17c0b200cc10de1e39707341bba3830deee9e971 Mon Sep 17 00:00:00 2001 From: Brian Henderson Date: Mon, 3 Jul 2017 21:07:44 -0400 Subject: [PATCH 2/2] do not set_proxy() for https requests --- src/async_impl/client.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/async_impl/client.rs b/src/async_impl/client.rs index 260d7e8..b437b7f 100644 --- a/src/async_impl/client.rs +++ b/src/async_impl/client.rs @@ -335,7 +335,9 @@ impl Client { }); if proxy::is_proxied(&self.inner.proxies, &uri) { - req.set_proxy(true); + if uri.scheme() == Some("http") { + req.set_proxy(true); + } } let in_flight = self.inner.hyper.request(req); @@ -451,7 +453,9 @@ impl Future for Pending { req.set_body(body.clone()); } if proxy::is_proxied(&self.client.proxies, &uri) { - req.set_proxy(true); + if uri.scheme() == Some("http") { + req.set_proxy(true); + } } self.in_flight = self.client.hyper.request(req); continue;