Created
July 10, 2015 01:57
-
-
Save Sebmaster/e93047d02c339e4a7d16 to your computer and use it in GitHub Desktop.
platform-tests
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# FORMAT NOT DOCUMENTED YET (parser is urltestparser.js) | |
# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/segments.js | |
http://example\t.\norg http://example.org/foo/bar s:http h:example.org p:/ | |
http://user:pass@foo:21/bar;par?b#c s:http u:user pass:pass h:foo port:21 p:/bar;par q:?b f:#c | |
http:foo.com s:http h:example.org p:/foo/foo.com | |
\t\s\s\s:foo.com\s\s\s\n s:http h:example.org p:/foo/:foo.com | |
\sfoo.com\s\s s:http h:example.org p:/foo/foo.com | |
a:\t\sfoo.com s:a p:\sfoo.com | |
http://f:21/\sb\s?\sd\s#\se\s s:http h:f port:21 p:/%20b%20 q:?%20d%20 f:#\se | |
http://f:/c s:http h:f p:/c | |
http://f:0/c s:http h:f port:0 p:/c | |
http://f:00000000000000/c s:http h:f port:0 p:/c | |
http://f:00000000000000000000080/c s:http h:f p:/c | |
http://f:b/c | |
http://f:\s/c | |
http://f:\n/c s:http h:f p:/c | |
http://f:fifty-two/c | |
http://f:999999/c s:http h:f port:999999 p:/c | |
http://f:\s21\s/\sb\s?\sd\s#\se\s | |
s:http h:example.org p:/foo/bar | |
\s\s\t s:http h:example.org p:/foo/bar | |
:foo.com/ s:http h:example.org p:/foo/:foo.com/ | |
:foo.com\\ s:http h:example.org p:/foo/:foo.com/ | |
: s:http h:example.org p:/foo/: | |
:a s:http h:example.org p:/foo/:a | |
:/ s:http h:example.org p:/foo/:/ | |
:\\ s:http h:example.org p:/foo/:/ | |
:# s:http h:example.org p:/foo/: f:# | |
\# s:http h:example.org p:/foo/bar f:# | |
\#/ s:http h:example.org p:/foo/bar f:#/ | |
\#\\ s:http h:example.org p:/foo/bar f:#\\ | |
\#;? s:http h:example.org p:/foo/bar f:#;? | |
? s:http h:example.org p:/foo/bar q:? | |
/ s:http h:example.org p:/ | |
:23 s:http h:example.org p:/foo/:23 | |
/:23 s:http h:example.org p:/:23 | |
:: s:http h:example.org p:/foo/:: | |
::23 s:http h:example.org p:/foo/::23 | |
foo:// s:foo p:// | |
http://a:b@c:29/d s:http u:a pass:b h:c port:29 p:/d | |
http::@c:29 s:http h:example.org p:/foo/:@c:29 | |
http://&a:foo(b]c@d:2/ s:http u:&a pass:foo(b]c h:d port:2 p:/ | |
http://::@c@d:2 s:http pass::%40c h:d port:2 p:/ | |
http://foo.com:b@d/ s:http u:foo.com pass:b h:d p:/ | |
http://foo.com/\\@ s:http h:foo.com p://@ | |
http:\\\\foo.com\\ s:http h:foo.com p:/ | |
http:\\\\a\\b:c\\[email protected]\\ s:http h:a p:/b:c/[email protected]/ | |
foo:/ s:foo p:/ | |
foo:/bar.com/ s:foo p:/bar.com/ | |
foo:///////// s:foo p:///////// | |
foo://///////bar.com/ s:foo p://///////bar.com/ | |
foo:////:///// s:foo p:////:///// | |
c:/foo s:c p:/foo | |
//foo/bar s:http h:foo p:/bar | |
http://foo/path;a??e#f#g s:http h:foo p:/path;a q:??e f:#f#g | |
http://foo/abcd?efgh?ijkl s:http h:foo p:/abcd q:?efgh?ijkl | |
http://foo/abcd#foo?bar s:http h:foo p:/abcd f:#foo?bar | |
[61:24:74]:98 s:http h:example.org p:/foo/[61:24:74]:98 | |
http:[61:27]/:foo s:http h:example.org p:/foo/[61:27]/:foo | |
http://[1::2]:3:4 | |
http://2001::1 | |
http://2001::1] | |
http://2001::1]:80 | |
http://[2001::1] s:http h:[2001::1] p:/ | |
http://[2001::1]:80 s:http h:[2001::1] p:/ | |
http:/example.com/ s:http h:example.org p:/example.com/ | |
ftp:/example.com/ s:ftp h:example.com p:/ | |
https:/example.com/ s:https h:example.com p:/ | |
madeupscheme:/example.com/ s:madeupscheme p:/example.com/ | |
file:/example.com/ s:file p:/example.com/ | |
ftps:/example.com/ s:ftps p:/example.com/ | |
gopher:/example.com/ s:gopher h:example.com p:/ | |
ws:/example.com/ s:ws h:example.com p:/ | |
wss:/example.com/ s:wss h:example.com p:/ | |
data:/example.com/ s:data p:/example.com/ | |
javascript:/example.com/ s:javascript p:/example.com/ | |
mailto:/example.com/ s:mailto p:/example.com/ | |
http:example.com/ s:http h:example.org p:/foo/example.com/ | |
ftp:example.com/ s:ftp h:example.com p:/ | |
https:example.com/ s:https h:example.com p:/ | |
madeupscheme:example.com/ s:madeupscheme p:example.com/ | |
ftps:example.com/ s:ftps p:example.com/ | |
gopher:example.com/ s:gopher h:example.com p:/ | |
ws:example.com/ s:ws h:example.com p:/ | |
wss:example.com/ s:wss h:example.com p:/ | |
data:example.com/ s:data p:example.com/ | |
javascript:example.com/ s:javascript p:example.com/ | |
mailto:example.com/ s:mailto p:example.com/ | |
/a/b/c s:http h:example.org p:/a/b/c | |
/a/\s/c s:http h:example.org p:/a/%20/c | |
/a%2fc s:http h:example.org p:/a%2fc | |
/a/%2f/c s:http h:example.org p:/a/%2f/c | |
\#\u03B2 s:http h:example.org p:/foo/bar f:#\u03B2 | |
data:text/html,test#test s:data p:text/html,test f:#test | |
# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/file.html | |
# Basic canonicalization, uppercase should be converted to lowercase | |
file:c:\\foo\\bar.html file:///tmp/mock/path s:file p:/c:/foo/bar.html | |
# Spaces should fail | |
\s\sFile:c|////foo\\bar.html s:file p:/c:////foo/bar.html | |
# This should fail | |
C|/foo/bar s:file p:/C:/foo/bar | |
# This should fail | |
/C|\\foo\\bar s:file p:/C:/foo/bar | |
//C|/foo/bar s:file p:/C:/foo/bar | |
//server/file s:file h:server p:/file | |
\\\\server\\file s:file h:server p:/file | |
/\\server/file s:file h:server p:/file | |
file:///foo/bar.txt s:file p:/foo/bar.txt | |
file:///home/me s:file p:/home/me | |
// s:file p:/ | |
/// s:file p:/ | |
///test s:file p:/test | |
file://test s:file h:test p:/ | |
file://localhost s:file h:localhost p:/ | |
file://localhost/ s:file h:localhost p:/ | |
file://localhost/test s:file h:localhost p:/test | |
test s:file p:/tmp/mock/test | |
file:test s:file p:/tmp/mock/test | |
# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/path.js | |
http://example.com/././foo about:blank s:http h:example.com p:/foo | |
http://example.com/./.foo s:http h:example.com p:/.foo | |
http://example.com/foo/. s:http h:example.com p:/foo/ | |
http://example.com/foo/./ s:http h:example.com p:/foo/ | |
http://example.com/foo/bar/.. s:http h:example.com p:/foo/ | |
http://example.com/foo/bar/../ s:http h:example.com p:/foo/ | |
http://example.com/foo/..bar s:http h:example.com p:/foo/..bar | |
http://example.com/foo/bar/../ton s:http h:example.com p:/foo/ton | |
http://example.com/foo/bar/../ton/../../a s:http h:example.com p:/a | |
http://example.com/foo/../../.. s:http h:example.com p:/ | |
http://example.com/foo/../../../ton s:http h:example.com p:/ton | |
http://example.com/foo/%2e s:http h:example.com p:/foo/ | |
http://example.com/foo/%2e%2 s:http h:example.com p:/foo/%2e%2 | |
http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar s:http h:example.com p:/%2e.bar | |
http://example.com////../.. s:http h:example.com p:// | |
http://example.com/foo/bar//../.. s:http h:example.com p:/foo/ | |
http://example.com/foo/bar//.. s:http h:example.com p:/foo/bar/ | |
http://example.com/foo s:http h:example.com p:/foo | |
http://example.com/%20foo s:http h:example.com p:/%20foo | |
http://example.com/foo% s:http h:example.com p:/foo% | |
http://example.com/foo%2 s:http h:example.com p:/foo%2 | |
http://example.com/foo%2zbar s:http h:example.com p:/foo%2zbar | |
http://example.com/foo%2\u00C2\u00A9zbar s:http h:example.com p:/foo%2%C3%82%C2%A9zbar | |
http://example.com/foo%41%7a s:http h:example.com p:/foo%41%7a | |
http://example.com/foo\t\u0091%91 s:http h:example.com p:/foo%C2%91%91 | |
http://example.com/foo%00%51 s:http h:example.com p:/foo%00%51 | |
http://example.com/(%28:%3A%29) s:http h:example.com p:/(%28:%3A%29) | |
http://example.com/%3A%3a%3C%3c s:http h:example.com p:/%3A%3a%3C%3c | |
http://example.com/foo\tbar s:http h:example.com p:/foobar | |
http://example.com\\\\foo\\\\bar s:http h:example.com p://foo//bar | |
http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd s:http h:example.com p:/%7Ffp3%3Eju%3Dduvgw%3Dd | |
http://example.com/@asdf%40 s:http h:example.com p:/@asdf%40 | |
http://example.com/\u4F60\u597D\u4F60\u597D s:http h:example.com p:/%E4%BD%A0%E5%A5%BD%E4%BD%A0%E5%A5%BD | |
http://example.com/\u2025/foo s:http h:example.com p:/%E2%80%A5/foo | |
http://example.com/\uFEFF/foo s:http h:example.com p:/%EF%BB%BF/foo | |
http://example.com/\u202E/foo/\u202D/bar s:http h:example.com p:/%E2%80%AE/foo/%E2%80%AD/bar | |
# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/relative.js | |
http://www.google.com/foo?bar=baz# about:blank s:http h:www.google.com p:/foo q:?bar=baz f:# | |
http://www.google.com/foo?bar=baz#\s\u00BB s:http h:www.google.com p:/foo q:?bar=baz f:#\s\u00BB | |
data:test#\s\u00BB s:data p:test f:#\s\u00BB | |
http://[www.google.com]/ | |
http://www.google.com s:http h:www.google.com p:/ | |
http://192.0x00A80001 s:http h:192.168.0.1 p:/ | |
http://www/foo%2Ehtml s:http h:www p:/foo%2Ehtml | |
http://www/foo/%2E/html s:http h:www p:/foo/html | |
http://user:pass@/ | |
http://%25DOMAIN:[email protected]/ s:http u:%25DOMAIN pass:foobar h:foodomain.com p:/ | |
http:\\\\www.google.com\\foo s:http h:www.google.com p:/foo | |
http://foo:80/ s:http h:foo p:/ | |
http://foo:81/ s:http h:foo port:81 p:/ | |
httpa://foo:80/ s:httpa p://foo:80/ | |
http://foo:-80/ | |
https://foo:443/ s:https h:foo p:/ | |
https://foo:80/ s:https h:foo port:80 p:/ | |
ftp://foo:21/ s:ftp h:foo p:/ | |
ftp://foo:80/ s:ftp h:foo port:80 p:/ | |
gopher://foo:70/ s:gopher h:foo p:/ | |
gopher://foo:443/ s:gopher h:foo port:443 p:/ | |
ws://foo:80/ s:ws h:foo p:/ | |
ws://foo:81/ s:ws h:foo port:81 p:/ | |
ws://foo:443/ s:ws h:foo port:443 p:/ | |
ws://foo:815/ s:ws h:foo port:815 p:/ | |
wss://foo:80/ s:wss h:foo port:80 p:/ | |
wss://foo:81/ s:wss h:foo port:81 p:/ | |
wss://foo:443/ s:wss h:foo p:/ | |
wss://foo:815/ s:wss h:foo port:815 p:/ | |
http:/example.com/ s:http h:example.com p:/ | |
ftp:/example.com/ s:ftp h:example.com p:/ | |
https:/example.com/ s:https h:example.com p:/ | |
madeupscheme:/example.com/ s:madeupscheme p:/example.com/ | |
file:/example.com/ s:file p:/example.com/ | |
ftps:/example.com/ s:ftps p:/example.com/ | |
gopher:/example.com/ s:gopher h:example.com p:/ | |
ws:/example.com/ s:ws h:example.com p:/ | |
wss:/example.com/ s:wss h:example.com p:/ | |
data:/example.com/ s:data p:/example.com/ | |
javascript:/example.com/ s:javascript p:/example.com/ | |
mailto:/example.com/ s:mailto p:/example.com/ | |
http:example.com/ s:http h:example.com p:/ | |
ftp:example.com/ s:ftp h:example.com p:/ | |
https:example.com/ s:https h:example.com p:/ | |
madeupscheme:example.com/ s:madeupscheme p:example.com/ | |
ftps:example.com/ s:ftps p:example.com/ | |
gopher:example.com/ s:gopher h:example.com p:/ | |
ws:example.com/ s:ws h:example.com p:/ | |
wss:example.com/ s:wss h:example.com p:/ | |
data:example.com/ s:data p:example.com/ | |
javascript:example.com/ s:javascript p:example.com/ | |
mailto:example.com/ s:mailto p:example.com/ | |
# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/segments-userinfo-vs-host.html | |
http:@www.example.com about:blank s:http h:www.example.com p:/ | |
http:/@www.example.com s:http h:www.example.com p:/ | |
http://@www.example.com s:http h:www.example.com p:/ | |
http:a:[email protected] s:http u:a pass:b h:www.example.com p:/ | |
http:/a:[email protected] s:http u:a pass:b h:www.example.com p:/ | |
http://a:[email protected] s:http u:a pass:b h:www.example.com p:/ | |
http://@pple.com s:http h:pple.com p:/ | |
http::[email protected] s:http pass:b h:www.example.com p:/ | |
http:/:[email protected] s:http pass:b h:www.example.com p:/ | |
http://:[email protected] s:http pass:b h:www.example.com p:/ | |
http:/:@/www.example.com | |
http://user@/www.example.com | |
http:@/www.example.com | |
http:/@/www.example.com | |
http://@/www.example.com | |
https:@/www.example.com | |
http:a:b@/www.example.com | |
http:/a:b@/www.example.com | |
http://a:b@/www.example.com | |
http::@/www.example.com | |
http:a:@www.example.com s:http u:a pass: h:www.example.com p:/ | |
http:/a:@www.example.com s:http u:a pass: h:www.example.com p:/ | |
http://a:@www.example.com s:http u:a pass: h:www.example.com p:/ | |
http://[email protected] s:http u:www. h:pple.com p:/ | |
http:@:www.example.com | |
http:/@:www.example.com | |
http://@:www.example.com | |
http://:@www.example.com s:http pass: h:www.example.com p:/ | |
#Others | |
/ http://www.example.com/test s:http h:www.example.com p:/ | |
/test.txt s:http h:www.example.com p:/test.txt | |
. s:http h:www.example.com p:/ | |
.. s:http h:www.example.com p:/ | |
test.txt s:http h:www.example.com p:/test.txt | |
./test.txt s:http h:www.example.com p:/test.txt | |
../test.txt s:http h:www.example.com p:/test.txt | |
../aaa/test.txt s:http h:www.example.com p:/aaa/test.txt | |
../../test.txt s:http h:www.example.com p:/test.txt | |
\u4E2D/test.txt s:http h:www.example.com p:/%E4%B8%AD/test.txt | |
http://www.example2.com s:http h:www.example2.com p:/ | |
//www.example2.com s:http h:www.example2.com p:/ | |
# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/host.html | |
# Basic canonicalization, uppercase should be converted to lowercase | |
http://ExAmPlE.CoM http://other.com/ s:http p:/ h:example.com | |
# Spaces should fail | |
http://example\sexample.com | |
# This should fail | |
http://Goo%20\sgoo%7C|.com | |
# U+3000 is mapped to U+0020 (space) which is disallowed | |
http://GOO\u00a0\u3000goo.com | |
# Other types of space (no-break, zero-width, zero-width-no-break) are | |
# name-prepped away to nothing. | |
# U+200B, U+2060, and U+FEFF, are ignored | |
http://GOO\u200b\u2060\ufeffgoo.com s:http p:/ h:googoo.com | |
# Ideographic full stop (full-width period for Chinese, etc.) should be | |
# treated as a dot. | |
# U+3002 is mapped to U+002E (dot) | |
http://www.foo\u3002bar.com s:http p:/ h:www.foo.bar.com | |
# Invalid unicode characters should fail... | |
# U+FDD0 is disallowed; %ef%b7%90 is U+FDD0 | |
http://\ufdd0zyx.com | |
# ...This is the same as previous but escaped. | |
http://%ef%b7%90zyx.com | |
# Test name prepping, fullwidth input should be converted to ASCII and NOT | |
# IDN-ized. This is "Go" in fullwidth UTF-8/UTF-16. | |
http://\uff27\uff4f.com s:http p:/ h:go.com | |
# URL spec forbids the following. | |
# https://www.w3.org/Bugs/Public/show_bug.cgi?id=24257 | |
http://\uff05\uff14\uff11.com | |
http://%ef%bc%85%ef%bc%94%ef%bc%91.com | |
# ...%00 in fullwidth should fail (also as escaped UTF-8 input) | |
http://\uff05\uff10\uff10.com | |
http://%ef%bc%85%ef%bc%90%ef%bc%90.com | |
# Basic IDN support, UTF-8 and UTF-16 input should be converted to IDN | |
http://\u4f60\u597d\u4f60\u597d s:http p:/ h:xn--6qqa088eba | |
# Invalid escaped characters should fail and the percents should be | |
# escaped. https://www.w3.org/Bugs/Public/show_bug.cgi?id=24191 | |
http://%zz%66%a.com | |
# If we get an invalid character that has been escaped. | |
http://%25 | |
http://hello%00 | |
# Escaped numbers should be treated like IP addresses if they are. | |
# No special handling for IPv4 or IPv4-like URLs | |
http://%30%78%63%30%2e%30%32%35%30.01 s:http p:/ h:192.168.0.1 | |
http://%30%78%63%30%2e%30%32%35%30.01%2e s:http p:/ h:0xc0.0250.01. | |
http://192.168.0.257 | |
# Invalid escaping should trigger the regular host error handling. | |
http://%3g%78%63%30%2e%30%32%35%30%2E.01 | |
# Something that isn't exactly an IP should get treated as a host and | |
# spaces escaped. | |
http://192.168.0.1\shello | |
# Fullwidth and escaped UTF-8 fullwidth should still be treated as IP. | |
# These are "0Xc0.0250.01" in fullwidth. | |
http://\uff10\uff38\uff43\uff10\uff0e\uff10\uff12\uff15\uff10\uff0e\uff10\uff11 s:http p:/ h:192.168.0.1 | |
# Broken IPv6 | |
http://[google.com] | |
# Misc Unicode | |
http://foo:\uD83D\[email protected]/bar s:http h:example.com p:/bar u:foo pass:%F0%9F%92%A9 | |
# resolving a relative reference against an unknown scheme results in an error | |
x test:test |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function URLTestParser(input) { | |
var relativeSchemes = ["ftp", "file", "gopher", "http", "https", "ws", "wss"], | |
tokenMap = { "\\": "\\", "#": "#", n: "\n", r: "\r", s: " ", t: "\t", f: "\f" } | |
resultMap = { s: "scheme", u: "username", pass: "password", h: "host", port: "port", p: "path", q: "query", f: "fragment" }, | |
results = [] | |
function Test() { | |
this.input = "" | |
this.base = "" | |
this.scheme = "" | |
this.username = "" | |
this.password = null | |
this.host = "" | |
this.port = "" | |
this.path = "" | |
this.query = "" | |
this.fragment = "" | |
Object.defineProperties(this, { | |
"href": { get: function() { | |
return !this.scheme ? this.input : this.protocol + ( | |
relativeSchemes.indexOf(this.scheme) != -1 ? "//" + ( | |
("" != this.username || null != this.password) ? this.username + ( | |
null != this.password ? ":" + this.password : "" | |
) + "@" : "" | |
) + this.host : "" | |
) + (this.port ? ":" + this.port : "") + this.path + this.query + this.fragment | |
} }, | |
"protocol": { get: function() { return this.scheme + ":" } }, | |
"search": { get: function() { return "?" == this.query ? "" : this.query } }, | |
"hash": { get: function() { return "#" == this.fragment ? "" : this.fragment } } | |
}) | |
} | |
function normalize(input) { | |
var output = "" | |
for(var i = 0, l = input.length; i < l; i++) { | |
var c = input[i] | |
if(c == "\\") { | |
var nextC = input[++i] | |
if(tokenMap.hasOwnProperty(nextC)) { | |
output += tokenMap[nextC] | |
} else if(nextC == "u") { | |
output += String.fromCharCode(parseInt(input[++i] + input[++i] + input[++i] + input[++i], 16)) | |
} else { | |
throw new Error("Input is invalid.") | |
} | |
} else { | |
output += c | |
} | |
} | |
return output | |
} | |
var lines = input.split("\n") | |
for(var i = 0, l = lines.length; i < l; i++) { | |
var line = lines[i] | |
if(line === "" || line.indexOf("#", 0) === 0) { | |
continue | |
} | |
var pieces = line.split(" "), | |
result = new Test() | |
result.input = normalize(pieces.shift()) | |
var base = pieces.shift() | |
if(base === "" || base === undefined) { | |
result.base = results[results.length - 1].base | |
} else { | |
result.base = normalize(base) | |
} | |
for(var ii = 0, ll = pieces.length; ii < ll; ii++) { | |
var piece = pieces[ii] | |
if(piece.indexOf("#", 0) === 0) { | |
continue | |
} | |
var subpieces = piece.split(":"), | |
token = subpieces.shift() | |
value = subpieces.join(":") | |
result[resultMap[token]] = normalize(value) | |
} | |
results.push(result) | |
} | |
return results | |
} | |
module.exports = URLTestParser |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment