diff options
Diffstat (limited to 'test/urls.js')
-rw-r--r-- | test/urls.js | 1892 |
1 files changed, 1892 insertions, 0 deletions
diff --git a/test/urls.js b/test/urls.js new file mode 100644 index 000000000..b38337ec0 --- /dev/null +++ b/test/urls.js @@ -0,0 +1,1892 @@ +/*jshint unused:false, scripturl:true */ +var urls = [{ + name: 'scheme and domain', + url: 'http://www.example.org', + _url: 'http://www.example.org/', + parts: { + protocol: 'http', + username: null, + password: null, + hostname: 'www.example.org', + port: null, + path: '/', + query: null, + fragment: null + }, + accessors: { + protocol: 'http', + username: '', + password: '', + port: '', + path: '/', + query: '', + fragment: '', + resource: '/', + authority: 'www.example.org', + origin: 'http://www.example.org', + userinfo: '', + subdomain: 'www', + domain: 'example.org', + tld: 'org', + directory: '/', + filename: '', + suffix: '', + hash: '', // location.hash style + search: '', // location.search style + host: 'www.example.org', + hostname: 'www.example.org' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'second level domain', + url: 'http://www.example.co.uk', + _url: 'http://www.example.co.uk/', + parts: { + protocol: 'http', + username: null, + password: null, + hostname: 'www.example.co.uk', + port: null, + path: '/', + query: null, + fragment: null + }, + accessors: { + protocol: 'http', + username: '', + password: '', + port: '', + path: '/', + query: '', + fragment: '', + resource: '/', + authority: 'www.example.co.uk', + origin: 'http://www.example.co.uk', + userinfo: '', + subdomain: 'www', + domain: 'example.co.uk', + tld: 'co.uk', + directory: '/', + filename: '', + suffix: '', + hash: '', // location.hash style + search: '', // location.search style + host: 'www.example.co.uk', + hostname: 'www.example.co.uk' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: true, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + },{ + name: 'qualified HTTP', + url: 'http://www.example.org/some/directory/file.html?query=string#fragment', + parts: { + protocol: 'http', + username: null, + password: null, + hostname: 'www.example.org', + port: null, + path: '/some/directory/file.html', + query: 'query=string', + fragment: 'fragment' + }, + accessors: { + protocol: 'http', + username: '', + password: '', + port: '', + path: '/some/directory/file.html', + query: 'query=string', + fragment: 'fragment', + resource: '/some/directory/file.html?query=string#fragment', + authority: 'www.example.org', + origin: 'http://www.example.org', + userinfo: '', + subdomain: 'www', + domain: 'example.org', + tld: 'org', + directory: '/some/directory', + filename: 'file.html', + suffix: 'html', + hash: '#fragment', + search: '?query=string', + host: 'www.example.org', + hostname: 'www.example.org' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'funky suffix', + url: 'http://www.example.org/some/directory/file.html-is-awesome?query=string#fragment', + parts: { + protocol: 'http', + username: null, + password: null, + hostname: 'www.example.org', + port: null, + path: '/some/directory/file.html-is-awesome', + query: 'query=string', + fragment: 'fragment' + }, + accessors: { + protocol: 'http', + username: '', + password: '', + port: '', + path: '/some/directory/file.html-is-awesome', + query: 'query=string', + fragment: 'fragment', + resource: '/some/directory/file.html-is-awesome?query=string#fragment', + authority: 'www.example.org', + origin: 'http://www.example.org', + userinfo: '', + subdomain: 'www', + domain: 'example.org', + tld: 'org', + directory: '/some/directory', + filename: 'file.html-is-awesome', + suffix: '', + hash: '#fragment', + search: '?query=string', + host: 'www.example.org', + hostname: 'www.example.org' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'complete URL', + url: 'scheme://user:pass@www.example.org:123/some/directory/file.html?query=string#fragment', + parts: { + protocol: 'scheme', + username: 'user', + password: 'pass', + hostname: 'www.example.org', + port: '123', + path: '/some/directory/file.html', + query: 'query=string', + fragment: 'fragment' + }, + accessors: { + protocol: 'scheme', + username: 'user', + password: 'pass', + port: '123', + path: '/some/directory/file.html', + query: 'query=string', + fragment: 'fragment', + resource: '/some/directory/file.html?query=string#fragment', + authority: 'user:pass@www.example.org:123', + origin: 'scheme://user:pass@www.example.org:123', + userinfo: 'user:pass', + subdomain: 'www', + domain: 'example.org', + tld: 'org', + directory: '/some/directory', + filename: 'file.html', + suffix: 'html', + hash: '#fragment', + search: '?query=string', + host: 'www.example.org:123', + hostname: 'www.example.org' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'badly encoded userinfo', + url: 'scheme://user:pass:word@www.example.org/', + _url: 'scheme://user:pass%3Aword@www.example.org/', + parts: { + protocol: 'scheme', + username: 'user', + password: 'pass:word', + hostname: 'www.example.org', + port: null, + path: '/', + query: null, + fragment: null + }, + accessors: { + protocol: 'scheme', + username: 'user', + password: 'pass:word', + port: '', + path: '/', + query: '', + fragment: '', + resource: '/', + authority: 'user:pass%3Aword@www.example.org', + origin: 'scheme://user:pass%3Aword@www.example.org', + userinfo: 'user:pass%3Aword', + subdomain: 'www', + domain: 'example.org', + tld: 'org', + directory: '/', + filename: '', + suffix: '', + hash: '', + search: '', + host: 'www.example.org', + hostname: 'www.example.org' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'empty username with non-empty password', + url: 'scheme://:password@www.example.org/', + _url: 'scheme://:password@www.example.org/', + parts: { + protocol: 'scheme', + username: null, + password: 'password', + hostname: 'www.example.org', + port: null, + path: '/', + query: null, + fragment: null + }, + accessors: { + protocol: 'scheme', + username: '', + password: 'password', + port: '', + path: '/', + query: '', + fragment: '', + resource: '/', + authority: ':password@www.example.org', + origin: 'scheme://:password@www.example.org', + userinfo: ':password', + subdomain: 'www', + domain: 'example.org', + tld: 'org', + directory: '/', + filename: '', + suffix: '', + hash: '', + search: '', + host: 'www.example.org', + hostname: 'www.example.org' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'malformed email in userinfo', + url: 'scheme://john@doe.com:pass:word@www.example.org/', + _url: 'scheme://john%40doe.com:pass%3Aword@www.example.org/', + parts: { + protocol: 'scheme', + username: 'john@doe.com', + password: 'pass:word', + hostname: 'www.example.org', + port: null, + path: '/', + query: null, + fragment: null + }, + accessors: { + protocol: 'scheme', + username: 'john@doe.com', + password: 'pass:word', + port: '', + path: '/', + query: '', + fragment: '', + resource: '/', + authority: 'john%40doe.com:pass%3Aword@www.example.org', + origin: 'scheme://john%40doe.com:pass%3Aword@www.example.org', + userinfo: 'john%40doe.com:pass%3Aword', + subdomain: 'www', + domain: 'example.org', + tld: 'org', + directory: '/', + filename: '', + suffix: '', + hash: '', + search: '', + host: 'www.example.org', + hostname: 'www.example.org' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'host-relative: URL', + url: '/some/directory/file.html?query=string#fragment', + parts: { + protocol: null, + username: null, + password: null, + hostname: null, + port: null, + path: '/some/directory/file.html', + query: 'query=string', + fragment: 'fragment' + }, + accessors: { + protocol: '', + username: '', + password: '', + port: '', + path: '/some/directory/file.html', + query: 'query=string', + fragment: 'fragment', + resource: '/some/directory/file.html?query=string#fragment', + authority: '', + origin: '', + userinfo: '', + subdomain: '', + domain: '', + tld: '', + directory: '/some/directory', + filename: 'file.html', + suffix: 'html', + hash: '#fragment', + search: '?query=string', + host: '', + hostname: '' + }, + is: { + urn: false, + url: true, + relative: true, + name: false, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'path-relative: URL', + url: '../some/directory/file.html?query=string#fragment', + parts: { + protocol: null, + username: null, + password: null, + hostname: null, + port: null, + path: '../some/directory/file.html', + query: 'query=string', + fragment: 'fragment' + }, + accessors: { + protocol: '', + username: '', + password: '', + port: '', + path: '../some/directory/file.html', + query: 'query=string', + fragment: 'fragment', + resource: '../some/directory/file.html?query=string#fragment', + authority: '', + origin: '', + userinfo: '', + subdomain: '', + domain: '', + tld: '', + directory: '../some/directory', + filename: 'file.html', + suffix: 'html', + hash: '#fragment', + search: '?query=string', + host: '', + hostname: '' + }, + is: { + urn: false, + url: true, + relative: true, + name: false, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'missing scheme', + url: 'user:pass@www.example.org:123/some/directory/file.html?query=string#fragment', + parts: { + protocol: 'user', + username: null, + password: null, + hostname: null, + port: null, + path: 'pass@www.example.org:123/some/directory/file.html', + query: 'query=string', + fragment: 'fragment' + }, + accessors: { + protocol: 'user', + username: '', + password: '', + port: '', + path: 'pass@www.example.org:123/some/directory/file.html', + query: 'query=string', + fragment: 'fragment', + resource: 'pass@www.example.org:123/some/directory/file.html?query=string#fragment', + authority: '', + origin: '', + userinfo: '', + subdomain: '', + domain: '', + tld: '', + directory: '', + filename: '', + suffix: '', + hash: '#fragment', + search: '?query=string', + host: '', + hostname: '' + }, + is: { + urn: true, + url: false, + relative: false, + name: false, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'ignoring scheme', + url: '://user:pass@example.org:123/some/directory/file.html?query=string#fragment', + _url: '//user:pass@example.org:123/some/directory/file.html?query=string#fragment', + parts: { + protocol: null, + username: 'user', + password: 'pass', + hostname: 'example.org', + port: '123', + path: '/some/directory/file.html', + query: 'query=string', + fragment: 'fragment' + }, + accessors: { + protocol: '', + username: 'user', + password: 'pass', + port: '123', + path: '/some/directory/file.html', + query: 'query=string', + fragment: 'fragment', + resource: '/some/directory/file.html?query=string#fragment', + authority: 'user:pass@example.org:123', + origin: 'user:pass@example.org:123', + userinfo: 'user:pass', + subdomain: '', + domain: 'example.org', + tld: 'org', + directory: '/some/directory', + filename: 'file.html', + suffix: 'html', + hash: '#fragment', + search: '?query=string', + host: 'example.org:123', + hostname: 'example.org' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'scheme-relative URL', + url: '//www.example.org/', + parts: { + protocol: null, + username: null, + password: null, + hostname: 'www.example.org', + port: null, + path: '/', + query: null, + fragment: null + }, + accessors: { + protocol: '', + username: '', + password: '', + port: '', + path: '/', + query: '', + fragment: '', + resource: '/', + authority: 'www.example.org', + origin: 'www.example.org', + userinfo: '', + subdomain: 'www', + domain: 'example.org', + tld: 'org', + directory: '/', + filename: '', + suffix: '', + hash: '', + search: '', + host: 'www.example.org', + hostname: 'www.example.org' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'IPv4', + url: 'http://user:pass@123.123.123.123:123/some/directory/file.html?query=string#fragment', + parts: { + protocol: 'http', + username: 'user', + password: 'pass', + hostname: '123.123.123.123', + port: '123', + path: '/some/directory/file.html', + query: 'query=string', + fragment: 'fragment' + }, + accessors: { + protocol: 'http', + username: 'user', + password: 'pass', + port: '123', + path: '/some/directory/file.html', + query: 'query=string', + fragment: 'fragment', + resource: '/some/directory/file.html?query=string#fragment', + authority: 'user:pass@123.123.123.123:123', + origin: 'http://user:pass@123.123.123.123:123', + userinfo: 'user:pass', + subdomain: '', + domain: '', + tld: '', + directory: '/some/directory', + filename: 'file.html', + suffix: 'html', + hash: '#fragment', + search: '?query=string', + host: '123.123.123.123:123', + hostname: '123.123.123.123' + }, + is: { + urn: false, + url: true, + relative: false, + name: false, + sld: false, + ip: true, + ip4: true, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'IPv6', + url: 'http://user:pass@fe80:0000:0000:0000:0204:61ff:fe9d:f156/some/directory/file.html?query=string#fragment', + _url: 'http://user:pass@[fe80:0000:0000:0000:0204:61ff:fe9d:f156]/some/directory/file.html?query=string#fragment', + parts: { + protocol: 'http', + username: 'user', + password: 'pass', + hostname: 'fe80:0000:0000:0000:0204:61ff:fe9d:f156', + port: null, + path: '/some/directory/file.html', + query: 'query=string', + fragment: 'fragment' + }, + accessors: { + protocol: 'http', + username: 'user', + password: 'pass', + port: '', + path: '/some/directory/file.html', + query: 'query=string', + fragment: 'fragment', + resource: '/some/directory/file.html?query=string#fragment', + authority: 'user:pass@[fe80:0000:0000:0000:0204:61ff:fe9d:f156]', + origin: 'http://user:pass@[fe80:0000:0000:0000:0204:61ff:fe9d:f156]', + userinfo: 'user:pass', + subdomain: '', + domain: '', + tld: '', + directory: '/some/directory', + filename: 'file.html', + suffix: 'html', + hash: '#fragment', + search: '?query=string', + host: '[fe80:0000:0000:0000:0204:61ff:fe9d:f156]', + hostname: 'fe80:0000:0000:0000:0204:61ff:fe9d:f156' + }, + is: { + urn: false, + url: true, + relative: false, + name: false, + sld: false, + ip: true, + ip4: false, + ip6: true, + idn: false, + punycode: false + } + }, { + name: 'IPv6 with port', + url: 'http://user:pass@[fe80:0000:0000:0000:0204:61ff:fe9d:f156]:123/some/directory/file.html?query=string#fragment', + parts: { + protocol: 'http', + username: 'user', + password: 'pass', + hostname: 'fe80:0000:0000:0000:0204:61ff:fe9d:f156', + port: '123', + path: '/some/directory/file.html', + query: 'query=string', + fragment: 'fragment' + }, + accessors: { + protocol: 'http', + username: 'user', + password: 'pass', + port: '123', + path: '/some/directory/file.html', + query: 'query=string', + fragment: 'fragment', + resource: '/some/directory/file.html?query=string#fragment', + authority: 'user:pass@[fe80:0000:0000:0000:0204:61ff:fe9d:f156]:123', + origin: 'http://user:pass@[fe80:0000:0000:0000:0204:61ff:fe9d:f156]:123', + userinfo: 'user:pass', + subdomain: '', + domain: '', + tld: '', + directory: '/some/directory', + filename: 'file.html', + suffix: 'html', + hash: '#fragment', + search: '?query=string', + host: '[fe80:0000:0000:0000:0204:61ff:fe9d:f156]:123', + hostname: 'fe80:0000:0000:0000:0204:61ff:fe9d:f156' + }, + is: { + urn: false, + url: true, + relative: false, + name: false, + sld: false, + ip: true, + ip4: false, + ip6: true, + idn: false, + punycode: false + } + }, { + name: 'IPv6 brackets, port, file.ext', + url: 'http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html', + parts: { + protocol: 'http', + username: null, + password: null, + hostname: 'FEDC:BA98:7654:3210:FEDC:BA98:7654:3210', + port: '80', + path: '/index.html', + query: null, + fragment: null + }, + accessors: { + protocol: 'http', + username: '', + password: '', + port: '80', + path: '/index.html', + query: '', + fragment: '', + resource: '/index.html', + authority: '[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80', + origin: 'http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80', + userinfo: '', + subdomain: '', + domain: '', + tld: '', + directory: '/', + filename: 'index.html', + suffix: 'html', + hash: '', + search: '', + host: '[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80', + hostname: 'FEDC:BA98:7654:3210:FEDC:BA98:7654:3210' + }, + is: { + urn: false, + url: true, + relative: false, + name: false, + sld: false, + ip: true, + ip4: false, + ip6: true, + idn: false, + punycode: false + } + }, { + name: 'IPv6 brackets, file.ext', + url: 'http://[1080:0:0:0:8:800:200C:417A]/index.html', + parts: { + protocol: 'http', + username: null, + password: null, + hostname: '1080:0:0:0:8:800:200C:417A', + port: null, + path: '/index.html', + query: null, + fragment: null + }, + accessors: { + protocol: 'http', + username: '', + password: '', + port: '', + path: '/index.html', + query: '', + fragment: '', + resource: '/index.html', + authority: '[1080:0:0:0:8:800:200C:417A]', + origin: 'http://[1080:0:0:0:8:800:200C:417A]', + userinfo: '', + subdomain: '', + domain: '', + tld: '', + directory: '/', + filename: 'index.html', + suffix: 'html', + hash: '', + search: '', + host: '[1080:0:0:0:8:800:200C:417A]', + hostname: '1080:0:0:0:8:800:200C:417A' + }, + is: { + urn: false, + url: true, + relative: false, + name: false, + sld: false, + ip: true, + ip4: false, + ip6: true, + idn: false, + punycode: false + } + }, { + name: 'IPv6 brackets ::1', + url: 'http://[3ffe:2a00:100:7031::1]', + _url: 'http://[3ffe:2a00:100:7031::1]/', + parts: { + protocol: 'http', + username: null, + password: null, + hostname: '3ffe:2a00:100:7031::1', + port: null, + path: '/', + query: null, + fragment: null + }, + accessors: { + protocol: 'http', + username: '', + password: '', + port: '', + path: '/', + query: '', + fragment: '', + resource: '/', + authority: '[3ffe:2a00:100:7031::1]', + origin: 'http://[3ffe:2a00:100:7031::1]', + userinfo: '', + subdomain: '', + domain: '', + tld: '', + directory: '/', + filename: '', + suffix: '', + hash: '', + search: '', + host: '[3ffe:2a00:100:7031::1]', + hostname: '3ffe:2a00:100:7031::1' + }, + is: { + urn: false, + url: true, + relative: false, + name: false, + sld: false, + ip: true, + ip4: false, + ip6: true, + idn: false, + punycode: false + } + }, { + name: 'IPv6 brackets, file', + url: 'http://[1080::8:800:200C:417A]/foo', + parts: { + protocol: 'http', + username: null, + password: null, + hostname: '1080::8:800:200C:417A', + port: null, + path: '/foo', + query: null, + fragment: null + }, + accessors: { + protocol: 'http', + username: '', + password: '', + port: '', + path: '/foo', + query: '', + fragment: '', + resource: '/foo', + authority: '[1080::8:800:200C:417A]', + origin: 'http://[1080::8:800:200C:417A]', + userinfo: '', + subdomain: '', + domain: '', + tld: '', + directory: '/', + filename: 'foo', + suffix: '', + hash: '', + search: '', + host: '[1080::8:800:200C:417A]', + hostname: '1080::8:800:200C:417A' + }, + is: { + urn: false, + url: true, + relative: false, + name: false, + sld: false, + ip: true, + ip4: false, + ip6: true, + idn: false, + punycode: false + } + }, { + name: 'IPv6 IPv4 brackets, path', + url: 'http://[::192.9.5.5]/ipng', + parts: { + protocol: 'http', + username: null, + password: null, + hostname: '::192.9.5.5', + port: null, + path: '/ipng', + query: null, + fragment: null + }, + accessors: { + protocol: 'http', + username: '', + password: '', + port: '', + path: '/ipng', + query: '', + fragment: '', + resource: '/ipng', + authority: '[::192.9.5.5]', + origin: 'http://[::192.9.5.5]', + userinfo: '', + subdomain: '', + domain: '', + tld: '', + directory: '/', + filename: 'ipng', + suffix: '', + hash: '', + search: '', + host: '[::192.9.5.5]', + hostname: '::192.9.5.5' + }, + is: { + urn: false, + url: true, + relative: false, + name: false, + sld: false, + ip: true, + ip4: false, + ip6: true, + idn: false, + punycode: false + } + }, { + name: 'IPv6 mask IPv4 brackets, port, file.ext', + url: 'http://[::FFFF:129.144.52.38]:80/index.html', + parts: { + protocol: 'http', + username: null, + password: null, + hostname: '::FFFF:129.144.52.38', + port: '80', + path: '/index.html', + query: null, + fragment: null + }, + accessors: { + protocol: 'http', + username: '', + password: '', + port: '80', + path: '/index.html', + query: '', + fragment: '', + resource: '/index.html', + authority: '[::FFFF:129.144.52.38]:80', + origin: 'http://[::FFFF:129.144.52.38]:80', + userinfo: '', + subdomain: '', + domain: '', + tld: '', + directory: '/', + filename: 'index.html', + suffix: 'html', + hash: '', + search: '', + host: '[::FFFF:129.144.52.38]:80', + hostname: '::FFFF:129.144.52.38' + }, + is: { + urn: false, + url: true, + relative: false, + name: false, + sld: false, + ip: true, + ip4: false, + ip6: true, + idn: false, + punycode: false + } + }, { + name: 'IPv6 brackets', + url: 'http://[2010:836B:4179::836B:4179]', + _url: 'http://[2010:836B:4179::836B:4179]/', + parts: { + protocol: 'http', + username: null, + password: null, + hostname: '2010:836B:4179::836B:4179', + port: null, + path: '/', + query: null, + fragment: null + }, + accessors: { + protocol: 'http', + username: '', + password: '', + port: '', + path: '/', + query: '', + fragment: '', + resource: '/', + authority: '[2010:836B:4179::836B:4179]', + origin: 'http://[2010:836B:4179::836B:4179]', + userinfo: '', + subdomain: '', + domain: '', + tld: '', + directory: '/', + filename: '', + suffix: '', + hash: '', + search: '', + host: '[2010:836B:4179::836B:4179]', + hostname: '2010:836B:4179::836B:4179' + }, + is: { + urn: false, + url: true, + relative: false, + name: false, + sld: false, + ip: true, + ip4: false, + ip6: true, + idn: false, + punycode: false + } + }, { + name: 'IDN (punycode)', + url: 'http://user:pass@xn--exmple-cua.org:123/some/directory/file.html?query=string#fragment', + parts: { + protocol: 'http', + username: 'user', + password: 'pass', + hostname: 'xn--exmple-cua.org', + port: '123', + path: '/some/directory/file.html', + query: 'query=string', + fragment: 'fragment' + }, + accessors: { + protocol: 'http', + username: 'user', + password: 'pass', + port: '123', + path: '/some/directory/file.html', + query: 'query=string', + fragment: 'fragment', + resource: '/some/directory/file.html?query=string#fragment', + authority: 'user:pass@xn--exmple-cua.org:123', + origin: 'http://user:pass@xn--exmple-cua.org:123', + userinfo: 'user:pass', + subdomain: '', + domain: 'xn--exmple-cua.org', + tld: 'org', + directory: '/some/directory', + filename: 'file.html', + suffix: 'html', + hash: '#fragment', + search: '?query=string', + host: 'xn--exmple-cua.org:123', + hostname: 'xn--exmple-cua.org' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: true + } + }, { + name: 'IDN', + url: 'http://user:pass@exämple.org:123/some/directory/file.html?query=string#fragment', + parts: { + protocol: 'http', + username: 'user', + password: 'pass', + hostname: 'exämple.org', + port: '123', + path: '/some/directory/file.html', + query: 'query=string', + fragment: 'fragment' + }, + accessors: { + protocol: 'http', + username: 'user', + password: 'pass', + port: '123', + path: '/some/directory/file.html', + query: 'query=string', + fragment: 'fragment', + resource: '/some/directory/file.html?query=string#fragment', + authority: 'user:pass@exämple.org:123', + origin: 'http://user:pass@exämple.org:123', + userinfo: 'user:pass', + subdomain: '', + domain: 'exämple.org', + tld: 'org', + directory: '/some/directory', + filename: 'file.html', + suffix: 'html', + hash: '#fragment', + search: '?query=string', + host: 'exämple.org:123', + hostname: 'exämple.org' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: true, + punycode: false + } + }, { + name: 'file://', + url: 'file:///foo/bar/baz.html', + parts: { + protocol: 'file', + username: null, + password: null, + hostname: null, + port: null, + path: '/foo/bar/baz.html', + query: null, + fragment: null + }, + accessors: { + protocol: 'file', + username: '', + password: '', + port: '', + path: '/foo/bar/baz.html', + query: '', + fragment: '', + resource: '/foo/bar/baz.html', + authority: '', + origin: '', + userinfo: '', + subdomain: '', + domain: '', + tld: '', + directory: '/foo/bar', + filename: 'baz.html', + suffix: 'html', + hash: '', + search: '', + host: '', + hostname: '' + }, + is: { + urn: false, + url: true, + relative: true, + name: false, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'file://example.org:123', + url: 'file://example.org:123/foo/bar/baz.html', + parts: { + protocol: 'file', + username: null, + password: null, + hostname: 'example.org', + port: '123', + path: '/foo/bar/baz.html', + query: null, + fragment: null + }, + accessors: { + protocol: 'file', + username: '', + password: '', + port: '123', + path: '/foo/bar/baz.html', + query: '', + fragment: '', + resource: '/foo/bar/baz.html', + authority: 'example.org:123', + origin: 'file://example.org:123', + userinfo: '', + subdomain: '', + domain: 'example.org', + tld: 'org', + directory: '/foo/bar', + filename: 'baz.html', + suffix: 'html', + hash: '', + search: '', + host: 'example.org:123', + hostname: 'example.org' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'file:// Windows-Drive-Letter', + url: 'file:///C:/WINDOWS/foo.txt', + parts: { + protocol: 'file', + username: null, + password: null, + hostname: null, + port: null, + path: '/C:/WINDOWS/foo.txt', + query: null, + fragment: null + }, + accessors: { + protocol: 'file', + username: '', + password: '', + port: '', + path: '/C:/WINDOWS/foo.txt', + query: '', + fragment: '', + resource: '/C:/WINDOWS/foo.txt', + authority: '', + origin: '', + userinfo: '', + subdomain: '', + domain: '', + tld: '', + directory: '/C:/WINDOWS', + filename: 'foo.txt', + suffix: 'txt', + hash: '', + search: '', + host: '', + hostname: '' + }, + is: { + urn: false, + url: true, + relative: true, + name: false, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'file://example.org/ Windows-Drive-Letter', + url: 'file://example.org/C:/WINDOWS/foo.txt', + parts: { + protocol: 'file', + username: null, + password: null, + hostname: 'example.org', + port: null, + path: '/C:/WINDOWS/foo.txt', + query: null, + fragment: null + }, + accessors: { + protocol: 'file', + username: '', + password: '', + port: '', + path: '/C:/WINDOWS/foo.txt', + query: '', + fragment: '', + resource: '/C:/WINDOWS/foo.txt', + authority: 'example.org', + origin: 'file://example.org', + userinfo: '', + subdomain: '', + domain: 'example.org', + tld: 'org', + directory: '/C:/WINDOWS', + filename: 'foo.txt', + suffix: 'txt', + hash: '', + search: '', + host: 'example.org', + hostname: 'example.org' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'file://localhost/ Windows-Drive-Letter with pipe', + url: 'file://localhost/C|/WINDOWS/foo.txt', + parts: { + protocol: 'file', + username: null, + password: null, + hostname: 'localhost', + port: null, + path: '/C|/WINDOWS/foo.txt', + query: null, + fragment: null + }, + accessors: { + protocol: 'file', + username: '', + password: '', + port: '', + path: '/C|/WINDOWS/foo.txt', + query: '', + fragment: '', + resource: '/C|/WINDOWS/foo.txt', + authority: 'localhost', + origin: 'file://localhost', + userinfo: '', + subdomain: '', + domain: 'localhost', + tld: 'localhost', + directory: '/C|/WINDOWS', + filename: 'foo.txt', + suffix: 'txt', + hash: '', + search: '', + host: 'localhost', + hostname: 'localhost' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'Path containing @', + url: 'http://www.example.org/@foobar', + parts: { + protocol: 'http', + username: null, + password: null, + hostname: 'www.example.org', + port: null, + path: '/@foobar', + query: null, + fragment: null + }, + accessors: { + protocol: 'http', + username: '', + password: '', + port: '', + path: '/@foobar', + query: '', + fragment: '', + resource: '/@foobar', + authority: 'www.example.org', + origin: 'http://www.example.org', + userinfo: '', + subdomain: 'www', + domain: 'example.org', + tld: 'org', + directory: '/', + filename: '@foobar', + suffix: '', + hash: '', // location.hash style + search: '', // location.search style + host: 'www.example.org', + hostname: 'www.example.org' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'mailto:', + url: 'mailto:hello@example.org?subject=hello', + _url: 'mailto:hello@example.org?subject=hello', + parts: { + protocol: 'mailto', + username: null, + password: null, + hostname: null, + port: null, + path: 'hello@example.org', + query: 'subject=hello', + fragment: null + }, + accessors: { + protocol: 'mailto', + username: '', + password: '', + port: '', + path: 'hello@example.org', + query: 'subject=hello', + fragment: '', + resource: 'hello@example.org?subject=hello', + authority: '', + origin: '', + userinfo: '', + subdomain: '', + domain: '', + tld: '', + directory: '', + filename: '', + suffix: '', + hash: '', + search: '?subject=hello', + host: '', + hostname: '' + }, + is: { + urn: true, + url: false, + relative: false, + name: false, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'magnet:', + url: 'magnet:?xt=urn:btih:f8c020dac7a083defda1769a1196a13facc38ef6&dn=Linux+64x+server+11.10+Pt+Pt&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.ccc.de%3A80', + _url: 'magnet:?xt=urn:btih:f8c020dac7a083defda1769a1196a13facc38ef6&dn=Linux+64x+server+11.10+Pt+Pt&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.ccc.de%3A80', + parts: { + protocol: 'magnet', + username: null, + password: null, + hostname: null, + port: null, + path: '', + query: 'xt=urn:btih:f8c020dac7a083defda1769a1196a13facc38ef6&dn=Linux+64x+server+11.10+Pt+Pt&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.ccc.de%3A80', + fragment: null + }, + accessors: { + protocol: 'magnet', + username: '', + password: '', + port: '', + path: '', + query: 'xt=urn:btih:f8c020dac7a083defda1769a1196a13facc38ef6&dn=Linux+64x+server+11.10+Pt+Pt&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.ccc.de%3A80', + fragment: '', + resource: '?xt=urn:btih:f8c020dac7a083defda1769a1196a13facc38ef6&dn=Linux+64x+server+11.10+Pt+Pt&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.ccc.de%3A80', + authority: '', + origin: '', + userinfo: '', + subdomain: '', + domain: '', + tld: '', + directory: '', + filename: '', + suffix: '', + hash: '', + search: '?xt=urn:btih:f8c020dac7a083defda1769a1196a13facc38ef6&dn=Linux+64x+server+11.10+Pt+Pt&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.ccc.de%3A80', + host: '', + hostname: '' + }, + is: { + urn: true, + url: false, + relative: false, + name: false, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'javascript:', + url: 'javascript:alert("hello world");', + _url: 'javascript:alert("hello world");', + parts: { + protocol: 'javascript', + username: null, + password: null, + hostname: null, + port: null, + path: 'alert("hello world");', + query: null, + fragment: null + }, + accessors: { + protocol: 'javascript', + username: '', + password: '', + port: '', + path: 'alert("hello world");', + query: '', + fragment: '', + resource: 'alert("hello world");', + authority: '', + origin: '', + userinfo: '', + subdomain: '', + domain: '', + tld: '', + directory: '', + filename: '', + suffix: '', + hash: '', + search: '', + host: '', + hostname: '' + }, + is: { + urn: true, + url: false, + relative: false, + name: false, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'colon in path', + url: 'http://en.wikipedia.org/wiki/Help:IPA', + _url: 'http://en.wikipedia.org/wiki/Help:IPA', + parts: { + protocol: 'http', + username: null, + password: null, + hostname: 'en.wikipedia.org', + port: null, + path: '/wiki/Help:IPA', + query: null, + fragment: null + }, + accessors: { + protocol: 'http', + username: '', + password: '', + port: '', + path: '/wiki/Help:IPA', + query: '', + fragment: '', + resource: '/wiki/Help:IPA', + authority: 'en.wikipedia.org', + origin: 'http://en.wikipedia.org', + userinfo: '', + subdomain: 'en', + domain: 'wikipedia.org', + tld: 'org', + directory: '/wiki', + filename: 'Help:IPA', + suffix: '', + hash: '', + search: '', + host: 'en.wikipedia.org', + hostname: 'en.wikipedia.org' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'colon in path without protocol', + url: '/wiki/Help:IPA', + _url: '/wiki/Help:IPA', + parts: { + protocol: null, + username: null, + password: null, + hostname: null, + port: null, + path: '/wiki/Help:IPA', + query: null, + fragment: null + }, + accessors: { + protocol: '', + username: '', + password: '', + port: '', + path: '/wiki/Help:IPA', + query: '', + fragment: '', + resource: '/wiki/Help:IPA', + authority: '', + origin: '', + userinfo: '', + subdomain: '', + domain: '', + tld: '', + directory: '/wiki', + filename: 'Help:IPA', + suffix: '', + hash: '', + search: '', + host: '', + hostname: '' + }, + is: { + urn: false, + url: true, + relative: true, + name: false, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'colon dash dash in path without protocol', + url: '/foo/xy://bar', + _url: '/foo/xy://bar', + parts: { + protocol: null, + username: null, + password: null, + hostname: null, + port: null, + path: '/foo/xy://bar', + query: null, + fragment: null + }, + accessors: { + protocol: '', + username: '', + password: '', + port: '', + path: '/foo/xy://bar', + query: '', + fragment: '', + resource: '/foo/xy://bar', + authority: '', + origin: '', + userinfo: '', + subdomain: '', + domain: '', + tld: '', + directory: '/foo/xy:/', // sanitized empty directory! + filename: 'bar', + suffix: '', + hash: '', + search: '', + host: '', + hostname: '' + }, + is: { + urn: false, + url: true, + relative: true, + name: false, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'colon in path', + url: 'http://www.example.org:8080/hello:world', + parts: { + protocol: 'http', + username: null, + password: null, + hostname: 'www.example.org', + port: '8080', + path: '/hello:world', + query: null, + fragment: null + }, + accessors: { + protocol: 'http', + username: '', + password: '', + port: '8080', + path: '/hello:world', + query: '', + fragment: '', + resource: '/hello:world', + authority: 'www.example.org:8080', + origin: 'http://www.example.org:8080', + userinfo: '', + subdomain: 'www', + domain: 'example.org', + tld: 'org', + directory: '/', + filename: 'hello:world', + suffix: '', + hash: '', // location.hash style + search: '', // location.search style + host: 'www.example.org:8080', + hostname: 'www.example.org' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + }, { + name: 'backslashes', + url: 'http://i.xss.com\\www.example.org/some/directory/file.html?query=string#fragment', + _url: 'http://i.xss.com/www.example.org/some/directory/file.html?query=string#fragment', + parts: { + protocol: 'http', + username: null, + password: null, + hostname: 'i.xss.com', + port: null, + path: '/www.example.org/some/directory/file.html', + query: 'query=string', + fragment: 'fragment' + }, + accessors: { + protocol: 'http', + username: '', + password: '', + port: '', + path: '/www.example.org/some/directory/file.html', + query: 'query=string', + fragment: 'fragment', + resource: '/www.example.org/some/directory/file.html?query=string#fragment', + authority: 'i.xss.com', + origin: 'http://i.xss.com', + userinfo: '', + subdomain: 'i', + domain: 'xss.com', + tld: 'com', + directory: '/www.example.org/some/directory', + filename: 'file.html', + suffix: 'html', + hash: '#fragment', + search: '?query=string', + host: 'i.xss.com', + hostname: 'i.xss.com' + }, + is: { + urn: false, + url: true, + relative: false, + name: true, + sld: false, + ip: false, + ip4: false, + ip6: false, + idn: false, + punycode: false + } + } +]; + |