| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- 'use strict'
- const test = require('tape')
- const fastURI = require('..')
- const HOST_ERROR = 'URI host is malformed.'
- const malformedLiterals = [
- '::not-valid',
- 'fc00::not-hex',
- 'fe80::not-hex',
- '1:2:3',
- '1:2:3:4:5:6:7',
- '1:2:3:4:5:6:7:8:9',
- '1::2::3',
- '1:::2',
- ':::1',
- '12345::',
- '1:2:3:4:5:6:7::8',
- '::ffff:192.0.2.999',
- '::ffff:192.0.2',
- '::ffff:192.168.001.1',
- '::192.0.2.1:1',
- '1:2:3:4:5:192.0.2.1::',
- 'v.foo',
- 'v1.',
- 'v1.foo%25bar',
- 'v1.K',
- 'fe80::1%25',
- 'fe80::1%25eth 0',
- 'fe80::1%25eth%ZZ',
- 'fe80::1%25K',
- 'not-an-ip'
- ]
- test('malformed bracketed IP literals fail without being rewritten', (t) => {
- for (const literal of malformedLiterals) {
- const uri = `http://[${literal}]/private`
- const parsed = fastURI.parse(uri)
- t.equal(parsed.error, HOST_ERROR, `parse rejects ${literal}`)
- t.equal(parsed.host, `[${literal.toLowerCase()}]`, `parse does not truncate ${literal}`)
- t.equal(fastURI.normalize(uri), uri, `normalize preserves ${literal}`)
- t.equal(fastURI.equal(uri, uri), false, `equal rejects ${literal}`)
- }
- t.end()
- })
- test('resolve throws for malformed bracketed IP literals', (t) => {
- for (const literal of malformedLiterals) {
- const uri = `http://[${literal}]/private`
- t.throws(
- () => fastURI.resolve(uri, 'child'),
- /URI host is malformed\./,
- `rejects malformed base ${literal}`
- )
- t.throws(
- () => fastURI.resolve('http://example.com/', uri),
- /URI host is malformed\./,
- `rejects malformed relative input ${literal}`
- )
- }
- t.end()
- })
- test('valid IPv6, IPvFuture, embedded IPv4, and zone forms normalize safely', (t) => {
- const cases = [
- ['http://[::]/', 'http://[::]/', '::'],
- ['http://[::1]/', 'http://[::1]/', '::1'],
- ['http://[1::]/', 'http://[1::]/', '1::'],
- ['http://[2001:0DB8::0001]/', 'http://[2001:db8::1]/', '2001:db8::1'],
- ['http://[0:0:0:0:0:0:0:0]/', 'http://[::]/', '::'],
- ['http://[::ffff:192.0.2.1]/', 'http://[::ffff:192.0.2.1]/', '::ffff:192.0.2.1'],
- ['http://[1:2:3:4:5:6:192.0.2.1]/', 'http://[1:2:3:4:5:6:192.0.2.1]/', '1:2:3:4:5:6:192.0.2.1'],
- ['http://[fe80::A%25EN1]/', 'http://[fe80::a%25EN1]/', 'fe80::a%EN1'],
- ['http://[fe80::a%en1]/', 'http://[fe80::a%25en1]/', 'fe80::a%en1'],
- ['http://[fe80::a%25eth%2D0]/', 'http://[fe80::a%25eth%2D0]/', 'fe80::a%eth%2D0'],
- ['http://[v1.example]/', 'http://[v1.example]/', '[v1.example]'],
- ['http://[vF.A:b]/', 'http://[vf.a:b]/', '[vf.a:b]']
- ]
- for (const [uri, normalized, host] of cases) {
- const parsed = fastURI.parse(uri)
- t.equal(parsed.error, undefined, `${uri} parses without error`)
- t.equal(parsed.host, host, `${uri} has the expected host`)
- t.equal(fastURI.normalize(uri), normalized, `${uri} normalizes safely`)
- }
- t.end()
- })
|