From 2fbe124e68c040904e990c23083a63e163a3085d Mon Sep 17 00:00:00 2001 From: HinataKah0 <128208841+HinataKah0@users.noreply.github.com> Date: Mon, 24 Apr 2023 13:35:38 +0800 Subject: http: add highWaterMark opt in http.createServer Add highWaterMark option when creating a new HTTP server. This option will override the default (readable|writable) highWaterMark values on sockets created. Fixes: https://github.com/nodejs/node/issues/46606 PR-URL: https://github.com/nodejs/node/pull/47405 Reviewed-By: Robert Nagy Reviewed-By: Paolo Insogna Reviewed-By: Debadree Chatterjee --- lib/_http_outgoing.js | 5 +++-- lib/_http_server.js | 9 +++++---- lib/http.js | 1 + lib/net.js | 13 +++++++++++++ 4 files changed, 22 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index 6b1b8703f9..55a2f8bef3 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -101,7 +101,7 @@ function isContentDispositionField(s) { return s.length === 19 && StringPrototypeToLowerCase(s) === 'content-disposition'; } -function OutgoingMessage() { +function OutgoingMessage(options) { Stream.call(this); // Queue that holds all currently pending data, until the response will be @@ -149,7 +149,7 @@ function OutgoingMessage() { this._onPendingData = nop; this[kErrored] = null; - this[kHighWaterMark] = getDefaultHighWaterMark(); + this[kHighWaterMark] = options?.highWaterMark ?? getDefaultHighWaterMark(); } ObjectSetPrototypeOf(OutgoingMessage.prototype, Stream.prototype); ObjectSetPrototypeOf(OutgoingMessage, Stream); @@ -1171,6 +1171,7 @@ function(err, event) { }; module.exports = { + kHighWaterMark, kUniqueHeaders, parseUniqueHeadersOption, validateHeaderName, diff --git a/lib/_http_server.js b/lib/_http_server.js index 838a1f13ea..e6e592451b 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -188,8 +188,8 @@ class HTTPServerAsyncResource { } } -function ServerResponse(req) { - OutgoingMessage.call(this); +function ServerResponse(req, options) { + OutgoingMessage.call(this, options); if (req.method === 'HEAD') this._hasBody = false; @@ -513,7 +513,8 @@ function Server(options, requestListener) { this, { allowHalfOpen: true, noDelay: options.noDelay ?? true, keepAlive: options.keepAlive, - keepAliveInitialDelay: options.keepAliveInitialDelay }); + keepAliveInitialDelay: options.keepAliveInitialDelay, + highWaterMark: options.highWaterMark }); if (requestListener) { this.on('request', requestListener); @@ -1019,7 +1020,7 @@ function parserOnIncoming(server, socket, state, req, keepAlive) { } } - const res = new server[kServerResponse](req); + const res = new server[kServerResponse](req, { highWaterMark: socket.writableHighWaterMark }); res._keepAliveTimeout = server.keepAliveTimeout; res._maxRequestsPerSocket = server.maxRequestsPerSocket; res._onPendingData = updateOutgoingData.bind(undefined, diff --git a/lib/http.js b/lib/http.js index 66dea3ff54..a1f811c695 100644 --- a/lib/http.js +++ b/lib/http.js @@ -54,6 +54,7 @@ let maxHeaderSize; * maxHeaderSize?: number; * requireHostHeader?: boolean; * joinDuplicateHeaders?: boolean; + * highWaterMark?: number; * }} [opts] * @param {Function} [requestListener] * @returns {Server} diff --git a/lib/net.js b/lib/net.js index e29b62c812..f52222ec58 100644 --- a/lib/net.js +++ b/lib/net.js @@ -154,6 +154,7 @@ const { startPerf, stopPerf, } = require('internal/perf/observe'); +const { getDefaultHighWaterMark } = require('internal/streams/state'); function getFlags(ipv6Only) { return ipv6Only === true ? TCPConstants.UV_TCP_IPV6ONLY : 0; @@ -1682,6 +1683,15 @@ function Server(options, connectionListener) { options.keepAliveInitialDelay = 0; } } + if (typeof options.highWaterMark !== 'undefined') { + validateNumber( + options.highWaterMark, 'options.highWaterMark', + ); + + if (options.highWaterMark < 0) { + options.highWaterMark = getDefaultHighWaterMark(); + } + } this._connections = 0; @@ -1696,6 +1706,7 @@ function Server(options, connectionListener) { this.noDelay = Boolean(options.noDelay); this.keepAlive = Boolean(options.keepAlive); this.keepAliveInitialDelay = ~~(options.keepAliveInitialDelay / 1000); + this.highWaterMark = options.highWaterMark ?? getDefaultHighWaterMark(); } ObjectSetPrototypeOf(Server.prototype, EventEmitter.prototype); ObjectSetPrototypeOf(Server, EventEmitter); @@ -2077,6 +2088,8 @@ function onconnection(err, clientHandle) { pauseOnCreate: self.pauseOnConnect, readable: true, writable: true, + readableHighWaterMark: self.highWaterMark, + writableHighWaterMark: self.highWaterMark, }); if (self.noDelay && clientHandle.setNoDelay) { -- cgit v1.2.1