From a240d45d1acdd4af897f8ab6846fec44cb867126 Mon Sep 17 00:00:00 2001 From: ZYSzys Date: Thu, 3 Oct 2019 01:19:05 +0800 Subject: [PATCH] http2: support passing options of http2.connect to net.connect PR-URL: https://github.com/nodejs/node/pull/29816 Fixes: https://github.com/nodejs/node/issues/29811 Reviewed-By: Matteo Collina Reviewed-By: James M Snell Reviewed-By: Colin Ihrig Reviewed-By: Trivikram Kamat Reviewed-By: Jiawen Geng --- lib/internal/http2/core.js | 2 +- test/parallel/test-http2-client-port-80.js | 2 +- test/parallel/test-http2-connect-options.js | 42 +++++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 test/parallel/test-http2-connect-options.js diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index 5925cbfefc52d9..73dc6a41e9930a 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -2920,7 +2920,7 @@ function connect(authority, options, listener) { } else { switch (protocol) { case 'http:': - socket = net.connect(options.port || port, options.host || host); + socket = net.connect({ port, host, ...options }); break; case 'https:': socket = tls.connect(port, host, initializeTLSOptions(options, host)); diff --git a/test/parallel/test-http2-client-port-80.js b/test/parallel/test-http2-client-port-80.js index fc82e231f6af8f..a286dbf6a725d8 100644 --- a/test/parallel/test-http2-client-port-80.js +++ b/test/parallel/test-http2-client-port-80.js @@ -11,7 +11,7 @@ const net = require('net'); const connect = net.connect; net.connect = common.mustCall((...args) => { - assert.strictEqual(args[0], '80'); + assert.strictEqual(args[0].port, '80'); return connect(...args); }); diff --git a/test/parallel/test-http2-connect-options.js b/test/parallel/test-http2-connect-options.js new file mode 100644 index 00000000000000..1a7987621ab34e --- /dev/null +++ b/test/parallel/test-http2-connect-options.js @@ -0,0 +1,42 @@ +// Flags: --expose-internals +'use strict'; +const common = require('../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); + +if (!common.hasMultiLocalhost()) + common.skip('platform-specific test.'); + +const http2 = require('http2'); +const assert = require('assert'); + +const server = http2.createServer((req, res) => { + console.log(`Connect from: ${req.connection.remoteAddress}`); + assert.strictEqual(req.connection.remoteAddress, '127.0.0.2'); + + req.on('end', common.mustCall(() => { + res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.end(`You are from: ${req.connection.remoteAddress}`); + })); + req.resume(); +}); + +server.listen(0, '127.0.0.1', common.mustCall(() => { + const options = { localAddress: '127.0.0.2' }; + + const client = http2.connect( + 'http://localhost:' + server.address().port, + options + ); + const req = client.request({ + ':path': '/' + }); + req.on('data', () => req.resume()); + req.on('end', common.mustCall(function() { + client.close(); + req.close(); + server.close(); + process.exit(); + })); + req.end(); +}));