Fixed ProxyTunnel
@@ -17,20 +17,25 @@ pub async fn connect<T: AsyncRead + AsyncWrite + Unpin>(
.into_bytes();
connection.write_all(buffer.as_ref()).await?;
- buffer.clear();
- connection.read_to_end(&mut buffer).await?;
- if buffer.is_empty() {
+ buffer.resize(buffer.capacity(), 0);
+
+ let mut offset = 0;
+ loop {
+ let bytes_read = connection.read(&mut buffer[offset..]).await?;
+ if bytes_read == 0 {
return Err(io::Error::new(io::ErrorKind::Other, "Early EOF from proxy"));
}
+ offset += bytes_read;
let mut headers = [httparse::EMPTY_HEADER; 16];
let mut response = httparse::Response::new(&mut headers);
- response
- .parse(&buffer[..])
- .map_err(|err| io::Error::new(io::ErrorKind::Other, err.to_string()))?;
+ let status = response
+ .parse(&buffer[..offset])
+ .map_err(|err| io::Error::new(io::ErrorKind::Other, err))?;
- match response.code {
+ if status.is_complete() {
+ return match response.code {
Some(200) => Ok(connection), // Proxy says all is well
Some(code) => {
let reason = response.reason.unwrap_or("no reason");
@@ -41,5 +46,11 @@ pub async fn connect<T: AsyncRead + AsyncWrite + Unpin>(
io::ErrorKind::Other,
"Malformed response from proxy",
)),
+ };
+ }
+
+ if offset >= buffer.len() {
+ buffer.resize(buffer.len() * 2, 0);
+ }
}
}
