| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 6bafd35 commit c5edeb9
5 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -30,7 +30,6 @@ const { | |||
| 30 | 30 | _checkIsHttpToken: checkIsHttpToken, | |
| 31 | 31 | debug, | |
| 32 | 32 | freeParser, | |
| 33 | - httpSocketSetup, | ||
| 34 | 33 | parsers, | |
| 35 | 34 | HTTPParser, | |
| 36 | 35 | prepareError, | |
@@ -40,7 +39,7 @@ const Agent = require('_http_agent'); | |||
| 40 | 39 | const { Buffer } = require('buffer'); | |
| 41 | 40 | const { defaultTriggerAsyncIdScope } = require('internal/async_hooks'); | |
| 42 | 41 | const { URL, urlToOptions, searchParamsSymbol } = require('internal/url'); | |
| 43 | - const { kOutHeaders, ondrain } = require('internal/http'); | ||
| 42 | + const { kOutHeaders, kNeedDrain } = require('internal/http'); | ||
| 44 | 43 | const { connResetException, codes } = require('internal/errors'); | |
| 45 | 44 | const { | |
| 46 | 45 | ERR_HTTP_HEADERS_SENT, | |
@@ -335,6 +334,14 @@ function emitAbortNT() { | |||
| 335 | 334 | this.emit('abort'); | |
| 336 | 335 | } | |
| 337 | 336 | ||
| 337 | + function ondrain() { | ||
| 338 | + const msg = this._httpMessage; | ||
| 339 | + if (msg && !msg.finished && msg[kNeedDrain]) { | ||
| 340 | + msg[kNeedDrain] = false; | ||
| 341 | + msg.emit('drain'); | ||
| 342 | + } | ||
| 343 | + } | ||
| 344 | + | ||
| 338 | 345 | function socketCloseListener() { | |
| 339 | 346 | const socket = this; | |
| 340 | 347 | const req = socket._httpMessage; | |
@@ -649,9 +656,6 @@ function tickOnSocket(req, socket) { | |||
| 649 | 656 | socket.parser = parser; | |
| 650 | 657 | socket._httpMessage = req; | |
| 651 | 658 | ||
| 652 | - // Setup "drain" propagation. | ||
| 653 | - httpSocketSetup(socket); | ||
| 654 | - | ||
| 655 | 659 | // Propagate headers limit from request object to parser | |
| 656 | 660 | if (typeof req.maxHeadersCount === 'number') { | |
| 657 | 661 | parser.maxHeaderPairs = req.maxHeadersCount << 1; | |
@@ -663,6 +667,7 @@ function tickOnSocket(req, socket) { | |||
| 663 | 667 | socket.on('data', socketOnData); | |
| 664 | 668 | socket.on('end', socketOnEnd); | |
| 665 | 669 | socket.on('close', socketCloseListener); | |
| 670 | + socket.on('drain', ondrain); | ||
| 666 | 671 | ||
| 667 | 672 | if ( | |
| 668 | 673 | req.timeout !== undefined || | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -31,7 +31,6 @@ const { methods, HTTPParser } = | |||
| 31 | 31 | internalBinding('http_parser') : internalBinding('http_parser_llhttp'); | |
| 32 | 32 | ||
| 33 | 33 | const FreeList = require('internal/freelist'); | |
| 34 | - const { ondrain } = require('internal/http'); | ||
| 35 | 34 | const incoming = require('_http_incoming'); | |
| 36 | 35 | const { | |
| 37 | 36 | IncomingMessage, | |
@@ -201,12 +200,6 @@ function freeParser(parser, req, socket) { | |||
| 201 | 200 | } | |
| 202 | 201 | } | |
| 203 | 202 | ||
| 204 | - | ||
| 205 | - function httpSocketSetup(socket) { | ||
| 206 | - socket.removeListener('drain', ondrain); | ||
| 207 | - socket.on('drain', ondrain); | ||
| 208 | - } | ||
| 209 | - | ||
| 210 | 203 | const tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/; | |
| 211 | 204 | /** | |
| 212 | 205 | * Verifies that the given val is a valid HTTP token | |
@@ -253,7 +246,6 @@ module.exports = { | |||
| 253 | 246 | CRLF: '\r\n', | |
| 254 | 247 | debug, | |
| 255 | 248 | freeParser, | |
| 256 | - httpSocketSetup, | ||
| 257 | 249 | methods, | |
| 258 | 250 | parsers, | |
| 259 | 251 | kIncomingMessage, | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -27,7 +27,7 @@ const { getDefaultHighWaterMark } = require('internal/streams/state'); | |||
| 27 | 27 | const assert = require('internal/assert'); | |
| 28 | 28 | const Stream = require('stream'); | |
| 29 | 29 | const internalUtil = require('internal/util'); | |
| 30 | - const { kOutHeaders, utcDate } = require('internal/http'); | ||
| 30 | + const { kOutHeaders, utcDate, kNeedDrain } = require('internal/http'); | ||
| 31 | 31 | const { Buffer } = require('buffer'); | |
| 32 | 32 | const common = require('_http_common'); | |
| 33 | 33 | const checkIsHttpToken = common._checkIsHttpToken; | |
@@ -96,6 +96,7 @@ function OutgoingMessage() { | |||
| 96 | 96 | this._contentLength = null; | |
| 97 | 97 | this._hasBody = true; | |
| 98 | 98 | this._trailer = ''; | |
| 99 | + this[kNeedDrain] = false; | ||
| 99 | 100 | ||
| 100 | 101 | this.finished = false; | |
| 101 | 102 | this._headerSent = false; | |
@@ -582,7 +583,10 @@ Object.defineProperty(OutgoingMessage.prototype, 'writableEnded', { | |||
| 582 | 583 | ||
| 583 | 584 | const crlf_buf = Buffer.from('\r\n'); | |
| 584 | 585 | OutgoingMessage.prototype.write = function write(chunk, encoding, callback) { | |
| 585 | - return write_(this, chunk, encoding, callback, false); | ||
| 586 | + const ret = write_(this, chunk, encoding, callback, false); | ||
| 587 | + if (!ret) | ||
| 588 | + this[kNeedDrain] = true; | ||
| 589 | + return ret; | ||
| 586 | 590 | }; | |
| 587 | 591 | ||
| 588 | 592 | function write_(msg, chunk, encoding, callback, fromEnd) { | |
@@ -782,8 +786,8 @@ OutgoingMessage.prototype._flush = function _flush() { | |||
| 782 | 786 | if (this.finished) { | |
| 783 | 787 | // This is a queue to the server or client to bring in the next this. | |
| 784 | 788 | this._finish(); | |
| 785 | - } else if (ret) { | ||
| 786 | - // This is necessary to prevent https from breaking | ||
| 789 | + } else if (ret && this[kNeedDrain]) { | ||
| 790 | + this[kNeedDrain] = false; | ||
| 787 | 791 | this.emit('drain'); | |
| 788 | 792 | } | |
| 789 | 793 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -32,7 +32,6 @@ const { | |||
| 32 | 32 | CRLF, | |
| 33 | 33 | continueExpression, | |
| 34 | 34 | chunkExpression, | |
| 35 | - httpSocketSetup, | ||
| 36 | 35 | kIncomingMessage, | |
| 37 | 36 | HTTPParser, | |
| 38 | 37 | _checkInvalidHeaderChar: checkInvalidHeaderChar, | |
@@ -41,7 +40,7 @@ const { | |||
| 41 | 40 | const { OutgoingMessage } = require('_http_outgoing'); | |
| 42 | 41 | const { | |
| 43 | 42 | kOutHeaders, | |
| 44 | - ondrain, | ||
| 43 | + kNeedDrain, | ||
| 45 | 44 | nowDate, | |
| 46 | 45 | emitStatistics | |
| 47 | 46 | } = require('internal/http'); | |
@@ -363,8 +362,6 @@ function connectionListener(socket) { | |||
| 363 | 362 | function connectionListenerInternal(server, socket) { | |
| 364 | 363 | debug('SERVER new http connection'); | |
| 365 | 364 | ||
| 366 | - httpSocketSetup(socket); | ||
| 367 | - | ||
| 368 | 365 | // Ensure that the server property of the socket is correctly set. | |
| 369 | 366 | // See https://github.com/nodejs/node/issues/13435 | |
| 370 | 367 | if (socket.server === null) | |
@@ -459,6 +456,12 @@ function socketOnDrain(socket, state) { | |||
| 459 | 456 | socket.parser.resume(); | |
| 460 | 457 | socket.resume(); | |
| 461 | 458 | } | |
| 459 | + | ||
| 460 | + const msg = socket._httpMessage; | ||
| 461 | + if (msg && !msg.finished && msg[kNeedDrain]) { | ||
| 462 | + msg[kNeedDrain] = false; | ||
| 463 | + msg.emit('drain'); | ||
| 464 | + } | ||
| 462 | 465 | } | |
| 463 | 466 | ||
| 464 | 467 | function socketOnTimeout() { | |
@@ -585,7 +588,6 @@ function onParserExecuteCommon(server, socket, parser, state, ret, d) { | |||
| 585 | 588 | socket.removeListener('end', state.onEnd); | |
| 586 | 589 | socket.removeListener('close', state.onClose); | |
| 587 | 590 | socket.removeListener('drain', state.onDrain); | |
| 588 | - socket.removeListener('drain', ondrain); | ||
| 589 | 591 | socket.removeListener('error', socketOnError); | |
| 590 | 592 | unconsume(parser, socket); | |
| 591 | 593 | parser.finish(); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -28,10 +28,6 @@ function resetCache() { | |||
| 28 | 28 | utcCache = undefined; | |
| 29 | 29 | } | |
| 30 | 30 | ||
| 31 | - function ondrain() { | ||
| 32 | - if (this._httpMessage) this._httpMessage.emit('drain'); | ||
| 33 | - } | ||
| 34 | - | ||
| 35 | 31 | class HttpRequestTiming extends PerformanceEntry { | |
| 36 | 32 | constructor(statistics) { | |
| 37 | 33 | super(); | |
@@ -50,7 +46,7 @@ function emitStatistics(statistics) { | |||
| 50 | 46 | ||
| 51 | 47 | module.exports = { | |
| 52 | 48 | kOutHeaders: Symbol('kOutHeaders'), | |
| 53 | - ondrain, | ||
| 49 | + kNeedDrain: Symbol('kNeedDrain'), | ||
| 54 | 50 | nowDate, | |
| 55 | 51 | utcDate, | |
| 56 | 52 | emitStatistics | |
| Back | FazBrowse Home | New Git URL |
0 commit comments