aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/net/connector.rs38
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,
+ }
}
})
})