format connect request with host:port and connect on http/1.0 responses
This commit is contained in:
@@ -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<T>(conn: T, host: String) -> Tunnel<T> {
|
||||
fn tunnel<T>(conn: T, host: String, port: String) -> Tunnel<T> {
|
||||
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();
|
||||
|
||||
Reference in New Issue
Block a user