summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorHinataKah0 <128208841+HinataKah0@users.noreply.github.com>2023-04-24 13:35:38 +0800
committerGitHub <noreply@github.com>2023-04-24 05:35:38 +0000
commit2fbe124e68c040904e990c23083a63e163a3085d (patch)
treefe6da9caa228808023ed1ce04a75644580c204ab /lib
parent3e9ed7e95fff075e839035cc12d92fea2f1a9744 (diff)
downloadnode-new-2fbe124e68c040904e990c23083a63e163a3085d.tar.gz
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 <ronagy@icloud.com> Reviewed-By: Paolo Insogna <paolo@cowtech.it> Reviewed-By: Debadree Chatterjee <debadree333@gmail.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/_http_outgoing.js5
-rw-r--r--lib/_http_server.js9
-rw-r--r--lib/http.js1
-rw-r--r--lib/net.js13
4 files changed, 22 insertions, 6 deletions
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) {