Просмотр исходного кода

Auto merge of #257 - Manishearth:swapipv6, r=SimonSapin

Actually swap values whilst compressing ipv6 entries

(fixes #253)

r? @SimonSapin

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/rust-url/257)
<!-- Reviewable:end -->
bors-servo 9 лет назад
Родитель
Сommit
cf8ca41064
2 измененных файлов с 22 добавлено и 4 удалено
  1. 5 4
      src/host.rs
  2. 17 0
      tests/urltestdata.json

+ 5 - 4
src/host.rs

@@ -235,7 +235,7 @@ fn longest_zero_sequence(pieces: &[u16; 8]) -> (isize, isize) {
     (longest, longest + longest_length)
 }
 
-
+/// https://url.spec.whatwg.org/#ipv4-number-parser
 fn parse_ipv4number(mut input: &str) -> Result<u32, ()> {
     let mut r = 10;
     if input.starts_with("0x") || input.starts_with("0X") {
@@ -257,6 +257,7 @@ fn parse_ipv4number(mut input: &str) -> Result<u32, ()> {
     }
 }
 
+/// https://url.spec.whatwg.org/#concept-ipv4-parser
 fn parse_ipv4addr(input: &str) -> ParseResult<Option<Ipv4Addr>> {
     if input.is_empty() {
         return Ok(None)
@@ -293,7 +294,7 @@ fn parse_ipv4addr(input: &str) -> ParseResult<Option<Ipv4Addr>> {
     Ok(Some(Ipv4Addr::from(ipv4)))
 }
 
-
+/// https://url.spec.whatwg.org/#concept-ipv6-parser
 fn parse_ipv6addr(input: &str) -> ParseResult<Ipv6Addr> {
     let input = input.as_bytes();
     let len = input.len();
@@ -408,14 +409,14 @@ fn parse_ipv6addr(input: &str) -> ParseResult<Ipv6Addr> {
             dots_seen += 1;
         }
     }
-
     match compress_pointer {
         Some(compress_pointer) => {
             let mut swaps = piece_pointer - compress_pointer;
             piece_pointer = 7;
             while swaps > 0 {
+                let tmp = pieces[piece_pointer];
                 pieces[piece_pointer] = pieces[compress_pointer + swaps - 1];
-                pieces[compress_pointer + swaps - 1] = 0;
+                pieces[compress_pointer + swaps - 1] = tmp;
                 swaps -= 1;
                 piece_pointer -= 1;
             }

+ 17 - 0
tests/urltestdata.json

@@ -4373,5 +4373,22 @@
     "search": "?qux",
     "searchParams": "",
     "hash": "#foo%08bar"
+  },
+  "# IPv6 compression",
+  {
+    "input": "http://[fe80:cd00::cde:1257:0:211e:729c]/",
+    "base": "about:blank",
+    "href": "http://[fe80:cd00::cde:1257:0:211e:729c]/",
+    "origin": "http://[fe80:cd00::cde:1257:0:211e:729c]",
+    "protocol": "http:",
+    "username": "",
+    "password": "",
+    "host": "[fe80:cd00::cde:1257:0:211e:729c]",
+    "hostname": "[fe80:cd00::cde:1257:0:211e:729c]",
+    "port": "",
+    "pathname": "/",
+    "search": "",
+    "searchParams": "",
+    "hash": ""
   }
 ]