aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2015-04-01 22:15:37 -0600
committerbors-servo <metajack+bors@gmail.com>2015-04-01 22:15:37 -0600
commitdbd16932e67c63a778362f71be028132279d5e91 (patch)
treeaa7f4d569a386b9b83f83745194435a6d4ea4d4a
parent54a6e08146b7074d17472a1ea195f91abf2b48e8 (diff)
parent818f1c57480a8dc6ea61ea7d01973a8bc5c1fcbd (diff)
downloadservo-dbd16932e67c63a778362f71be028132279d5e91.tar.gz
servo-dbd16932e67c63a778362f71be028132279d5e91.zip
auto merge of #5299 : mattnenterprise/servo/http_compression, r=jdm
-rw-r--r--components/net/Cargo.toml1
-rw-r--r--components/net/http_loader.rs74
-rw-r--r--components/net/lib.rs1
-rw-r--r--components/servo/Cargo.lock19
-rw-r--r--ports/cef/Cargo.lock19
-rw-r--r--ports/gonk/Cargo.lock19
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/response-data-gzip.htm.ini5
7 files changed, 111 insertions, 27 deletions
diff --git a/components/net/Cargo.toml b/components/net/Cargo.toml
index 8f8c43b4139..f98ec042b44 100644
--- a/components/net/Cargo.toml
+++ b/components/net/Cargo.toml
@@ -31,3 +31,4 @@ cookie="*"
regex = "0.1.14"
regex_macros = "0.1.8"
hyper = "0.3"
+flate2 = "0.2.0"
diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs
index 6bc5e990096..57e65a02b58 100644
--- a/components/net/http_loader.rs
+++ b/components/net/http_loader.rs
@@ -3,15 +3,16 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use cookie_storage::CookieSource;
-use resource_task::{Metadata, TargetedLoadResponse, LoadData, start_sending_opt, ResponseSenders};
+use resource_task::{Metadata, TargetedLoadResponse, LoadData, start_sending_opt, ResponseSenders, ProgressMsg};
use resource_task::ControlMsg;
use resource_task::ProgressMsg::{Payload, Done};
use log;
use std::collections::HashSet;
use file_loader;
+use flate2::read::{DeflateDecoder, GzDecoder};
use hyper::client::Request;
-use hyper::header::{ContentLength, ContentType, Host, Location};
+use hyper::header::{AcceptEncoding, ContentLength, ContentType, Host, Location};
use hyper::HttpError;
use hyper::method::Method;
use hyper::mime::{Mime, TopLevel, SubLevel};
@@ -160,11 +161,9 @@ reason: \"certificate verify failed\" }]";
req.headers_mut().set_raw("Cookie".to_owned(), v);
}
- // FIXME(seanmonstar): use AcceptEncoding from Hyper once available
- //if !req.headers.has::<AcceptEncoding>() {
- // We currently don't support HTTP Compression (FIXME #2587)
- req.headers_mut().set_raw("Accept-Encoding".to_owned(), vec![b"identity".to_vec()]);
- //}
+ if !req.headers().has::<AcceptEncoding>() {
+ req.headers_mut().set_raw("Accept-Encoding".to_owned(), vec![b"gzip, deflate".to_vec()]);
+ }
if log_enabled!(log::INFO) {
info!("{}", load_data.method);
for header in req.headers().iter() {
@@ -296,24 +295,32 @@ reason: \"certificate verify failed\" }]";
Ok(p) => p,
_ => return
};
- loop {
- let mut buf = Vec::with_capacity(1024);
-
- unsafe { buf.set_len(1024); }
- match response.read(buf.as_mut_slice()) {
- Ok(len) if len > 0 => {
- unsafe { buf.set_len(len); }
- if progress_chan.send(Payload(buf)).is_err() {
- // The send errors when the receiver is out of scope,
- // which will happen if the fetch has timed out (or has been aborted)
- // so we don't need to continue with the loading of the file here.
- return;
+
+ let mut encoding_str: Option<String> = None;
+ //FIXME: Implement Content-Encoding Header https://github.com/hyperium/hyper/issues/391
+ if let Some(encodings) = response.headers.get_raw("content-encoding") {
+ for encoding in encodings.iter() {
+ if let Ok(encodings) = String::from_utf8(encoding.clone()) {
+ if encodings == "gzip" || encodings == "deflate" {
+ encoding_str = Some(encodings);
+ break;
}
}
- Ok(_) | Err(_) => {
- let _ = progress_chan.send(Done(Ok(())));
- break;
+ }
+ }
+
+ match encoding_str {
+ Some(encoding) => {
+ if encoding == "gzip" {
+ let mut response_decoding = GzDecoder::new(response).unwrap();
+ send_data(&mut response_decoding, progress_chan);
+ } else if encoding == "deflate" {
+ let mut response_decoding = DeflateDecoder::new(response);
+ send_data(&mut response_decoding, progress_chan);
}
+ },
+ None => {
+ send_data(&mut response, progress_chan);
}
}
@@ -321,3 +328,26 @@ reason: \"certificate verify failed\" }]";
break;
}
}
+
+fn send_data<R: Read>(reader: &mut R, progress_chan: Sender<ProgressMsg>) {
+ loop {
+ let mut buf = Vec::with_capacity(1024);
+
+ unsafe { buf.set_len(1024); }
+ match reader.read(buf.as_mut_slice()) {
+ Ok(len) if len > 0 => {
+ unsafe { buf.set_len(len); }
+ if progress_chan.send(Payload(buf)).is_err() {
+ // The send errors when the receiver is out of scope,
+ // which will happen if the fetch has timed out (or has been aborted)
+ // so we don't need to continue with the loading of the file here.
+ return;
+ }
+ }
+ Ok(_) | Err(_) => {
+ let _ = progress_chan.send(Done(Ok(())));
+ break;
+ }
+ }
+ }
+}
diff --git a/components/net/lib.rs b/components/net/lib.rs
index 6eb504ff2d3..4ebb5ef092c 100644
--- a/components/net/lib.rs
+++ b/components/net/lib.rs
@@ -20,6 +20,7 @@
extern crate "cookie" as cookie_rs;
extern crate collections;
+extern crate flate2;
extern crate geom;
extern crate hyper;
extern crate png;
diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock
index 4ed7d0fee11..b8bd6086f93 100644
--- a/components/servo/Cargo.lock
+++ b/components/servo/Cargo.lock
@@ -241,6 +241,15 @@ version = "2.1.0"
source = "git+https://github.com/servo/libexpat#523a2f2f51b41adf7bb5c4c65e80db0cb615d70b"
[[package]]
+name = "flate2"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "miniz-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "fontconfig"
version = "0.1.0"
source = "git+https://github.com/servo/rust-fontconfig#91195bd29daa9280680bb28ba556821d504a17c6"
@@ -587,6 +596,15 @@ dependencies = [
]
[[package]]
+name = "miniz-sys"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "gcc 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "mod_path"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -617,6 +635,7 @@ name = "net"
version = "0.0.1"
dependencies = [
"cookie 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
+ "flate2 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"geom 0.1.0 (git+https://github.com/servo/rust-geom)",
"hyper 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"openssl 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
diff --git a/ports/cef/Cargo.lock b/ports/cef/Cargo.lock
index 0fbbade1a28..0d5cb75c18d 100644
--- a/ports/cef/Cargo.lock
+++ b/ports/cef/Cargo.lock
@@ -246,6 +246,15 @@ version = "2.1.0"
source = "git+https://github.com/servo/libexpat#523a2f2f51b41adf7bb5c4c65e80db0cb615d70b"
[[package]]
+name = "flate2"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "miniz-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "fontconfig"
version = "0.1.0"
source = "git+https://github.com/servo/rust-fontconfig#91195bd29daa9280680bb28ba556821d504a17c6"
@@ -592,6 +601,15 @@ dependencies = [
]
[[package]]
+name = "miniz-sys"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "gcc 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "mod_path"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -622,6 +640,7 @@ name = "net"
version = "0.0.1"
dependencies = [
"cookie 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
+ "flate2 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"geom 0.1.0 (git+https://github.com/servo/rust-geom)",
"hyper 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"openssl 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
diff --git a/ports/gonk/Cargo.lock b/ports/gonk/Cargo.lock
index 49e49ef1338..d836bf44eb4 100644
--- a/ports/gonk/Cargo.lock
+++ b/ports/gonk/Cargo.lock
@@ -225,6 +225,15 @@ version = "2.1.0"
source = "git+https://github.com/servo/libexpat#523a2f2f51b41adf7bb5c4c65e80db0cb615d70b"
[[package]]
+name = "flate2"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "miniz-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "fontconfig"
version = "0.1.0"
source = "git+https://github.com/servo/rust-fontconfig#91195bd29daa9280680bb28ba556821d504a17c6"
@@ -517,6 +526,15 @@ dependencies = [
]
[[package]]
+name = "miniz-sys"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "gcc 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "mod_path"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -547,6 +565,7 @@ name = "net"
version = "0.0.1"
dependencies = [
"cookie 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
+ "flate2 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"geom 0.1.0 (git+https://github.com/servo/rust-geom)",
"hyper 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"openssl 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
diff --git a/tests/wpt/metadata/XMLHttpRequest/response-data-gzip.htm.ini b/tests/wpt/metadata/XMLHttpRequest/response-data-gzip.htm.ini
deleted file mode 100644
index 0905c1855ad..00000000000
--- a/tests/wpt/metadata/XMLHttpRequest/response-data-gzip.htm.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[response-data-gzip.htm]
- type: testharness
- [XMLHttpRequest: GZIP response was correctly inflated]
- expected: FAIL
-