diff options
-rw-r--r-- | components/net/connector.rs | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/components/net/connector.rs b/components/net/connector.rs index de9f9b2e087..452b0db703d 100644 --- a/components/net/connector.rs +++ b/components/net/connector.rs @@ -81,7 +81,7 @@ impl Stream for WrappedBody { Decoder::Plain => Some(chunk), Decoder::Gzip(Some(ref mut decoder)) => { let mut buf = vec![0; BUF_SIZE]; - *decoder.get_mut() = Cursor::new(chunk.into_bytes()); + decoder.get_mut().get_mut().extend(chunk.as_ref()); let len = decoder.read(&mut buf).ok()?; buf.truncate(len); Some(buf.into()) @@ -96,21 +96,51 @@ impl Stream for WrappedBody { }, Decoder::Deflate(ref mut decoder) => { let mut buf = vec![0; BUF_SIZE]; - *decoder.get_mut() = Cursor::new(chunk.into_bytes()); + decoder.get_mut().get_mut().extend(chunk.as_ref()); let len = decoder.read(&mut buf).ok()?; buf.truncate(len); Some(buf.into()) }, Decoder::Brotli(ref mut decoder) => { let mut buf = vec![0; BUF_SIZE]; - decoder.get_mut().get_mut().extend(&chunk.into_bytes()); + decoder.get_mut().get_mut().extend(chunk.as_ref()); let len = decoder.read(&mut buf).ok()?; buf.truncate(len); Some(buf.into()) }, } } else { - None + // Hyper is done downloading but we still have uncompressed data + match self.decoder { + Decoder::Gzip(Some(ref mut decoder)) => { + let mut buf = vec![0; BUF_SIZE]; + let len = decoder.read(&mut buf).ok()?; + if len == 0 { + return None; + } + buf.truncate(len); + Some(buf.into()) + }, + Decoder::Deflate(ref mut decoder) => { + let mut buf = vec![0; BUF_SIZE]; + let len = decoder.read(&mut buf).ok()?; + if len == 0 { + return None; + } + buf.truncate(len); + Some(buf.into()) + }, + Decoder::Brotli(ref mut decoder) => { + let mut buf = vec![0; BUF_SIZE]; + let len = decoder.read(&mut buf).ok()?; + if len == 0 { + return None; + } + buf.truncate(len); + Some(buf.into()) + }, + _ => None, + } } }) }) |