diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs index af751ef548b..e4bd2a7f37f 100644 --- a/components/net/http_loader.rs +++ b/components/net/http_loader.rs @@ -94,36 +94,6 @@ fn precise_time_ms() -> u64 { time::precise_time_ns() / (1000 * 1000) } -pub struct WrappedHttpResponse { - pub response: HyperResponse -} - -impl Read for WrappedHttpResponse { - #[inline] - fn read(&mut self, buf: &mut [u8]) -> io::Result { - self.response.read(buf) - } -} - -impl WrappedHttpResponse { - fn headers(&self) -> &Headers { - &self.response.headers - } - - fn content_encoding(&self) -> Option { - let &ContentEncoding(ref encodings) = self.headers().get()?; - if encodings.contains(&Encoding::Gzip) { - Some(Encoding::Gzip) - } else if encodings.contains(&Encoding::Deflate) { - Some(Encoding::Deflate) - } else if encodings.contains(&Encoding::EncodingExt("br".to_owned())) { - Some(Encoding::EncodingExt("br".to_owned())) - } else { - None - } - } -} - // Step 3 of https://fetch.spec.whatwg.org/#concept-fetch. pub fn set_default_accept(destination: Destination, headers: &mut Headers) { if headers.has::() { @@ -316,18 +286,21 @@ impl Read for StreamedResponse { } impl StreamedResponse { - fn from_http_response(response: WrappedHttpResponse) -> io::Result { - let decoder = match response.content_encoding() { - Some(Encoding::Gzip) => { - Decoder::Gzip(GzDecoder::new(response)?) - } - Some(Encoding::Deflate) => { - Decoder::Deflate(DeflateDecoder::new(response)) - } - Some(Encoding::EncodingExt(ref ext)) if ext == "br" => { - Decoder::Brotli(Decompressor::new(response, 1024)) - } - _ => { + fn from_http_response(response: HyperResponse) -> io::Result { + let decoder = { + if let Some(ref encoding) = response.headers.get::().cloned() { + if encoding.contains(&Encoding::Gzip) { + Decoder::Gzip(GzDecoder::new(response)?) + } + else if encoding.contains(&Encoding::Deflate) { + Decoder::Deflate(DeflateDecoder::new(response)) + } + else if encoding.contains(&Encoding::EncodingExt("br".to_owned())) { + Decoder::Brotli(Decompressor::new(response, 1024)) + } else { + Decoder::Plain(response) + } + } else { Decoder::Plain(response) } }; @@ -336,10 +309,10 @@ impl StreamedResponse { } enum Decoder { - Gzip(GzDecoder), - Deflate(DeflateDecoder), - Brotli(Decompressor), - Plain(WrappedHttpResponse) + Gzip(GzDecoder), + Deflate(DeflateDecoder), + Brotli(Decompressor), + Plain(HyperResponse) } fn prepare_devtools_request(request_id: String, @@ -406,7 +379,7 @@ fn obtain_response(connector: &Pool, iters: u32, request_id: Option<&str>, is_xhr: bool) - -> Result<(WrappedHttpResponse, Option), NetworkError> { + -> Result<(HyperResponse, Option), NetworkError> { let null_data = None; // loop trying connections in connection pool @@ -499,8 +472,7 @@ fn obtain_response(connector: &Pool, debug!("Not notifying devtools (no request_id)"); None }; - - return Ok((WrappedHttpResponse { response: response }, msg)); + return Ok((response, msg)); } } @@ -1078,16 +1050,16 @@ fn http_network_fetch(request: &Request, if log_enabled!(log::LogLevel::Info) { info!("response for {}", url); - for header in res.response.headers.iter() { + for header in res.headers.iter() { info!(" - {}", header); } } let mut response = Response::new(url.clone()); - response.status = Some(res.response.status); - response.raw_status = Some((res.response.status_raw().0, - res.response.status_raw().1.as_bytes().to_vec())); - response.headers = res.response.headers.clone(); + response.status = Some(res.status); + response.raw_status = Some((res.status_raw().0, + res.status_raw().1.as_bytes().to_vec())); + response.headers = res.headers.clone(); response.referrer = request.referrer.to_url().cloned(); response.referrer_policy = request.referrer_policy.clone();