diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2019-01-15 16:06:35 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-15 16:06:35 -0500 |
commit | 4f45eea1250b0239704be774db23a14e54606464 (patch) | |
tree | 37d279708adc161864c64daa8f3791aa249dc7f0 /components/net/connector.rs | |
parent | fde83f733defe87c5450a59ab3d7bfa2bdc4a38a (diff) | |
parent | 6404a0ef530a28b30c8a52fe55c34cc45204ca3b (diff) | |
download | servo-4f45eea1250b0239704be774db23a14e54606464.tar.gz servo-4f45eea1250b0239704be774db23a14e54606464.zip |
Auto merge of #22616 - jdm:google-decode, r=nox
Fix brotli decoding
This replaces our current decoding setup by https://github.com/seanmonstar/reqwest/blob/master/src/async_impl/decoder.rs, and integrates brotli and deflate decoding to maintain our existing support.
---
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] These changes fix #22228
- [x] There are tests for these changes
<!-- 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/22616)
<!-- Reviewable:end -->
Diffstat (limited to 'components/net/connector.rs')
-rw-r--r-- | components/net/connector.rs | 106 |
1 files changed, 1 insertions, 105 deletions
diff --git a/components/net/connector.rs b/components/net/connector.rs index c93f82df5e2..1306c2d5609 100644 --- a/components/net/connector.rs +++ b/components/net/connector.rs @@ -3,9 +3,6 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::hosts::replace_host; -use crate::http_loader::Decoder; -use flate2::read::GzDecoder; -use hyper::body::Payload; use hyper::client::connect::{Connect, Destination}; use hyper::client::HttpConnector as HyperHttpConnector; use hyper::rt::Future; @@ -13,9 +10,7 @@ use hyper::{Body, Client}; use hyper_openssl::HttpsConnector; use openssl::ssl::{SslConnector, SslConnectorBuilder, SslMethod, SslOptions}; use openssl::x509; -use std::io::{Cursor, Read}; use tokio::prelude::future::Executor; -use tokio::prelude::{Async, Stream}; pub const BUF_SIZE: usize = 32768; @@ -47,105 +42,6 @@ impl Connect for HttpConnector { } pub type Connector = HttpsConnector<HttpConnector>; -pub struct WrappedBody { - pub body: Body, - pub decoder: Decoder, -} - -impl WrappedBody { - pub fn new(body: Body) -> Self { - Self::new_with_decoder(body, Decoder::Plain) - } - - pub fn new_with_decoder(body: Body, decoder: Decoder) -> Self { - WrappedBody { body, decoder } - } -} - -impl Payload for WrappedBody { - type Data = <Body as Payload>::Data; - type Error = <Body as Payload>::Error; - fn poll_data(&mut self) -> Result<Async<Option<Self::Data>>, Self::Error> { - self.body.poll_data() - } -} - -impl Stream for WrappedBody { - type Item = <Body as Stream>::Item; - type Error = <Body as Stream>::Error; - fn poll(&mut self) -> Result<Async<Option<Self::Item>>, Self::Error> { - self.body.poll().map(|res| { - res.map(|maybe_chunk| { - if let Some(chunk) = maybe_chunk { - match self.decoder { - Decoder::Plain => Some(chunk), - Decoder::Gzip(Some(ref mut decoder)) => { - let mut buf = vec![0; BUF_SIZE]; - decoder.get_mut().get_mut().extend(chunk.as_ref()); - let len = decoder.read(&mut buf).ok()?; - buf.truncate(len); - Some(buf.into()) - }, - Decoder::Gzip(None) => { - let mut buf = vec![0; BUF_SIZE]; - let mut decoder = GzDecoder::new(Cursor::new(chunk.into_bytes())); - let len = decoder.read(&mut buf).ok()?; - buf.truncate(len); - self.decoder = Decoder::Gzip(Some(decoder)); - Some(buf.into()) - }, - Decoder::Deflate(ref mut decoder) => { - let mut buf = vec![0; BUF_SIZE]; - 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.as_ref()); - let len = decoder.read(&mut buf).ok()?; - buf.truncate(len); - Some(buf.into()) - }, - } - } else { - // 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, - } - } - }) - }) - } -} pub fn create_ssl_connector_builder(certs: &str) -> SslConnectorBuilder { // certs include multiple certificates. We could add all of them at once, @@ -189,7 +85,7 @@ pub fn create_ssl_connector_builder(certs: &str) -> SslConnectorBuilder { pub fn create_http_client<E>( ssl_connector_builder: SslConnectorBuilder, executor: E, -) -> Client<Connector, WrappedBody> +) -> Client<Connector, Body> where E: Executor<Box<dyn Future<Error = (), Item = ()> + Send + 'static>> + Sync + Send + 'static, { |