summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/internal/net.js3
-rw-r--r--lib/net.js16
-rw-r--r--test/parallel/test-net-normalize-args.js55
3 files changed, 69 insertions, 5 deletions
diff --git a/lib/internal/net.js b/lib/internal/net.js
index ce8f549bdf..d4558cfca8 100644
--- a/lib/internal/net.js
+++ b/lib/internal/net.js
@@ -10,5 +10,6 @@ function isLegalPort(port) {
}
module.exports = {
- isLegalPort
+ isLegalPort,
+ normalizedArgsSymbol: Symbol('normalizedArgs')
};
diff --git a/lib/net.js b/lib/net.js
index 2431820783..0c2c2dceda 100644
--- a/lib/net.js
+++ b/lib/net.js
@@ -49,6 +49,7 @@ var dns;
const errnoException = util._errnoException;
const exceptionWithHostPort = util._exceptionWithHostPort;
const isLegalPort = internalNet.isLegalPort;
+const normalizedArgsSymbol = internalNet.normalizedArgsSymbol;
function noop() {}
@@ -118,8 +119,12 @@ function connect() {
// For Server.prototype.listen(), the [...] part is [, backlog]
// but will not be handled here (handled in listen())
function normalizeArgs(args) {
+ var arr;
+
if (args.length === 0) {
- return [{}, null];
+ arr = [{}, null];
+ arr[normalizedArgsSymbol] = true;
+ return arr;
}
const arg0 = args[0];
@@ -140,9 +145,12 @@ function normalizeArgs(args) {
var cb = args[args.length - 1];
if (typeof cb !== 'function')
- return [options, null];
+ arr = [options, null];
else
- return [options, cb];
+ arr = [options, cb];
+
+ arr[normalizedArgsSymbol] = true;
+ return arr;
}
@@ -947,7 +955,7 @@ Socket.prototype.connect = function() {
// already been normalized (so we don't normalize more than once). This has
// been solved before in https://github.com/nodejs/node/pull/12342, but was
// reverted as it had unintended side effects.
- if (arguments.length === 1 && Array.isArray(arguments[0])) {
+ if (Array.isArray(arguments[0]) && arguments[0][normalizedArgsSymbol]) {
normalized = arguments[0];
} else {
var args = new Array(arguments.length);
diff --git a/test/parallel/test-net-normalize-args.js b/test/parallel/test-net-normalize-args.js
new file mode 100644
index 0000000000..fe5444e299
--- /dev/null
+++ b/test/parallel/test-net-normalize-args.js
@@ -0,0 +1,55 @@
+'use strict';
+// Flags: --expose-internals
+const common = require('../common');
+const assert = require('assert');
+const net = require('net');
+const { normalizedArgsSymbol } = require('internal/net');
+
+function validateNormalizedArgs(input, output) {
+ const args = net._normalizeArgs(input);
+
+ assert.deepStrictEqual(args, output);
+ assert.strictEqual(args[normalizedArgsSymbol], true);
+}
+
+// Test creation of normalized arguments.
+validateNormalizedArgs([], [{}, null]);
+validateNormalizedArgs([{ port: 1234 }], [{ port: 1234 }, null]);
+validateNormalizedArgs([{ port: 1234 }, assert.fail],
+ [{ port: 1234 }, assert.fail]);
+
+// Connecting to the server should fail with a standard array.
+{
+ const server = net.createServer(common.mustNotCall('should not connect'));
+
+ server.listen(common.mustCall(() => {
+ const possibleErrors = ['ECONNREFUSED', 'EADDRNOTAVAIL'];
+ const port = server.address().port;
+ const socket = new net.Socket();
+
+ socket.on('error', common.mustCall((err) => {
+ assert(possibleErrors.includes(err.code));
+ assert(possibleErrors.includes(err.errno));
+ assert.strictEqual(err.syscall, 'connect');
+ server.close();
+ }));
+
+ socket.connect([{ port }, assert.fail]);
+ }));
+}
+
+// Connecting to the server should succeed with a normalized array.
+{
+ const server = net.createServer(common.mustCall((connection) => {
+ connection.end();
+ server.close();
+ }));
+
+ server.listen(common.mustCall(() => {
+ const port = server.address().port;
+ const socket = new net.Socket();
+ const args = net._normalizeArgs([{ port }, common.mustCall()]);
+
+ socket.connect(args);
+ }));
+}