tls,https: respect address family when connecting
Respect the `{ family: 6 }` address family property when connecting to a remote peer over TLS. Fixes: https://github.com/nodejs/node/issues/4139 Fixes: https://github.com/nodejs/node/issues/6440 PR-URL: https://github.com/nodejs/node/pull/6654 Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
This commit is contained in:
parent
313ef54417
commit
fb19b800b8
@ -102,6 +102,11 @@ Agent.prototype.getName = function(options) {
|
||||
if (options.localAddress)
|
||||
name += options.localAddress;
|
||||
|
||||
// Pacify parallel/test-http-agent-getname by only appending
|
||||
// the ':' when options.family is set.
|
||||
if (options.family === 4 || options.family === 6)
|
||||
name += ':' + options.family;
|
||||
|
||||
return name;
|
||||
};
|
||||
|
||||
|
@ -1025,6 +1025,7 @@ exports.connect = function(/* [port, host], options, cb */) {
|
||||
connect_opt = {
|
||||
port: options.port,
|
||||
host: options.host,
|
||||
family: options.family,
|
||||
localAddress: options.localAddress
|
||||
};
|
||||
}
|
||||
|
@ -12,6 +12,13 @@ test-tick-processor : PASS,FLAKY
|
||||
[$system==linux]
|
||||
test-tick-processor : PASS,FLAKY
|
||||
|
||||
# Flaky until https://github.com/nodejs/build/issues/415 is resolved.
|
||||
# On some of the buildbots, AAAA queries for localhost don't resolve
|
||||
# to an address and neither do any of the alternatives from the
|
||||
# localIPv6Hosts list from test/common.js.
|
||||
test-https-connect-address-family : PASS,FLAKY
|
||||
test-tls-connect-address-family : PASS,FLAKY
|
||||
|
||||
[$system==macos]
|
||||
|
||||
[$system==solaris] # Also applies to SmartOS
|
||||
|
@ -30,3 +30,9 @@ assert.equal(
|
||||
}),
|
||||
'0.0.0.0:80:192.168.1.1'
|
||||
);
|
||||
|
||||
for (const family of [0, null, undefined, 'bogus'])
|
||||
assert.strictEqual(agent.getName({ family }), 'localhost::');
|
||||
|
||||
for (const family of [4, 6])
|
||||
assert.strictEqual(agent.getName({ family }), 'localhost:::' + family);
|
||||
|
28
test/parallel/test-https-connect-address-family.js
Normal file
28
test/parallel/test-https-connect-address-family.js
Normal file
@ -0,0 +1,28 @@
|
||||
'use strict';
|
||||
const common = require('../common');
|
||||
const assert = require('assert');
|
||||
const https = require('https');
|
||||
|
||||
if (!common.hasIPv6) {
|
||||
common.skip('no IPv6 support');
|
||||
return;
|
||||
}
|
||||
|
||||
const ciphers = 'AECDH-NULL-SHA';
|
||||
https.createServer({ ciphers }, function(req, res) {
|
||||
this.close();
|
||||
res.end();
|
||||
}).listen(common.PORT, '::1', function() {
|
||||
const options = {
|
||||
host: 'localhost',
|
||||
port: common.PORT,
|
||||
family: 6,
|
||||
ciphers: ciphers,
|
||||
rejectUnauthorized: false,
|
||||
};
|
||||
// Will fail with ECONNREFUSED if the address family is not honored.
|
||||
https.get(options, common.mustCall(function() {
|
||||
assert.strictEqual('::1', this.socket.remoteAddress);
|
||||
this.destroy();
|
||||
}));
|
||||
});
|
27
test/parallel/test-tls-connect-address-family.js
Normal file
27
test/parallel/test-tls-connect-address-family.js
Normal file
@ -0,0 +1,27 @@
|
||||
'use strict';
|
||||
const common = require('../common');
|
||||
const assert = require('assert');
|
||||
const tls = require('tls');
|
||||
|
||||
if (!common.hasIPv6) {
|
||||
common.skip('no IPv6 support');
|
||||
return;
|
||||
}
|
||||
|
||||
const ciphers = 'AECDH-NULL-SHA';
|
||||
tls.createServer({ ciphers }, function() {
|
||||
this.close();
|
||||
}).listen(common.PORT, '::1', function() {
|
||||
const options = {
|
||||
host: 'localhost',
|
||||
port: common.PORT,
|
||||
family: 6,
|
||||
ciphers: ciphers,
|
||||
rejectUnauthorized: false,
|
||||
};
|
||||
// Will fail with ECONNREFUSED if the address family is not honored.
|
||||
tls.connect(options).once('secureConnect', common.mustCall(function() {
|
||||
assert.strictEqual('::1', this.remoteAddress);
|
||||
this.destroy();
|
||||
}));
|
||||
});
|
Loading…
x
Reference in New Issue
Block a user