aboutsummaryrefslogtreecommitdiffstats
path: root/components/net/connector.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2019-01-15 16:06:35 -0500
committerGitHub <noreply@github.com>2019-01-15 16:06:35 -0500
commit4f45eea1250b0239704be774db23a14e54606464 (patch)
tree37d279708adc161864c64daa8f3791aa249dc7f0 /components/net/connector.rs
parentfde83f733defe87c5450a59ab3d7bfa2bdc4a38a (diff)
parent6404a0ef530a28b30c8a52fe55c34cc45204ca3b (diff)
downloadservo-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.rs106
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,
{