From f3b49cfa7b3c2887ca8147b3d47ce1834b3923bf Mon Sep 17 00:00:00 2001 From: szabolcsit Date: Tue, 6 Nov 2018 17:07:59 +0100 Subject: [PATCH] http: else case is not reachable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit While checking the arguments passed to http.Server, the case where the options argument was of wrong type was not handled. Now it throws an ERR_INVALID_ARG_TYPE error if the options argument is not a function, object, null, or undefined. PR-URL: https://github.com/nodejs/node/pull/24176 Reviewed-By: Ruben Bridgewater Reviewed-By: Gireesh Punathil Reviewed-By: Matteo Collina Reviewed-By: Michaƫl Zasso Reviewed-By: Trivikram Kamat --- lib/_http_server.js | 3 +++ test/parallel/test-http-server.js | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/lib/_http_server.js b/lib/_http_server.js index 3b2d7f50419127..96f05f5819d3a8 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -47,6 +47,7 @@ const { IncomingMessage } = require('_http_incoming'); const { ERR_HTTP_HEADERS_SENT, ERR_HTTP_INVALID_STATUS_CODE, + ERR_INVALID_ARG_TYPE, ERR_INVALID_CHAR } = require('internal/errors').codes; const Buffer = require('buffer').Buffer; @@ -281,6 +282,8 @@ function Server(options, requestListener) { options = {}; } else if (options == null || typeof options === 'object') { options = util._extend({}, options); + } else { + throw new ERR_INVALID_ARG_TYPE('options', 'object', options); } this[kIncomingMessage] = options.IncomingMessage || IncomingMessage; diff --git a/test/parallel/test-http-server.js b/test/parallel/test-http-server.js index d46e25bdf6c558..f591cd59fc63c2 100644 --- a/test/parallel/test-http-server.js +++ b/test/parallel/test-http-server.js @@ -27,6 +27,19 @@ const http = require('http'); const url = require('url'); const qs = require('querystring'); +// TODO: documentation does not allow Array as an option, so testing that +// should fail, but currently http.Server does not typecheck further than +// if `option` is `typeof object` - so we don't test that here right now +const invalid_options = [ 'foo', 42, true ]; + +invalid_options.forEach((option) => { + assert.throws(() => { + new http.Server(option); + }, { + code: 'ERR_INVALID_ARG_TYPE' + }); +}); + let request_number = 0; let requests_sent = 0; let server_response = '';