diff options
author | Sagi Tsofan <sagitsofan@gmail.com> | 2018-09-21 00:59:22 +0300 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2018-10-11 21:21:36 -0700 |
commit | 82ea7058b6c25ee2c1467665c1b53b2b2b9ca139 (patch) | |
tree | b63c4164162715e77a5f1624ef871055609127f0 | |
parent | 3f08c004c5c95abc8a2faf7e2ea156c72806b54b (diff) | |
download | android-node-v8-82ea7058b6c25ee2c1467665c1b53b2b2b9ca139.tar.gz android-node-v8-82ea7058b6c25ee2c1467665c1b53b2b2b9ca139.tar.bz2 android-node-v8-82ea7058b6c25ee2c1467665c1b53b2b2b9ca139.zip |
lib: http server, friendly error messages
Improved error message description for the http server binding errors.
Currently changed only in `setupListenHandle`, but needs to be
change all over.
Added new `uvExceptionWithHostPort` function (+export) in
`lib/internal/error.js` that extracts the error message defined by
libuv, using the error code, and returns an error object with the
full error description.
example:
old error message: `listen EADDRINUSE`
new error message: `listen EADDRINUSE: Address already in use`
Removed exportable function `_exceptionWithHostPort` from
`lib/util.js` - exported by accident
Replaced `exceptionWithHostPort` to the new function
`uvExceptionWithHostPort` for a more detailed error.
Fixes: https://github.com/nodejs/node/issues/22936
PR-URL: https://github.com/nodejs/node/pull/22995
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Sakthipriyan Vairamani <thechargingvolcano@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
-rw-r--r-- | lib/internal/errors.js | 46 | ||||
-rw-r--r-- | lib/net.js | 10 | ||||
-rw-r--r-- | test/parallel/test-net-server-listen-handle.js | 2 |
3 files changed, 52 insertions, 6 deletions
diff --git a/lib/internal/errors.js b/lib/internal/errors.js index 4094a40f6b..58eba742e0 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -286,6 +286,46 @@ function uvException(ctx) { } /** + * This creates an error compatible with errors produced in the C++ + * This function should replace the deprecated + * `exceptionWithHostPort()` function. + * + * @param {number} err - A libuv error number + * @param {string} syscall + * @param {string} address + * @param {number} [port] + * @param {string} [additional] + * @returns {Error} + */ +function uvExceptionWithHostPort(err, syscall, address, port, additional) { + const [ code, uvmsg ] = errmap.get(err); + const message = `${syscall} ${code}: ${uvmsg}`; + let details = ''; + + if (port && port > 0) { + details = ` ${address}:${port}`; + } else if (address) { + details = ` ${address}`; + } + if (additional) { + details += ` - Local (${additional})`; + } + + // eslint-disable-next-line no-restricted-syntax + const ex = new Error(`${message}${details}`); + ex.code = code; + ex.errno = code; + ex.syscall = syscall; + ex.address = address; + if (port) { + ex.port = port; + } + + Error.captureStackTrace(ex, uvExceptionWithHostPort); + return ex; +} + +/** * This used to be util._errnoException(). * * @param {number} err - A libuv error number @@ -314,8 +354,9 @@ function errnoException(err, syscall, original) { } /** - * This used to be util._exceptionWithHostPort(). - * + * Deprecated, new function is `uvExceptionWithHostPort()` + * New function added the error description directly + * from C++. this method for backwards compatibility * @param {number} err - A libuv error number * @param {string} syscall * @param {string} address @@ -437,6 +478,7 @@ module.exports = { errnoException, exceptionWithHostPort, uvException, + uvExceptionWithHostPort, isStackOverflowError, getMessage, SystemError, diff --git a/lib/net.js b/lib/net.js index f7d55ca646..33ce1f74eb 100644 --- a/lib/net.js +++ b/lib/net.js @@ -84,7 +84,11 @@ const kLastWriteQueueSize = Symbol('lastWriteQueueSize'); let cluster; let dns; -const { errnoException, exceptionWithHostPort } = errors; +const { + errnoException, + exceptionWithHostPort, + uvExceptionWithHostPort +} = errors; const { kTimeout, @@ -1266,7 +1270,7 @@ function setupListenHandle(address, port, addressType, backlog, fd) { rval = createServerHandle(address, port, addressType, fd); if (typeof rval === 'number') { - var error = exceptionWithHostPort(rval, 'listen', address, port); + var error = uvExceptionWithHostPort(rval, 'listen', address, port); process.nextTick(emitErrorNT, this, error); return; } @@ -1283,7 +1287,7 @@ function setupListenHandle(address, port, addressType, backlog, fd) { var err = this._handle.listen(backlog || 511); if (err) { - var ex = exceptionWithHostPort(err, 'listen', address, port); + var ex = uvExceptionWithHostPort(err, 'listen', address, port); this._handle.close(); this._handle = null; defaultTriggerAsyncIdScope(this[async_id_symbol], diff --git a/test/parallel/test-net-server-listen-handle.js b/test/parallel/test-net-server-listen-handle.js index b1182221fc..0d59bd76ca 100644 --- a/test/parallel/test-net-server-listen-handle.js +++ b/test/parallel/test-net-server-listen-handle.js @@ -150,7 +150,7 @@ if (!common.isWindows) { // Windows doesn't support {fd: <n>} net.createServer() .listen({ fd }, common.mustNotCall()) .on('error', common.mustCall(function(err) { - assert.strictEqual(String(err), 'Error: listen EINVAL'); + assert.strictEqual(String(err), 'Error: listen EINVAL: invalid argument'); this.close(); })); } |