diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2019-11-27 03:53:17 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-27 03:53:17 -0500 |
commit | 81c59077fded1a9402b25cff7006794057b92404 (patch) | |
tree | c7fd6f3e8eb0de3069b29febbe839f1374802552 | |
parent | b0f573b59fd9ee9acc611efd41084257de47de7e (diff) | |
parent | 7363db31dbf32a61817f547a27b4d7c50e4ec081 (diff) | |
download | servo-81c59077fded1a9402b25cff7006794057b92404.tar.gz servo-81c59077fded1a9402b25cff7006794057b92404.zip |
Auto merge of #24870 - pshaughn:2909, r=jdm
Fix #2909 (squashed version of PR #24865)
<!-- Please describe your changes on the following line: -->
Now using data-url::forgiving_base64 instead of base64, this fixes all the fetch/data-urls/base64.* tests.
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes do not quite fix yet #2909
<!-- Either: -->
- [X] There are tests for these changes OR
- [ ] These changes do not require tests because ___
<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->
<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
-rw-r--r-- | Cargo.lock | 10 | ||||
-rw-r--r-- | components/net/Cargo.toml | 1 | ||||
-rw-r--r-- | components/net/data_loader.rs | 14 | ||||
-rw-r--r-- | tests/wpt/metadata/fetch/data-urls/base64.any.js.ini | 33 |
4 files changed, 17 insertions, 41 deletions
diff --git a/Cargo.lock b/Cargo.lock index 27637643b3b..2e5d21b423f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1022,6 +1022,15 @@ dependencies = [ ] [[package]] +name = "data-url" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d33fe99ccedd6e84bc035f1931bb2e6be79739d6242bd895e7311c886c50dc9c" +dependencies = [ + "matches", +] + +[[package]] name = "dbus" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3460,6 +3469,7 @@ dependencies = [ "content-security-policy", "cookie", "crossbeam-channel", + "data-url", "devtools_traits", "embedder_traits", "flate2", diff --git a/components/net/Cargo.toml b/components/net/Cargo.toml index aac0b32aaeb..2b4296d3f25 100644 --- a/components/net/Cargo.toml +++ b/components/net/Cargo.toml @@ -20,6 +20,7 @@ bytes = "0.4" content-security-policy = {version = "0.3.0", features = ["serde"]} cookie_rs = {package = "cookie", version = "0.11"} crossbeam-channel = "0.3" +data-url = "0.1.0" devtools_traits = {path = "../devtools_traits"} embedder_traits = { path = "../embedder_traits" } flate2 = "1" diff --git a/components/net/data_loader.rs b/components/net/data_loader.rs index 02e271cb49c..596ca69cb39 100644 --- a/components/net/data_loader.rs +++ b/components/net/data_loader.rs @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -use base64; +use data_url::forgiving_base64; use mime::Mime; use percent_encoding::percent_decode; use servo_url::ServoUrl; @@ -16,6 +16,10 @@ pub enum DecodeError { pub type DecodeData = (Mime, Vec<u8>); pub fn decode(url: &ServoUrl) -> Result<DecodeData, DecodeError> { + // data_url could do all of this work for us, + // except that it currently (Nov 2019) parses mime types into a + // different Mime class than other code expects + assert_eq!(url.scheme(), "data"); // Split out content type and data. let parts: Vec<&str> = url[Position::BeforePath..Position::AfterQuery] @@ -44,13 +48,7 @@ pub fn decode(url: &ServoUrl) -> Result<DecodeData, DecodeError> { let mut bytes = percent_decode(parts[1].as_bytes()).collect::<Vec<_>>(); if is_base64 { - // FIXME(#2909): It’s unclear what to do with non-alphabet characters, - // but Acid 3 apparently depends on spaces being ignored. - bytes = bytes - .into_iter() - .filter(|&b| b != b' ') - .collect::<Vec<u8>>(); - match base64::decode_config(&bytes, base64::STANDARD.decode_allow_trailing_bits(true)) { + match forgiving_base64::decode_to_vec(&bytes) { Err(..) => return Err(DecodeError::NonBase64DataUri), Ok(data) => bytes = data, } diff --git a/tests/wpt/metadata/fetch/data-urls/base64.any.js.ini b/tests/wpt/metadata/fetch/data-urls/base64.any.js.ini deleted file mode 100644 index 7231f10856e..00000000000 --- a/tests/wpt/metadata/fetch/data-urls/base64.any.js.ini +++ /dev/null @@ -1,33 +0,0 @@ -[base64.any.worker.html] - [data: URL base64 handling: "ab="] - expected: FAIL - - [data: URL base64 handling: "ab\\fcd"] - expected: FAIL - - [data: URL base64 handling: "ab\\t\\n\\f\\r cd"] - expected: FAIL - - [data: URL base64 handling: " \\t\\n\\f\\r ab\\t\\n\\f\\r cd\\t\\n\\f\\r "] - expected: FAIL - - [data: URL base64 handling: "ab\\t\\n\\f\\r =\\t\\n\\f\\r =\\t\\n\\f\\r "] - expected: FAIL - - -[base64.any.html] - [data: URL base64 handling: "ab="] - expected: FAIL - - [data: URL base64 handling: "ab\\fcd"] - expected: FAIL - - [data: URL base64 handling: "ab\\t\\n\\f\\r cd"] - expected: FAIL - - [data: URL base64 handling: " \\t\\n\\f\\r ab\\t\\n\\f\\r cd\\t\\n\\f\\r "] - expected: FAIL - - [data: URL base64 handling: "ab\\t\\n\\f\\r =\\t\\n\\f\\r =\\t\\n\\f\\r "] - expected: FAIL - |