aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2018-11-08 08:47:10 -0500
committerGitHub <noreply@github.com>2018-11-08 08:47:10 -0500
commitdd5e5e9294e51e8cbbbcd6affa54e954701a7d2e (patch)
tree2016748480fab8bb958741a41d19b9e974657bc4
parent0a11e10a0ffaaddfc4baed9e5b22891fdab7588c (diff)
parent85c6eff94a7c1266fddd78ce12e7632db1b8a2ac (diff)
downloadservo-dd5e5e9294e51e8cbbbcd6affa54e954701a7d2e.tar.gz
servo-dd5e5e9294e51e8cbbbcd6affa54e954701a7d2e.zip
Auto merge of #22144 - Eijebong:hyperfix, r=jdm
Fix downloading huge files (broken since hyperup) <!-- Reviewable:start --> This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/22144) <!-- Reviewable:end -->
-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,
+ }
}
})
})