| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 21ff331 commit 4fa7739
7 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -3192,6 +3192,9 @@ Found'`. | |||
| 3192 | 3192 | <!-- YAML | |
| 3193 | 3193 | added: v0.1.13 | |
| 3194 | 3194 | changes: | |
| 3195 | + - version: REPLACEME | ||
| 3196 | + pr-url: https://github.com/nodejs/node/pull/47405 | ||
| 3197 | + description: The `highWaterMark` option is supported now. | ||
| 3195 | 3198 | - version: v18.0.0 | |
| 3196 | 3199 | pr-url: https://github.com/nodejs/node/pull/41263 | |
| 3197 | 3200 | description: The `requestTimeout`, `headersTimeout`, `keepAliveTimeout`, and | |
@@ -3229,6 +3232,10 @@ changes: | |||
| 3229 | 3232 | the complete HTTP headers from the client. | |
| 3230 | 3233 | See [`server.headersTimeout`][] for more information. | |
| 3231 | 3234 | **Default:** `60000`. | |
| 3235 | + * `highWaterMark` {number} Optionally overrides all `socket`s' | ||
| 3236 | + `readableHighWaterMark` and `writableHighWaterMark`. This affects | ||
| 3237 | + `highWaterMark` property of both `IncomingMessage` and `ServerResponse`. | ||
| 3238 | + **Default:** See [`stream.getDefaultHighWaterMark()`][]. | ||
| 3232 | 3239 | * `insecureHTTPParser` {boolean} Use an insecure HTTP parser that accepts | |
| 3233 | 3240 | invalid HTTP headers when `true`. Using the insecure parser should be | |
| 3234 | 3241 | avoided. See [`--insecure-http-parser`][] for more information. | |
@@ -3898,6 +3905,7 @@ Set the maximum number of idle HTTP parsers. | |||
| 3898 | 3905 | [`socket.setNoDelay()`]: net.md#socketsetnodelaynodelay | |
| 3899 | 3906 | [`socket.setTimeout()`]: net.md#socketsettimeouttimeout-callback | |
| 3900 | 3907 | [`socket.unref()`]: net.md#socketunref | |
| 3908 | + [`stream.getDefaultHighWaterMark()`]: stream.md#streamgetdefaulthighwatermarkobjectmode | ||
| 3901 | 3909 | [`url.parse()`]: url.md#urlparseurlstring-parsequerystring-slashesdenotehost | |
| 3902 | 3910 | [`writable.cork()`]: stream.md#writablecork | |
| 3903 | 3911 | [`writable.destroy()`]: stream.md#writabledestroyerror | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1539,6 +1539,9 @@ then returns the `net.Socket` that starts the connection. | |||
| 1539 | 1539 | <!-- YAML | |
| 1540 | 1540 | added: v0.5.0 | |
| 1541 | 1541 | changes: | |
| 1542 | + - version: REPLACEME | ||
| 1543 | + pr-url: https://github.com/nodejs/node/pull/47405 | ||
| 1544 | + description: The `highWaterMark` option is supported now. | ||
| 1542 | 1545 | - version: | |
| 1543 | 1546 | - v17.7.0 | |
| 1544 | 1547 | - v16.15.0 | |
@@ -1551,6 +1554,9 @@ changes: | |||
| 1551 | 1554 | * `allowHalfOpen` {boolean} If set to `false`, then the socket will | |
| 1552 | 1555 | automatically end the writable side when the readable side ends. | |
| 1553 | 1556 | **Default:** `false`. | |
| 1557 | + * `highWaterMark` {number} Optionally overrides all [`net.Socket`][]s' | ||
| 1558 | + `readableHighWaterMark` and `writableHighWaterMark`. | ||
| 1559 | + **Default:** See [`stream.getDefaultHighWaterMark()`][]. | ||
| 1554 | 1560 | * `pauseOnConnect` {boolean} Indicates whether the socket should be | |
| 1555 | 1561 | paused on incoming connections. **Default:** `false`. | |
| 1556 | 1562 | * `noDelay` {boolean} If set to `true`, it disables the use of Nagle's algorithm immediately | |
@@ -1780,6 +1786,7 @@ net.isIPv6('fhqwhgads'); // returns false | |||
| 1780 | 1786 | [`socket.setKeepAlive(enable, initialDelay)`]: #socketsetkeepaliveenable-initialdelay | |
| 1781 | 1787 | [`socket.setTimeout()`]: #socketsettimeouttimeout-callback | |
| 1782 | 1788 | [`socket.setTimeout(timeout)`]: #socketsettimeouttimeout-callback | |
| 1789 | + [`stream.getDefaultHighWaterMark()`]: stream.md#streamgetdefaulthighwatermarkobjectmode | ||
| 1783 | 1790 | [`writable.destroy()`]: stream.md#writabledestroyerror | |
| 1784 | 1791 | [`writable.destroyed`]: stream.md#writabledestroyed | |
| 1785 | 1792 | [`writable.end()`]: stream.md#writableendchunk-encoding-callback | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -101,7 +101,7 @@ function isContentDispositionField(s) { | |||
| 101 | 101 | return s.length === 19 && StringPrototypeToLowerCase(s) === 'content-disposition'; | |
| 102 | 102 | } | |
| 103 | 103 | ||
| 104 | - function OutgoingMessage() { | ||
| 104 | + function OutgoingMessage(options) { | ||
| 105 | 105 | Stream.call(this); | |
| 106 | 106 | ||
| 107 | 107 | // Queue that holds all currently pending data, until the response will be | |
@@ -149,7 +149,7 @@ function OutgoingMessage() { | |||
| 149 | 149 | this._onPendingData = nop; | |
| 150 | 150 | ||
| 151 | 151 | this[kErrored] = null; | |
| 152 | - this[kHighWaterMark] = getDefaultHighWaterMark(); | ||
| 152 | + this[kHighWaterMark] = options?.highWaterMark ?? getDefaultHighWaterMark(); | ||
| 153 | 153 | } | |
| 154 | 154 | ObjectSetPrototypeOf(OutgoingMessage.prototype, Stream.prototype); | |
| 155 | 155 | ObjectSetPrototypeOf(OutgoingMessage, Stream); | |
@@ -1171,6 +1171,7 @@ function(err, event) { | |||
| 1171 | 1171 | }; | |
| 1172 | 1172 | ||
| 1173 | 1173 | module.exports = { | |
| 1174 | + kHighWaterMark, | ||
| 1174 | 1175 | kUniqueHeaders, | |
| 1175 | 1176 | parseUniqueHeadersOption, | |
| 1176 | 1177 | validateHeaderName, | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -188,8 +188,8 @@ class HTTPServerAsyncResource { | |||
| 188 | 188 | } | |
| 189 | 189 | } | |
| 190 | 190 | ||
| 191 | - function ServerResponse(req) { | ||
| 192 | - OutgoingMessage.call(this); | ||
| 191 | + function ServerResponse(req, options) { | ||
| 192 | + OutgoingMessage.call(this, options); | ||
| 193 | 193 | ||
| 194 | 194 | if (req.method === 'HEAD') this._hasBody = false; | |
| 195 | 195 | ||
@@ -513,7 +513,8 @@ function Server(options, requestListener) { | |||
| 513 | 513 | this, | |
| 514 | 514 | { allowHalfOpen: true, noDelay: options.noDelay ?? true, | |
| 515 | 515 | keepAlive: options.keepAlive, | |
| 516 | - keepAliveInitialDelay: options.keepAliveInitialDelay }); | ||
| 516 | + keepAliveInitialDelay: options.keepAliveInitialDelay, | ||
| 517 | + highWaterMark: options.highWaterMark }); | ||
| 517 | 518 | ||
| 518 | 519 | if (requestListener) { | |
| 519 | 520 | this.on('request', requestListener); | |
@@ -1019,7 +1020,7 @@ function parserOnIncoming(server, socket, state, req, keepAlive) { | |||
| 1019 | 1020 | } | |
| 1020 | 1021 | } | |
| 1021 | 1022 | ||
| 1022 | - const res = new server[kServerResponse](req); | ||
| 1023 | + const res = new server[kServerResponse](req, { highWaterMark: socket.writableHighWaterMark }); | ||
| 1023 | 1024 | res._keepAliveTimeout = server.keepAliveTimeout; | |
| 1024 | 1025 | res._maxRequestsPerSocket = server.maxRequestsPerSocket; | |
| 1025 | 1026 | res._onPendingData = updateOutgoingData.bind(undefined, | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -54,6 +54,7 @@ let maxHeaderSize; | |||
| 54 | 54 | * maxHeaderSize?: number; | |
| 55 | 55 | * requireHostHeader?: boolean; | |
| 56 | 56 | * joinDuplicateHeaders?: boolean; | |
| 57 | + * highWaterMark?: number; | ||
| 57 | 58 | * }} [opts] | |
| 58 | 59 | * @param {Function} [requestListener] | |
| 59 | 60 | * @returns {Server} | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -154,6 +154,7 @@ const { | |||
| 154 | 154 | startPerf, | |
| 155 | 155 | stopPerf, | |
| 156 | 156 | } = require('internal/perf/observe'); | |
| 157 | + const { getDefaultHighWaterMark } = require('internal/streams/state'); | ||
| 157 | 158 | ||
| 158 | 159 | function getFlags(ipv6Only) { | |
| 159 | 160 | return ipv6Only === true ? TCPConstants.UV_TCP_IPV6ONLY : 0; | |
@@ -1682,6 +1683,15 @@ function Server(options, connectionListener) { | |||
| 1682 | 1683 | options.keepAliveInitialDelay = 0; | |
| 1683 | 1684 | } | |
| 1684 | 1685 | } | |
| 1686 | + if (typeof options.highWaterMark !== 'undefined') { | ||
| 1687 | + validateNumber( | ||
| 1688 | + options.highWaterMark, 'options.highWaterMark', | ||
| 1689 | + ); | ||
| 1690 | + | ||
| 1691 | + if (options.highWaterMark < 0) { | ||
| 1692 | + options.highWaterMark = getDefaultHighWaterMark(); | ||
| 1693 | + } | ||
| 1694 | + } | ||
| 1685 | 1695 | ||
| 1686 | 1696 | this._connections = 0; | |
| 1687 | 1697 | ||
@@ -1696,6 +1706,7 @@ function Server(options, connectionListener) { | |||
| 1696 | 1706 | this.noDelay = Boolean(options.noDelay); | |
| 1697 | 1707 | this.keepAlive = Boolean(options.keepAlive); | |
| 1698 | 1708 | this.keepAliveInitialDelay = ~~(options.keepAliveInitialDelay / 1000); | |
| 1709 | + this.highWaterMark = options.highWaterMark ?? getDefaultHighWaterMark(); | ||
| 1699 | 1710 | } | |
| 1700 | 1711 | ObjectSetPrototypeOf(Server.prototype, EventEmitter.prototype); | |
| 1701 | 1712 | ObjectSetPrototypeOf(Server, EventEmitter); | |
@@ -2077,6 +2088,8 @@ function onconnection(err, clientHandle) { | |||
| 2077 | 2088 | pauseOnCreate: self.pauseOnConnect, | |
| 2078 | 2089 | readable: true, | |
| 2079 | 2090 | writable: true, | |
| 2091 | + readableHighWaterMark: self.highWaterMark, | ||
| 2092 | + writableHighWaterMark: self.highWaterMark, | ||
| 2080 | 2093 | }); | |
| 2081 | 2094 | ||
| 2082 | 2095 | if (self.noDelay && clientHandle.setNoDelay) { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,47 @@ | |||
| 1 | + // Flags: --expose-internals | ||
| 2 | + 'use strict'; | ||
| 3 | + const common = require('../common'); | ||
| 4 | + const assert = require('assert'); | ||
| 5 | + const http = require('http'); | ||
| 6 | + const { kHighWaterMark } = require('_http_outgoing'); | ||
| 7 | + | ||
| 8 | + const { getDefaultHighWaterMark } = require('internal/streams/state'); | ||
| 9 | + | ||
| 10 | + function listen(server) { | ||
| 11 | + server.listen(0, common.mustCall(() => { | ||
| 12 | + http.get({ | ||
| 13 | + port: server.address().port, | ||
| 14 | + }, (res) => { | ||
| 15 | + assert.strictEqual(res.statusCode, 200); | ||
| 16 | + res.resume().on('end', common.mustCall(() => { | ||
| 17 | + server.close(); | ||
| 18 | + })); | ||
| 19 | + }); | ||
| 20 | + })); | ||
| 21 | + } | ||
| 22 | + | ||
| 23 | + { | ||
| 24 | + const server = http.createServer({ | ||
| 25 | + highWaterMark: getDefaultHighWaterMark() * 2, | ||
| 26 | + }, common.mustCall((req, res) => { | ||
| 27 | + assert.strictEqual(req._readableState.highWaterMark, getDefaultHighWaterMark() * 2); | ||
| 28 | + assert.strictEqual(res[kHighWaterMark], getDefaultHighWaterMark() * 2); | ||
| 29 | + res.statusCode = 200; | ||
| 30 | + res.end(); | ||
| 31 | + })); | ||
| 32 | + | ||
| 33 | + listen(server); | ||
| 34 | + } | ||
| 35 | + | ||
| 36 | + { | ||
| 37 | + const server = http.createServer( | ||
| 38 | + common.mustCall((req, res) => { | ||
| 39 | + assert.strictEqual(req._readableState.highWaterMark, getDefaultHighWaterMark()); | ||
| 40 | + assert.strictEqual(res[kHighWaterMark], getDefaultHighWaterMark()); | ||
| 41 | + res.statusCode = 200; | ||
| 42 | + res.end(); | ||
| 43 | + }) | ||
| 44 | + ); | ||
| 45 | + | ||
| 46 | + listen(server); | ||
| 47 | + } | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments