From 9aa5d494e64e27dcb6e73774b8134d92338d1f91 Mon Sep 17 00:00:00 2001 From: Anatoli Papirovski Date: Fri, 20 Oct 2017 07:38:15 -0400 Subject: [PATCH] http2: allow port 80 in http2.connect MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Due to how WHATWG-URL parser works, port numbers are omitted if they are the default port for a scheme. This meant that http2.connect could not accept connections on port 80 with http scheme. Fix this bug by detecting http: scheme and setting port to 80. PR-URL: https://github.com/nodejs/node/pull/16337 Fixes: https://github.com/nodejs/node/issues/14304 Reviewed-By: Vse Mozhet Byt Reviewed-By: James M Snell Reviewed-By: Anna Henningsen Reviewed-By: Colin Ihrig Reviewed-By: Michaƫl Zasso --- lib/internal/http2/core.js | 3 ++- test/parallel/test-http2-client-port-80.js | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 test/parallel/test-http2-client-port-80.js diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index 633ef219441b79..1d0bcde56961fe 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -2419,7 +2419,8 @@ function connect(authority, options, listener) { debug(`connecting to ${authority}`); const protocol = authority.protocol || options.protocol || 'https:'; - const port = '' + (authority.port !== '' ? authority.port : 443); + const port = '' + (authority.port !== '' ? + authority.port : (authority.protocol === 'http:' ? 80 : 443)); const host = authority.hostname || authority.host || 'localhost'; let socket; diff --git a/test/parallel/test-http2-client-port-80.js b/test/parallel/test-http2-client-port-80.js new file mode 100644 index 00000000000000..a9d19eb5b9f008 --- /dev/null +++ b/test/parallel/test-http2-client-port-80.js @@ -0,0 +1,19 @@ +'use strict'; + +const common = require('../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); +const assert = require('assert'); +const http2 = require('http2'); +const net = require('net'); + +// Verifies that port 80 gets set as expected + +const connect = net.connect; +net.connect = common.mustCall((...args) => { + assert.strictEqual(args[0], '80'); + return connect(...args); +}); + +const client = http2.connect('http://localhost:80'); +client.destroy();