diff options
author | Luigi Pinca <luigipinca@gmail.com> | 2019-06-24 18:15:58 +0200 |
---|---|---|
committer | Luigi Pinca <luigipinca@gmail.com> | 2019-07-01 18:26:10 +0200 |
commit | 26b048effb23eb479fe0e10087860bb7f9862f2a (patch) | |
tree | 4af8383b916eff1e048a0f5d1e2309747d7255ab | |
parent | 9b77be4814cfe9cf816c05b325b2fa7bc6a92e55 (diff) | |
download | android-node-v8-26b048effb23eb479fe0e10087860bb7f9862f2a.tar.gz android-node-v8-26b048effb23eb479fe0e10087860bb7f9862f2a.tar.bz2 android-node-v8-26b048effb23eb479fe0e10087860bb7f9862f2a.zip |
http2: remove square brackets from parsed hostname
Make `http2.connect()` work when using URLs with literal IPv6
addresses.
Fixes: https://github.com/nodejs/node/issues/28216
PR-URL: https://github.com/nodejs/node/pull/28406
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Jiawen Geng <technicalcute@gmail.com>
-rw-r--r-- | lib/internal/http2/core.js | 11 | ||||
-rw-r--r-- | test/parallel/test-http2-connect.js | 30 |
2 files changed, 39 insertions, 2 deletions
diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index fefb04d03d..a65dbb92c5 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -2778,7 +2778,16 @@ function connect(authority, options, listener) { const protocol = authority.protocol || options.protocol || 'https:'; const port = '' + (authority.port !== '' ? authority.port : (authority.protocol === 'http:' ? 80 : 443)); - const host = authority.hostname || authority.host || 'localhost'; + let host = 'localhost'; + + if (authority.hostname) { + host = authority.hostname; + + if (host[0] === '[') + host = host.slice(1, -1); + } else if (authority.host) { + host = authority.host; + } let socket; if (typeof options.createConnection === 'function') { diff --git a/test/parallel/test-http2-connect.js b/test/parallel/test-http2-connect.js index a2f30f974e..2137ef2892 100644 --- a/test/parallel/test-http2-connect.js +++ b/test/parallel/test-http2-connect.js @@ -1,6 +1,12 @@ 'use strict'; -const { mustCall, hasCrypto, skip, expectsError } = require('../common'); +const { + mustCall, + hasCrypto, + hasIPv6, + skip, + expectsError +} = require('../common'); if (!hasCrypto) skip('missing crypto'); const { createServer, connect } = require('http2'); @@ -73,3 +79,25 @@ const { connect: netConnect } = require('net'); type: Error }); } + +// Check for literal IPv6 addresses in URL's +if (hasIPv6) { + const server = createServer(); + server.listen(0, '::1', mustCall(() => { + const { port } = server.address(); + const clients = new Set(); + + clients.add(connect(`http://[::1]:${port}`)); + clients.add(connect(new URL(`http://[::1]:${port}`))); + + for (const client of clients) { + client.once('connect', mustCall(() => { + client.close(); + clients.delete(client); + if (clients.size === 0) { + server.close(); + } + })); + } + })); +} |