diff --git a/src/host.rs b/src/host.rs index e420ca8b..4da5848c 100644 --- a/src/host.rs +++ b/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 { let mut r = 10; if input.starts_with("0x") || input.starts_with("0X") { @@ -257,6 +257,7 @@ fn parse_ipv4number(mut input: &str) -> Result { } } +/// https://url.spec.whatwg.org/#concept-ipv4-parser fn parse_ipv4addr(input: &str) -> ParseResult> { if input.is_empty() { return Ok(None) @@ -293,7 +294,7 @@ fn parse_ipv4addr(input: &str) -> ParseResult> { Ok(Some(Ipv4Addr::from(ipv4))) } - +/// https://url.spec.whatwg.org/#concept-ipv6-parser fn parse_ipv6addr(input: &str) -> ParseResult { let input = input.as_bytes(); let len = input.len(); @@ -408,14 +409,14 @@ fn parse_ipv6addr(input: &str) -> ParseResult { 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; } diff --git a/tests/urltestdata.json b/tests/urltestdata.json index d73ffec1..d92dc8b7 100644 --- a/tests/urltestdata.json +++ b/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": "" } ]