127 lines
3.5 KiB
HTML
127 lines
3.5 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<script src="../../resources/js-test-pre.js"></script>
|
|
<script src="resources/utilities.js"></script>
|
|
</head>
|
|
<body>
|
|
<script>
|
|
description("Canonicalization of IPv6 addresses.");
|
|
|
|
cases = [
|
|
["[", ""],
|
|
["[:", ""],
|
|
["]", ""],
|
|
[":]", ""],
|
|
["[]", ""],
|
|
["[:]", ""],
|
|
|
|
// Regular IP address is invalid without bounding '[' and ']'.
|
|
["2001:db8::1", ""],
|
|
["[2001:db8::1", ""],
|
|
["2001:db8::1]", ""],
|
|
|
|
// Regular IP addresses.
|
|
["[::]", "[::]"],
|
|
["[::1]", "[::1]"],
|
|
["[1::]", "[1::]"],
|
|
["[::192.168.0.1]", "[::c0a8:1]"],
|
|
["[::ffff:192.168.0.1]", "[::ffff:c0a8:1]"],
|
|
|
|
// Leading zeros should be stripped.
|
|
["[000:01:02:003:004:5:6:007]", "[0:1:2:3:4:5:6:7]"],
|
|
|
|
// Upper case letters should be lowercased.
|
|
["[A:b:c:DE:fF:0:1:aC]", "[a:b:c:de:ff:0:1:ac]"],
|
|
|
|
// The same address can be written with different contractions, but should
|
|
// get canonicalized to the same thing.
|
|
["[1:0:0:2::3:0]", "[1::2:0:0:3:0]"],
|
|
["[1::2:0:0:3:0]", "[1::2:0:0:3:0]"],
|
|
|
|
// IPv4 addresses
|
|
// Only mapped and compat addresses can have IPv4 syntax embedded.
|
|
["[::eeee:192.168.0.1]", ""],
|
|
["[2001::192.168.0.1]", ""],
|
|
["[1:2:192.168.0.1:5:6]", ""],
|
|
|
|
// IPv4 with last component missing.
|
|
["[::ffff:192.1.2]", "[::ffff:c001:2]"],
|
|
|
|
// IPv4 using hex.
|
|
// FIXME: Should this format be disallowed?
|
|
["[::ffff:0xC0.0Xa8.0x0.0x1]", "[::ffff:c0a8:1]"],
|
|
|
|
// There may be zeros surrounding the "::" contraction.
|
|
["[0:0::0:0:8]", "[::8]"],
|
|
|
|
["[2001:db8::1]", "[2001:db8::1]"],
|
|
|
|
// Can only have one "::" contraction in an IPv6 string literal.
|
|
["[2001::db8::1]", ""],
|
|
|
|
// No more than 2 consecutive ':'s.
|
|
["[2001:db8:::1]", ""],
|
|
["[:::]", ""],
|
|
|
|
// Non-IP addresses due to invalid characters.
|
|
["[2001::.com]", ""],
|
|
|
|
// Too many components means not an IP address. Similarly with too few if using IPv4 compat or mapped addresses.
|
|
["[::192.168.0.0.1]", ""],
|
|
["[::ffff:192.168.0.0.1]", ""],
|
|
["[1:2:3:4:5:6:7:8:9]", ""],
|
|
|
|
// Too many bits (even though 8 comonents, the last one holds 32 bits).
|
|
["[0:0:0:0:0:0:0:192.168.0.1]", ""],
|
|
|
|
// Too many bits specified -- the contraction would have to be zero-length
|
|
// to not exceed 128 bits.
|
|
["[1:2:3:4:5:6::192.168.0.1]", ""],
|
|
|
|
// The contraction is for 16 bits of zero. RFC 5952, Section 4.2.2.
|
|
["[1:2:3:4:5:6::8]", "[1:2:3:4:5:6:0:8]"],
|
|
|
|
// Cannot have a trailing colon.
|
|
["[1:2:3:4:5:6:7:8:]", ""],
|
|
["[1:2:3:4:5:6:192.168.0.1:]", ""],
|
|
|
|
// Cannot have negative numbers.
|
|
["[-1:2:3:4:5:6:7:8]", ""],
|
|
|
|
// Scope ID -- the URL may contain an optional ["%" <scope_id>] section.
|
|
// The scope_id should be included in the canonicalized URL, and is an
|
|
// unsigned decimal number.
|
|
|
|
// Don't allow scope-id
|
|
["[1::%1]", ""],
|
|
["[1::%eth0]", ""],
|
|
["[1::%]", ""],
|
|
["[%]", ""],
|
|
["[::%:]", ""],
|
|
|
|
// Don't allow leading or trailing colons.
|
|
["[:0:0::0:0:8]", ""],
|
|
["[0:0::0:0:8:]", ""],
|
|
["[:0:0::0:0:8:]", ""],
|
|
|
|
// Two dots in a row means not an IP address.
|
|
["[::192.168..1]", ""],
|
|
|
|
// Spaces should be rejected.
|
|
["[::1 hello]", ""]
|
|
];
|
|
|
|
for (var i = 0; i < cases.length; ++i) {
|
|
test_vector = cases[i][0];
|
|
expected_result = cases[i][1];
|
|
if (expected_result === "")
|
|
expected_result = test_vector;
|
|
shouldBe("canonicalize('http://" + test_vector + "/')",
|
|
"'http://" + expected_result + "/'");
|
|
}
|
|
</script>
|
|
<script src="../../resources/js-test-post.js"></script>
|
|
</body>
|
|
</html>
|