net: add local address/port for better errors
authorJan Schär <jscissr@gmail.com>
Fri, 20 Nov 2015 21:16:55 +0000 (22:16 +0100)
committerJames M Snell <jasnell@gmail.com>
Wed, 23 Dec 2015 16:38:33 +0000 (08:38 -0800)
Adds localAddress and localPort to req so we have better error messages.
Also fixes a case where ex is used before it is declared.

PR-URL: https://github.com/nodejs/node/pull/3946
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Evan Lucas <evanlucas@me.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
lib/net.js
test/parallel/test-net-connect-local-error.js [new file with mode: 0644]

index a7a8eb1fcc21a7a344be993e6596b5799dabfe2a..58c9a3bc34c737919ce5b3587c153cb98efea4ea 100644 (file)
@@ -817,6 +817,8 @@ function connect(self, address, port, addressType, localAddress, localPort) {
     req.oncomplete = afterConnect;
     req.address = address;
     req.port = port;
+    req.localAddress = localAddress;
+    req.localPort = localPort;
 
     if (addressType === 4)
       err = self._handle.connect(req, address, port);
@@ -1056,15 +1058,17 @@ function afterConnect(status, handle, req, readable, writable) {
     self._connecting = false;
     var details;
     if (req.localAddress && req.localPort) {
-      ex.localAddress = req.localAddress;
-      ex.localPort = req.localPort;
-      details = ex.localAddress + ':' + ex.localPort;
+      details = req.localAddress + ':' + req.localPort;
     }
     var ex = exceptionWithHostPort(status,
                                    'connect',
                                    req.address,
                                    req.port,
                                    details);
+    if (details) {
+      ex.localAddress = req.localAddress;
+      ex.localPort = req.localPort;
+    }
     self._destroy(ex);
   }
 }
diff --git a/test/parallel/test-net-connect-local-error.js b/test/parallel/test-net-connect-local-error.js
new file mode 100644 (file)
index 0000000..197b283
--- /dev/null
@@ -0,0 +1,15 @@
+'use strict';
+const common = require('../common');
+const assert = require('assert');
+const net = require('net');
+
+var client = net.connect({
+  port: common.PORT + 1,
+  localPort: common.PORT,
+  localAddress: common.localhostIPv4
+});
+
+client.on('error', common.mustCall(function onError(err) {
+  assert.equal(err.localPort, common.PORT);
+  assert.equal(err.localAddress, common.localhostIPv4);
+}));