From e98b0c60bcdf3a6f1b467dad3ef46b733bc91e3e Mon Sep 17 00:00:00 2001 From: Gabor Javorszky Date: Wed, 24 Jan 2024 17:03:48 +0000 Subject: [PATCH 1/3] Take options as well as requestListener Unit-http have not kept up with the signature of nodejs's http package development. Nodejs allows an optional `options` object to be passed to the `createServer` function, we didn't. This resulted in function signature errors when user code that did make use of the options arg tried to call unit's replaced function. This change changes the signature to be more in line with how nodejs does it discarding it and printing a message to stdout. Closes: https://github.com/nginx/unit/issues/1043 --- src/nodejs/unit-http/http.js | 4 ++-- src/nodejs/unit-http/http_server.js | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/nodejs/unit-http/http.js b/src/nodejs/unit-http/http.js index d298a35fe..60b8004f7 100644 --- a/src/nodejs/unit-http/http.js +++ b/src/nodejs/unit-http/http.js @@ -11,8 +11,8 @@ const { ServerResponse, } = require('./http_server'); -function createServer (requestHandler) { - return new Server(requestHandler); +function createServer (options, requestHandler) { + return new Server(options, requestHandler); } const http = require("http") diff --git a/src/nodejs/unit-http/http_server.js b/src/nodejs/unit-http/http_server.js index 8eb13d7f3..b78f309ae 100644 --- a/src/nodejs/unit-http/http_server.js +++ b/src/nodejs/unit-http/http_server.js @@ -5,6 +5,7 @@ 'use strict'; +const { stderr } = require('process'); const EventEmitter = require('events'); const http = require('http'); const util = require('util'); @@ -413,7 +414,14 @@ ServerRequest.prototype._read = function _read(n) { }; -function Server(requestListener) { +function Server(options, requestListener) { + if (typeof options === 'function') { + requestListener = options; + options = {}; + } else { + stderr.write("http.Server constructor was called with unsupported options, using default settings\n"); + } + EventEmitter.call(this); this.unit = new unit_lib.Unit(); From 2e8f1f92e3845b2e6aac1de8e6e81ca0cd94c45d Mon Sep 17 00:00:00 2001 From: Gabor Javorszky Date: Thu, 25 Jan 2024 15:40:36 +0000 Subject: [PATCH 2/3] Add test file to start node application with options --- test/node/options/app.js | 4 ++++ test/test_node_application.py | 6 ++++++ 2 files changed, 10 insertions(+) create mode 100644 test/node/options/app.js diff --git a/test/node/options/app.js b/test/node/options/app.js new file mode 100644 index 000000000..bc5380803 --- /dev/null +++ b/test/node/options/app.js @@ -0,0 +1,4 @@ +require('http').createServer({}, function (req, res) { + res.writeHead(200, {'Content-Length': 12, 'Content-Type': 'text/plain'}) + .end('Hello World\n'); +}).listen(8080); diff --git a/test/test_node_application.py b/test/test_node_application.py index cb7752105..88ae31362 100644 --- a/test/test_node_application.py +++ b/test/test_node_application.py @@ -21,6 +21,12 @@ def test_node_application_basic(): assert_basic_application() +def test_node_application_options(wait_for_record): + client.load('options') + + assert_basic_application() + assert wait_for_record(r'constructor was called with unsupported') is not None + def test_node_application_loader_unit_http(): client.load('loader/unit_http') From 9dafbdcd4f492d43f1e420bef2b9bb89a89e7b3c Mon Sep 17 00:00:00 2001 From: Gabor Javorszky Date: Fri, 26 Jan 2024 16:23:45 +0000 Subject: [PATCH 3/3] Add changes to docs/changes.xml --- docs/changes.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/changes.xml b/docs/changes.xml index 428da0bab..a3549697f 100644 --- a/docs/changes.xml +++ b/docs/changes.xml @@ -53,6 +53,12 @@ NGINX Unit updated to 1.32.0. + + +http.createServer() now accepts "options" argument introduced in Node.js v9.6.0, v8.12.0. + + + conditional access logging.