From ce7a01f2e10738b17812f57c7b6b5de4ea4c0298 Mon Sep 17 00:00:00 2001 From: Luigi Pinca Date: Mon, 21 Feb 2022 10:28:26 +0100 Subject: [PATCH] [fix] Improve handling of empty port Make `Url.prototype.toString()` add a trailing colon to the host if the hostname ends with a port number and the parsed port is empty. Refs: https://github.com/unshiftio/url-parse/commit/d5c64791ef49 --- index.js | 8 ++++++-- test/test.js | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 9093098..b86c29f 100644 --- a/index.js +++ b/index.js @@ -5,6 +5,7 @@ var required = require('requires-port') , controlOrWhitespace = /^[\x00-\x20\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/ , CRHTLF = /[\n\r\t]/g , slashes = /^[A-Za-z][A-Za-z0-9+-.]*:\/\// + , port = /:\d+$/ , protocolre = /^([a-z][a-z0-9.+-]*:)?(\/\/)?([\\/]+)?([\S\s]*)/i , windowsDriveLetter = /^[a-zA-Z]:/; @@ -452,7 +453,7 @@ function set(part, value, fn) { case 'host': url[part] = value; - if (/:\d+$/.test(value)) { + if (port.test(value)) { value = value.split(':'); url.port = value.pop(); url.hostname = value.join(':'); @@ -560,7 +561,10 @@ function toString(stringify) { // ends with a colon, then add back the trailing colon that was removed. This // prevents an invalid URL from being transformed into a valid one. // - if (host[host.length - 1] === ':') host += ':'; + if (host[host.length - 1] === ':' || (port.test(url.hostname) && !url.port)) { + host += ':'; + } + result += host + url.pathname; query = 'object' === typeof url.query ? stringify(url.query) : url.query; diff --git a/test/test.js b/test/test.js index f85ebb6..4108fe6 100644 --- a/test/test.js +++ b/test/test.js @@ -468,6 +468,26 @@ describe('url-parse', function () { assume(parsed.pathname).equals('/'); assume(parsed.origin).equals('http://example.com:'); assume(parsed.href).equals('http://example.com::/'); + + parsed = parse('http://example.com:8080:'); + + assume(parsed.protocol).equals('http:'); + assume(parsed.port).equals(''); + assume(parsed.host).equals('example.com:8080'); + assume(parsed.hostname).equals('example.com:8080'); + assume(parsed.pathname).equals('/'); + assume(parsed.origin).equals('http://example.com:8080'); + assume(parsed.href).equals('http://example.com:8080:/'); + + parsed = parse('http://example.com:8000:8080'); + + assume(parsed.protocol).equals('http:'); + assume(parsed.port).equals('8080'); + assume(parsed.host).equals('example.com:8000:8080'); + assume(parsed.hostname).equals('example.com:8000'); + assume(parsed.pathname).equals('/'); + assume(parsed.origin).equals('http://example.com:8000:8080'); + assume(parsed.href).equals('http://example.com:8000:8080/'); }); describe('origin', function () {