Browse Source

tls: prefer path over port in connect

Makes tls.connect() behave as documented, preferring options.path over
options.port. This makes it consistent with net.connect(), so the
included test demonstrates that both behave in this way.

Also, for consistency, noting the precedence of options.path in net
doc.

PR-URL: https://github.com/nodejs/node/pull/14564
Reviewed-By: Sakthipriyan Vairamani <thechargingvolcano@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
canary-base
Bryan English 8 years ago
parent
commit
6f1caadb85
  1. 3
      doc/api/net.md
  2. 12
      lib/_tls_wrap.js
  3. 64
      test/parallel/test-tls-net-connect-prefer-path.js

3
doc/api/net.md

@ -591,7 +591,8 @@ For TCP connections, available `options` are:
For [IPC][] connections, available `options` are: For [IPC][] connections, available `options` are:
* `path` {string} Required. Path the client should connect to. * `path` {string} Required. Path the client should connect to.
See [Identifying paths for IPC connections][]. See [Identifying paths for IPC connections][]. If provided, the TCP-specific
options above are ignored.
Returns `socket`. Returns `socket`.

12
lib/_tls_wrap.js

@ -1051,7 +1051,7 @@ exports.connect = function(...args /* [port,] [host,] [options,] [cb] */) {
tls.convertALPNProtocols(options.ALPNProtocols, ALPN); tls.convertALPNProtocols(options.ALPNProtocols, ALPN);
var socket = new TLSSocket(options.socket, { var socket = new TLSSocket(options.socket, {
pipe: options.path && !options.port, pipe: !!options.path,
secureContext: context, secureContext: context,
isServer: false, isServer: false,
requestCert: true, requestCert: true,
@ -1066,19 +1066,15 @@ exports.connect = function(...args /* [port,] [host,] [options,] [cb] */) {
socket.once('secureConnect', cb); socket.once('secureConnect', cb);
if (!options.socket) { if (!options.socket) {
var connect_opt; const connectOpt = {
if (options.path && !options.port) { path: options.path,
connect_opt = { path: options.path };
} else {
connect_opt = {
port: options.port, port: options.port,
host: options.host, host: options.host,
family: options.family, family: options.family,
localAddress: options.localAddress, localAddress: options.localAddress,
lookup: options.lookup lookup: options.lookup
}; };
} socket.connect(connectOpt, function() {
socket.connect(connect_opt, function() {
socket._start(); socket._start();
}); });
} }

64
test/parallel/test-tls-net-connect-prefer-path.js

@ -0,0 +1,64 @@
'use strict';
const common = require('../common');
// This tests that both tls and net will ignore host and port if path is
// provided.
if (!common.hasCrypto)
common.skip('missing crypto');
common.refreshTmpDir();
const tls = require('tls');
const net = require('net');
const fs = require('fs');
const assert = require('assert');
function libName(lib) {
return lib === net ? 'net' : 'tls';
}
function mkServer(lib, tcp, cb) {
const handler = (socket) => {
socket.write(`${libName(lib)}:${
server.address().port || server.address()
}`);
socket.end();
};
const args = [handler];
if (lib === tls) {
args.unshift({
cert: fs.readFileSync(`${common.fixturesDir}/test_cert.pem`),
key: fs.readFileSync(`${common.fixturesDir}/test_key.pem`)
});
}
const server = lib.createServer(...args);
server.listen(tcp ? 0 : common.PIPE, common.mustCall(() => cb(server)));
}
function testLib(lib, cb) {
mkServer(lib, true, (tcpServer) => {
mkServer(lib, false, (unixServer) => {
const client = lib.connect({
path: unixServer.address(),
port: tcpServer.address().port,
host: 'localhost',
rejectUnauthorized: false
}, () => {
const bufs = [];
client.on('data', common.mustCall((d) => {
bufs.push(d);
}));
client.on('end', common.mustCall(() => {
const resp = Buffer.concat(bufs).toString();
assert.strictEqual(`${libName(lib)}:${unixServer.address()}`, resp);
tcpServer.close();
unixServer.close();
cb();
}));
});
});
});
}
testLib(net, common.mustCall(() => testLib(tls, common.mustCall())));
Loading…
Cancel
Save