diff --git a/lib/utils.js b/lib/utils.js index 78134c6..f7524ce 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -4,7 +4,7 @@ const { HEX } = require('./scopedChars') function normalizeIPv4 (host) { if (findToken(host, '.') < 3) { return { host, isIPV4: false } } - const matches = host.match(/^(\b[01]?\d{1,2}|\b2[0-4]\d|\b25[0-5])(\.([01]?\d{1,2}|2[0-4]\d|25[0-5])){3}$/u) || [] + const matches = host.match(/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/u) || [] const [address] = matches if (address) { return { host: stripLeadingZeros(address, '.'), isIPV4: true } diff --git a/test/compatibility.test.js b/test/compatibility.test.js index 73bc65a..0a57b89 100644 --- a/test/compatibility.test.js +++ b/test/compatibility.test.js @@ -10,7 +10,7 @@ test('compatibility Parse', (t) => { '//www.g.com/error\n/bleh/bleh', 'https://fastify.org', '//10.10.10.10', - '//10.10.000.10', + // '//10.10.000.10', <-- not a valid URI per URI spec: https://datatracker.ietf.org/doc/html/rfc5954#section-4.1 '//[2001:db8::7%en0]', '//[2001:dbZ::1]:80', '//[2001:db8::1]:80', diff --git a/test/parse.test.js b/test/parse.test.js index 2fe2133..fe7c44e 100644 --- a/test/parse.test.js +++ b/test/parse.test.js @@ -174,12 +174,21 @@ test('URI parse', (t) => { t.equal(components.query, undefined, 'query') t.equal(components.fragment, undefined, 'fragment') - // IPv4address with unformated 0 - components = URI.parse('//10.10.000.10') + // IPv4address with unformated 0 stay as-is + components = URI.parse('//10.10.000.10') // not valid as per https://datatracker.ietf.org/doc/html/rfc5954#section-4.1 t.equal(components.error, undefined, 'IPv4address errors') t.equal(components.scheme, undefined, 'scheme') t.equal(components.userinfo, undefined, 'userinfo') - t.equal(components.host, '10.10.0.10', 'host') + t.equal(components.host, '10.10.000.10', 'host') + t.equal(components.port, undefined, 'port') + t.equal(components.path, '', 'path') + t.equal(components.query, undefined, 'query') + t.equal(components.fragment, undefined, 'fragment') + components = URI.parse('//01.01.01.01') // not valid in URIs: https://datatracker.ietf.org/doc/html/rfc3986#section-7.4 + t.equal(components.error, undefined, 'IPv4address errors') + t.equal(components.scheme, undefined, 'scheme') + t.equal(components.userinfo, undefined, 'userinfo') + t.equal(components.host, '01.01.01.01', 'host') t.equal(components.port, undefined, 'port') t.equal(components.path, '', 'path') t.equal(components.query, undefined, 'query')