deno.land / std@0.166.0 / node / _tools / test / parallel / test-url-parse-format.js
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054// deno-fmt-ignore-file// deno-lint-ignore-file
// Copyright Joyent and Node contributors. All rights reserved. MIT license.// Taken from Node 18.12.0// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually
'use strict';const common = require('../common');
if (!common.hasIntl) common.skip('missing Intl');
const assert = require('assert');const inspect = require('util').inspect;
const url = require('url');
// URLs to parse, and expected data// { url : parsed }const parseTests = { '//some_path': { href: '//some_path', pathname: '//some_path', path: '//some_path' },
'http:\\\\evil-phisher\\foo.html#h\\a\\s\\h': { protocol: 'http:', slashes: true, host: 'evil-phisher', hostname: 'evil-phisher', pathname: '/foo.html', path: '/foo.html', hash: '#h%5Ca%5Cs%5Ch', href: 'http://evil-phisher/foo.html#h%5Ca%5Cs%5Ch' },
'http:\\\\evil-phisher\\foo.html?json="\\"foo\\""#h\\a\\s\\h': { protocol: 'http:', slashes: true, host: 'evil-phisher', hostname: 'evil-phisher', pathname: '/foo.html', search: '?json=%22%5C%22foo%5C%22%22', query: 'json=%22%5C%22foo%5C%22%22', path: '/foo.html?json=%22%5C%22foo%5C%22%22', hash: '#h%5Ca%5Cs%5Ch', href: 'http://evil-phisher/foo.html?json=%22%5C%22foo%5C%22%22#h%5Ca%5Cs%5Ch' },
'http:\\\\evil-phisher\\foo.html#h\\a\\s\\h?blarg': { protocol: 'http:', slashes: true, host: 'evil-phisher', hostname: 'evil-phisher', pathname: '/foo.html', path: '/foo.html', hash: '#h%5Ca%5Cs%5Ch?blarg', href: 'http://evil-phisher/foo.html#h%5Ca%5Cs%5Ch?blarg' },
'http:\\\\evil-phisher\\foo.html': { protocol: 'http:', slashes: true, host: 'evil-phisher', hostname: 'evil-phisher', pathname: '/foo.html', path: '/foo.html', href: 'http://evil-phisher/foo.html' },
'HTTP://www.example.com/': { href: 'http://www.example.com/', protocol: 'http:', slashes: true, host: 'www.example.com', hostname: 'www.example.com', pathname: '/', path: '/' },
'HTTP://www.example.com': { href: 'http://www.example.com/', protocol: 'http:', slashes: true, host: 'www.example.com', hostname: 'www.example.com', pathname: '/', path: '/' },
'http://www.ExAmPlE.com/': { href: 'http://www.example.com/', protocol: 'http:', slashes: true, host: 'www.example.com', hostname: 'www.example.com', pathname: '/', path: '/' },
'http://user:pw@www.ExAmPlE.com/': { href: 'http://user:pw@www.example.com/', protocol: 'http:', slashes: true, auth: 'user:pw', host: 'www.example.com', hostname: 'www.example.com', pathname: '/', path: '/' },
'http://USER:PW@www.ExAmPlE.com/': { href: 'http://USER:PW@www.example.com/', protocol: 'http:', slashes: true, auth: 'USER:PW', host: 'www.example.com', hostname: 'www.example.com', pathname: '/', path: '/' },
'http://user@www.example.com/': { href: 'http://user@www.example.com/', protocol: 'http:', slashes: true, auth: 'user', host: 'www.example.com', hostname: 'www.example.com', pathname: '/', path: '/' },
'http://user%3Apw@www.example.com/': { href: 'http://user:pw@www.example.com/', protocol: 'http:', slashes: true, auth: 'user:pw', host: 'www.example.com', hostname: 'www.example.com', pathname: '/', path: '/' },
'http://x.com/path?that\'s#all, folks': { href: 'http://x.com/path?that%27s#all,%20folks', protocol: 'http:', slashes: true, host: 'x.com', hostname: 'x.com', search: '?that%27s', query: 'that%27s', pathname: '/path', hash: '#all,%20folks', path: '/path?that%27s' },
'HTTP://X.COM/Y': { href: 'http://x.com/Y', protocol: 'http:', slashes: true, host: 'x.com', hostname: 'x.com', pathname: '/Y', path: '/Y' },
// Whitespace in the front ' http://www.example.com/': { href: 'http://www.example.com/', protocol: 'http:', slashes: true, host: 'www.example.com', hostname: 'www.example.com', pathname: '/', path: '/' },
// + not an invalid host character // per https://url.spec.whatwg.org/#host-parsing 'http://x.y.com+a/b/c': { href: 'http://x.y.com+a/b/c', protocol: 'http:', slashes: true, host: 'x.y.com+a', hostname: 'x.y.com+a', pathname: '/b/c', path: '/b/c' },
// An unexpected invalid char in the hostname. 'HtTp://x.y.cOm;a/b/c?d=e#f g<h>i': { href: 'http://x.y.com/;a/b/c?d=e#f%20g%3Ch%3Ei', protocol: 'http:', slashes: true, host: 'x.y.com', hostname: 'x.y.com', pathname: ';a/b/c', search: '?d=e', query: 'd=e', hash: '#f%20g%3Ch%3Ei', path: ';a/b/c?d=e' },
// Make sure that we don't accidentally lcast the path parts. 'HtTp://x.y.cOm;A/b/c?d=e#f g<h>i': { href: 'http://x.y.com/;A/b/c?d=e#f%20g%3Ch%3Ei', protocol: 'http:', slashes: true, host: 'x.y.com', hostname: 'x.y.com', pathname: ';A/b/c', search: '?d=e', query: 'd=e', hash: '#f%20g%3Ch%3Ei', path: ';A/b/c?d=e' },
'http://x...y...#p': { href: 'http://x...y.../#p', protocol: 'http:', slashes: true, host: 'x...y...', hostname: 'x...y...', hash: '#p', pathname: '/', path: '/' },
'http://x/p/"quoted"': { href: 'http://x/p/%22quoted%22', protocol: 'http:', slashes: true, host: 'x', hostname: 'x', pathname: '/p/%22quoted%22', path: '/p/%22quoted%22' },
'<http://goo.corn/bread> Is a URL!': { href: '%3Chttp://goo.corn/bread%3E%20Is%20a%20URL!', pathname: '%3Chttp://goo.corn/bread%3E%20Is%20a%20URL!', path: '%3Chttp://goo.corn/bread%3E%20Is%20a%20URL!' },
'http://www.narwhaljs.org/blog/categories?id=news': { href: 'http://www.narwhaljs.org/blog/categories?id=news', protocol: 'http:', slashes: true, host: 'www.narwhaljs.org', hostname: 'www.narwhaljs.org', search: '?id=news', query: 'id=news', pathname: '/blog/categories', path: '/blog/categories?id=news' },
'http://mt0.google.com/vt/lyrs=m@114&hl=en&src=api&x=2&y=2&z=3&s=': { href: 'http://mt0.google.com/vt/lyrs=m@114&hl=en&src=api&x=2&y=2&z=3&s=', protocol: 'http:', slashes: true, host: 'mt0.google.com', hostname: 'mt0.google.com', pathname: '/vt/lyrs=m@114&hl=en&src=api&x=2&y=2&z=3&s=', path: '/vt/lyrs=m@114&hl=en&src=api&x=2&y=2&z=3&s=' },
'http://mt0.google.com/vt/lyrs=m@114???&hl=en&src=api&x=2&y=2&z=3&s=': { href: 'http://mt0.google.com/vt/lyrs=m@114???&hl=en&src=api' + '&x=2&y=2&z=3&s=', protocol: 'http:', slashes: true, host: 'mt0.google.com', hostname: 'mt0.google.com', search: '???&hl=en&src=api&x=2&y=2&z=3&s=', query: '??&hl=en&src=api&x=2&y=2&z=3&s=', pathname: '/vt/lyrs=m@114', path: '/vt/lyrs=m@114???&hl=en&src=api&x=2&y=2&z=3&s=' },
'http://user:pass@mt0.google.com/vt/lyrs=m@114???&hl=en&src=api&x=2&y=2&z=3&s=': { href: 'http://user:pass@mt0.google.com/vt/lyrs=m@114???&hl=en&src=api&x=2&y=2&z=3&s=', protocol: 'http:', slashes: true, host: 'mt0.google.com', auth: 'user:pass', hostname: 'mt0.google.com', search: '???&hl=en&src=api&x=2&y=2&z=3&s=', query: '??&hl=en&src=api&x=2&y=2&z=3&s=', pathname: '/vt/lyrs=m@114', path: '/vt/lyrs=m@114???&hl=en&src=api&x=2&y=2&z=3&s=' },
'file:///etc/passwd': { href: 'file:///etc/passwd', slashes: true, protocol: 'file:', pathname: '/etc/passwd', hostname: '', host: '', path: '/etc/passwd' },
'file://localhost/etc/passwd': { href: 'file://localhost/etc/passwd', protocol: 'file:', slashes: true, pathname: '/etc/passwd', hostname: 'localhost', host: 'localhost', path: '/etc/passwd' },
'file://foo/etc/passwd': { href: 'file://foo/etc/passwd', protocol: 'file:', slashes: true, pathname: '/etc/passwd', hostname: 'foo', host: 'foo', path: '/etc/passwd' },
'file:///etc/node/': { href: 'file:///etc/node/', slashes: true, protocol: 'file:', pathname: '/etc/node/', hostname: '', host: '', path: '/etc/node/' },
'file://localhost/etc/node/': { href: 'file://localhost/etc/node/', protocol: 'file:', slashes: true, pathname: '/etc/node/', hostname: 'localhost', host: 'localhost', path: '/etc/node/' },
'file://foo/etc/node/': { href: 'file://foo/etc/node/', protocol: 'file:', slashes: true, pathname: '/etc/node/', hostname: 'foo', host: 'foo', path: '/etc/node/' },
'http:/baz/../foo/bar': { href: 'http:/baz/../foo/bar', protocol: 'http:', pathname: '/baz/../foo/bar', path: '/baz/../foo/bar' },
'http://user:pass@example.com:8000/foo/bar?baz=quux#frag': { href: 'http://user:pass@example.com:8000/foo/bar?baz=quux#frag', protocol: 'http:', slashes: true, host: 'example.com:8000', auth: 'user:pass', port: '8000', hostname: 'example.com', hash: '#frag', search: '?baz=quux', query: 'baz=quux', pathname: '/foo/bar', path: '/foo/bar?baz=quux' },
'//user:pass@example.com:8000/foo/bar?baz=quux#frag': { href: '//user:pass@example.com:8000/foo/bar?baz=quux#frag', slashes: true, host: 'example.com:8000', auth: 'user:pass', port: '8000', hostname: 'example.com', hash: '#frag', search: '?baz=quux', query: 'baz=quux', pathname: '/foo/bar', path: '/foo/bar?baz=quux' },
'/foo/bar?baz=quux#frag': { href: '/foo/bar?baz=quux#frag', hash: '#frag', search: '?baz=quux', query: 'baz=quux', pathname: '/foo/bar', path: '/foo/bar?baz=quux' },
'http:/foo/bar?baz=quux#frag': { href: 'http:/foo/bar?baz=quux#frag', protocol: 'http:', hash: '#frag', search: '?baz=quux', query: 'baz=quux', pathname: '/foo/bar', path: '/foo/bar?baz=quux' },
'mailto:foo@bar.com?subject=hello': { href: 'mailto:foo@bar.com?subject=hello', protocol: 'mailto:', host: 'bar.com', auth: 'foo', hostname: 'bar.com', search: '?subject=hello', query: 'subject=hello', path: '?subject=hello' },
'javascript:alert(\'hello\');': { href: 'javascript:alert(\'hello\');', protocol: 'javascript:', pathname: 'alert(\'hello\');', path: 'alert(\'hello\');' },
'xmpp:isaacschlueter@jabber.org': { href: 'xmpp:isaacschlueter@jabber.org', protocol: 'xmpp:', host: 'jabber.org', auth: 'isaacschlueter', hostname: 'jabber.org' },
'http://atpass:foo%40bar@127.0.0.1:8080/path?search=foo#bar': { href: 'http://atpass:foo%40bar@127.0.0.1:8080/path?search=foo#bar', protocol: 'http:', slashes: true, host: '127.0.0.1:8080', auth: 'atpass:foo@bar', hostname: '127.0.0.1', port: '8080', pathname: '/path', search: '?search=foo', query: 'search=foo', hash: '#bar', path: '/path?search=foo' },
'svn+ssh://foo/bar': { href: 'svn+ssh://foo/bar', host: 'foo', hostname: 'foo', protocol: 'svn+ssh:', pathname: '/bar', path: '/bar', slashes: true },
'dash-test://foo/bar': { href: 'dash-test://foo/bar', host: 'foo', hostname: 'foo', protocol: 'dash-test:', pathname: '/bar', path: '/bar', slashes: true },
'dash-test:foo/bar': { href: 'dash-test:foo/bar', host: 'foo', hostname: 'foo', protocol: 'dash-test:', pathname: '/bar', path: '/bar' },
'dot.test://foo/bar': { href: 'dot.test://foo/bar', host: 'foo', hostname: 'foo', protocol: 'dot.test:', pathname: '/bar', path: '/bar', slashes: true },
'dot.test:foo/bar': { href: 'dot.test:foo/bar', host: 'foo', hostname: 'foo', protocol: 'dot.test:', pathname: '/bar', path: '/bar' },
// IDNA tests 'http://www.日本語.com/': { href: 'http://www.xn--wgv71a119e.com/', protocol: 'http:', slashes: true, host: 'www.xn--wgv71a119e.com', hostname: 'www.xn--wgv71a119e.com', pathname: '/', path: '/' },
'http://example.Bücher.com/': { href: 'http://example.xn--bcher-kva.com/', protocol: 'http:', slashes: true, host: 'example.xn--bcher-kva.com', hostname: 'example.xn--bcher-kva.com', pathname: '/', path: '/' },
'http://www.Äffchen.com/': { href: 'http://www.xn--ffchen-9ta.com/', protocol: 'http:', slashes: true, host: 'www.xn--ffchen-9ta.com', hostname: 'www.xn--ffchen-9ta.com', pathname: '/', path: '/' },
'http://www.Äffchen.cOm;A/b/c?d=e#f g<h>i': { href: 'http://www.xn--ffchen-9ta.com/;A/b/c?d=e#f%20g%3Ch%3Ei', protocol: 'http:', slashes: true, host: 'www.xn--ffchen-9ta.com', hostname: 'www.xn--ffchen-9ta.com', pathname: ';A/b/c', search: '?d=e', query: 'd=e', hash: '#f%20g%3Ch%3Ei', path: ';A/b/c?d=e' },
'http://SÉLIER.COM/': { href: 'http://xn--slier-bsa.com/', protocol: 'http:', slashes: true, host: 'xn--slier-bsa.com', hostname: 'xn--slier-bsa.com', pathname: '/', path: '/' },
'http://ليهمابتكلموشعربي؟.ي؟/': { href: 'http://xn--egbpdaj6bu4bxfgehfvwxn.xn--egb9f/', protocol: 'http:', slashes: true, host: 'xn--egbpdaj6bu4bxfgehfvwxn.xn--egb9f', hostname: 'xn--egbpdaj6bu4bxfgehfvwxn.xn--egb9f', pathname: '/', path: '/' },
'http://➡.ws/➡': { href: 'http://xn--hgi.ws/➡', protocol: 'http:', slashes: true, host: 'xn--hgi.ws', hostname: 'xn--hgi.ws', pathname: '/➡', path: '/➡' },
'http://bucket_name.s3.amazonaws.com/image.jpg': { protocol: 'http:', slashes: true, host: 'bucket_name.s3.amazonaws.com', hostname: 'bucket_name.s3.amazonaws.com', pathname: '/image.jpg', href: 'http://bucket_name.s3.amazonaws.com/image.jpg', path: '/image.jpg' },
'git+http://github.com/joyent/node.git': { protocol: 'git+http:', slashes: true, host: 'github.com', hostname: 'github.com', pathname: '/joyent/node.git', path: '/joyent/node.git', href: 'git+http://github.com/joyent/node.git' },
// If local1@domain1 is uses as a relative URL it may // be parse into auth@hostname, but here there is no // way to make it work in url.parse, I add the test to be explicit 'local1@domain1': { pathname: 'local1@domain1', path: 'local1@domain1', href: 'local1@domain1' },
// While this may seem counter-intuitive, a browser will parse // <a href='www.google.com'> as a path. 'www.example.com': { href: 'www.example.com', pathname: 'www.example.com', path: 'www.example.com' },
// ipv6 support '[fe80::1]': { href: '[fe80::1]', pathname: '[fe80::1]', path: '[fe80::1]' },
'coap://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]': { protocol: 'coap:', slashes: true, host: '[fedc:ba98:7654:3210:fedc:ba98:7654:3210]', hostname: 'fedc:ba98:7654:3210:fedc:ba98:7654:3210', href: 'coap://[fedc:ba98:7654:3210:fedc:ba98:7654:3210]/', pathname: '/', path: '/' },
'coap://[1080:0:0:0:8:800:200C:417A]:61616/': { protocol: 'coap:', slashes: true, host: '[1080:0:0:0:8:800:200c:417a]:61616', port: '61616', hostname: '1080:0:0:0:8:800:200c:417a', href: 'coap://[1080:0:0:0:8:800:200c:417a]:61616/', pathname: '/', path: '/' },
'http://user:password@[3ffe:2a00:100:7031::1]:8080': { protocol: 'http:', slashes: true, auth: 'user:password', host: '[3ffe:2a00:100:7031::1]:8080', port: '8080', hostname: '3ffe:2a00:100:7031::1', href: 'http://user:password@[3ffe:2a00:100:7031::1]:8080/', pathname: '/', path: '/' },
'coap://u:p@[::192.9.5.5]:61616/.well-known/r?n=Temperature': { protocol: 'coap:', slashes: true, auth: 'u:p', host: '[::192.9.5.5]:61616', port: '61616', hostname: '::192.9.5.5', href: 'coap://u:p@[::192.9.5.5]:61616/.well-known/r?n=Temperature', search: '?n=Temperature', query: 'n=Temperature', pathname: '/.well-known/r', path: '/.well-known/r?n=Temperature' },
// empty port 'http://example.com:': { protocol: 'http:', slashes: true, host: 'example.com', hostname: 'example.com', href: 'http://example.com/', pathname: '/', path: '/' },
'http://example.com:/a/b.html': { protocol: 'http:', slashes: true, host: 'example.com', hostname: 'example.com', href: 'http://example.com/a/b.html', pathname: '/a/b.html', path: '/a/b.html' },
'http://example.com:?a=b': { protocol: 'http:', slashes: true, host: 'example.com', hostname: 'example.com', href: 'http://example.com/?a=b', search: '?a=b', query: 'a=b', pathname: '/', path: '/?a=b' },
'http://example.com:#abc': { protocol: 'http:', slashes: true, host: 'example.com', hostname: 'example.com', href: 'http://example.com/#abc', hash: '#abc', pathname: '/', path: '/' },
'http://[fe80::1]:/a/b?a=b#abc': { protocol: 'http:', slashes: true, host: '[fe80::1]', hostname: 'fe80::1', href: 'http://[fe80::1]/a/b?a=b#abc', search: '?a=b', query: 'a=b', hash: '#abc', pathname: '/a/b', path: '/a/b?a=b' },
'http://-lovemonsterz.tumblr.com/rss': { protocol: 'http:', slashes: true, host: '-lovemonsterz.tumblr.com', hostname: '-lovemonsterz.tumblr.com', href: 'http://-lovemonsterz.tumblr.com/rss', pathname: '/rss', path: '/rss', },
'http://-lovemonsterz.tumblr.com:80/rss': { protocol: 'http:', slashes: true, port: '80', host: '-lovemonsterz.tumblr.com:80', hostname: '-lovemonsterz.tumblr.com', href: 'http://-lovemonsterz.tumblr.com:80/rss', pathname: '/rss', path: '/rss', },
'http://user:pass@-lovemonsterz.tumblr.com/rss': { protocol: 'http:', slashes: true, auth: 'user:pass', host: '-lovemonsterz.tumblr.com', hostname: '-lovemonsterz.tumblr.com', href: 'http://user:pass@-lovemonsterz.tumblr.com/rss', pathname: '/rss', path: '/rss', },
'http://user:pass@-lovemonsterz.tumblr.com:80/rss': { protocol: 'http:', slashes: true, auth: 'user:pass', port: '80', host: '-lovemonsterz.tumblr.com:80', hostname: '-lovemonsterz.tumblr.com', href: 'http://user:pass@-lovemonsterz.tumblr.com:80/rss', pathname: '/rss', path: '/rss', },
'http://_jabber._tcp.google.com/test': { protocol: 'http:', slashes: true, host: '_jabber._tcp.google.com', hostname: '_jabber._tcp.google.com', href: 'http://_jabber._tcp.google.com/test', pathname: '/test', path: '/test', },
'http://user:pass@_jabber._tcp.google.com/test': { protocol: 'http:', slashes: true, auth: 'user:pass', host: '_jabber._tcp.google.com', hostname: '_jabber._tcp.google.com', href: 'http://user:pass@_jabber._tcp.google.com/test', pathname: '/test', path: '/test', },
'http://_jabber._tcp.google.com:80/test': { protocol: 'http:', slashes: true, port: '80', host: '_jabber._tcp.google.com:80', hostname: '_jabber._tcp.google.com', href: 'http://_jabber._tcp.google.com:80/test', pathname: '/test', path: '/test', },
'http://user:pass@_jabber._tcp.google.com:80/test': { protocol: 'http:', slashes: true, auth: 'user:pass', port: '80', host: '_jabber._tcp.google.com:80', hostname: '_jabber._tcp.google.com', href: 'http://user:pass@_jabber._tcp.google.com:80/test', pathname: '/test', path: '/test', },
'http://x:1/\' <>"`/{}|\\^~`/': { protocol: 'http:', slashes: true, host: 'x:1', port: '1', hostname: 'x', pathname: '/%27%20%3C%3E%22%60/%7B%7D%7C/%5E~%60/', path: '/%27%20%3C%3E%22%60/%7B%7D%7C/%5E~%60/', href: 'http://x:1/%27%20%3C%3E%22%60/%7B%7D%7C/%5E~%60/' },
'http://a@b@c/': { protocol: 'http:', slashes: true, auth: 'a@b', host: 'c', hostname: 'c', href: 'http://a%40b@c/', path: '/', pathname: '/' },
'http://a@b?@c': { protocol: 'http:', slashes: true, auth: 'a', host: 'b', hostname: 'b', href: 'http://a@b/?@c', path: '/?@c', pathname: '/', search: '?@c', query: '@c' },
'http://a.b/\tbc\ndr\ref g"hq\'j<kl>?mn\\op^q=r`99{st|uv}wz': { protocol: 'http:', slashes: true, host: 'a.b', port: null, hostname: 'a.b', hash: null, pathname: '/%09bc%0Adr%0Def%20g%22hq%27j%3Ckl%3E', path: '/%09bc%0Adr%0Def%20g%22hq%27j%3Ckl%3E?mn%5Cop%5Eq=r%6099%7Bst%7Cuv%7Dwz', search: '?mn%5Cop%5Eq=r%6099%7Bst%7Cuv%7Dwz', query: 'mn%5Cop%5Eq=r%6099%7Bst%7Cuv%7Dwz', href: 'http://a.b/%09bc%0Adr%0Def%20g%22hq%27j%3Ckl%3E?mn%5Cop%5Eq=r%6099%7Bst%7Cuv%7Dwz' },
'http://a\r" \t\n<\'b:b@c\r\nd/e?f': { protocol: 'http:', slashes: true, auth: 'a\r" \t\n<\'b:b', host: 'c', port: null, hostname: 'c', hash: null, search: '?f', query: 'f', pathname: '%0D%0Ad/e', path: '%0D%0Ad/e?f', href: 'http://a%0D%22%20%09%0A%3C\'b:b@c/%0D%0Ad/e?f' },
// Git urls used by npm 'git+ssh://git@github.com:npm/npm': { protocol: 'git+ssh:', slashes: true, auth: 'git', host: 'github.com', port: null, hostname: 'github.com', hash: null, search: null, query: null, pathname: '/:npm/npm', path: '/:npm/npm', href: 'git+ssh://git@github.com/:npm/npm' },
'https://*': { protocol: 'https:', slashes: true, auth: null, host: '', port: null, hostname: '', hash: null, search: null, query: null, pathname: '/*', path: '/*', href: 'https:///*' },
// The following two URLs are the same, but they differ for a capital A. // Verify that the protocol is checked in a case-insensitive manner. 'javascript:alert(1);a=\x27@white-listed.com\x27': { protocol: 'javascript:', slashes: null, auth: null, host: null, port: null, hostname: null, hash: null, search: null, query: null, pathname: "alert(1);a='@white-listed.com'", path: "alert(1);a='@white-listed.com'", href: "javascript:alert(1);a='@white-listed.com'" },
'javAscript:alert(1);a=\x27@white-listed.com\x27': { protocol: 'javascript:', slashes: null, auth: null, host: null, port: null, hostname: null, hash: null, search: null, query: null, pathname: "alert(1);a='@white-listed.com'", path: "alert(1);a='@white-listed.com'", href: "javascript:alert(1);a='@white-listed.com'" },
'ws://www.example.com': { protocol: 'ws:', slashes: true, hostname: 'www.example.com', host: 'www.example.com', pathname: '/', path: '/', href: 'ws://www.example.com/' },
'wss://www.example.com': { protocol: 'wss:', slashes: true, hostname: 'www.example.com', host: 'www.example.com', pathname: '/', path: '/', href: 'wss://www.example.com/' },
'//fhqwhgads@example.com/everybody-to-the-limit': { protocol: null, slashes: true, auth: 'fhqwhgads', host: 'example.com', port: null, hostname: 'example.com', hash: null, search: null, query: null, pathname: '/everybody-to-the-limit', path: '/everybody-to-the-limit', href: '//fhqwhgads@example.com/everybody-to-the-limit' },
'//fhqwhgads@example.com/everybody#to-the-limit': { protocol: null, slashes: true, auth: 'fhqwhgads', host: 'example.com', port: null, hostname: 'example.com', hash: '#to-the-limit', search: null, query: null, pathname: '/everybody', path: '/everybody', href: '//fhqwhgads@example.com/everybody#to-the-limit' },
'\bhttp://example.com/\b': { protocol: 'http:', slashes: true, auth: null, host: 'example.com', port: null, hostname: 'example.com', hash: null, search: null, query: null, pathname: '/', path: '/', href: 'http://example.com/' }};
for (const u in parseTests) { let actual = url.parse(u); const spaced = url.parse(` \t ${u}\n\t`); let expected = Object.assign(new url.Url(), parseTests[u]);
Object.keys(actual).forEach(function(i) { if (expected[i] === undefined && actual[i] === null) { expected[i] = null; } });
assert.deepStrictEqual( actual, expected, `expected ${inspect(expected)}, got ${inspect(actual)}` ); assert.deepStrictEqual( spaced, expected, `expected ${inspect(expected)}, got ${inspect(spaced)}` );
expected = parseTests[u].href; actual = url.format(parseTests[u]);
assert.strictEqual(actual, expected, `format(${u}) == ${u}\nactual:${actual}`);}
{ const parsed = url.parse('http://nodejs.org/') .resolveObject('jAvascript:alert(1);a=\x27@white-listed.com\x27');
const expected = Object.assign(new url.Url(), { protocol: 'javascript:', slashes: null, auth: null, host: null, port: null, hostname: null, hash: null, search: null, query: null, pathname: "alert(1);a='@white-listed.com'", path: "alert(1);a='@white-listed.com'", href: "javascript:alert(1);a='@white-listed.com'" });
assert.deepStrictEqual(parsed, expected);}
Version Info