aboutsummaryrefslogtreecommitdiffstats
path: root/components/net/connector.rs
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2018-12-21 19:01:47 -0500
committerJosh Matthews <josh@joshmatthews.net>2019-01-15 16:04:45 -0500
commit6404a0ef530a28b30c8a52fe55c34cc45204ca3b (patch)
treec45f0e17beb1a27c4dae8d7e724a559abb1cbd86 /components/net/connector.rs
parent2cf9a00c9983bf23eff23d56321973d36a14f977 (diff)
downloadservo-6404a0ef530a28b30c8a52fe55c34cc45204ca3b.tar.gz
servo-6404a0ef530a28b30c8a52fe55c34cc45204ca3b.zip
Redesign network response decoding to avoid creating decoders before some content is present.
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,
{