diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index 52b3a9006c280a..fee6c04ab85cbd 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -13,14 +13,6 @@ const checkInvalidHeaderChar = common._checkInvalidHeaderChar; const CRLF = common.CRLF; const debug = common.debug; - -const automaticHeaders = { - connection: true, - 'content-length': true, - 'transfer-encoding': true, - date: true -}; - var RE_FIELDS = new RegExp('^(?:Connection|Transfer-Encoding|Content-Length|' + 'Date|Expect|Trailer|Upgrade)$', 'i'); var RE_CONN_VALUES = /(?:^|\W)close|upgrade(?:$|\W)/ig; @@ -64,7 +56,9 @@ function OutgoingMessage() { this.shouldKeepAlive = true; this.useChunkedEncodingByDefault = true; this.sendDate = false; - this._removedHeader = {}; + this._removedConnection = false; + this._removedContLen = false; + this._removedTE = false; this._contentLength = null; this._hasBody = true; @@ -279,7 +273,7 @@ function _storeHeader(firstLine, headers) { } // keep-alive logic - if (this._removedHeader.connection) { + if (this._removedConnection) { this._last = true; this.shouldKeepAlive = false; } else if (!state.connection) { @@ -300,11 +294,11 @@ function _storeHeader(firstLine, headers) { } else if (!this.useChunkedEncodingByDefault) { this._last = true; } else { - !this._removedHeader['content-length'] && if (!state.trailer && + !this._removedContLen && typeof this._contentLength === 'number') { - } else if (!this._removedHeader['transfer-encoding']) { state.header += 'Content-Length: ' + this._contentLength + CRLF; + } else if (!this._removedTE) { state.header += 'Transfer-Encoding: chunked\r\n'; this.chunkedEncoding = true; } else { @@ -405,8 +399,20 @@ OutgoingMessage.prototype.setHeader = function setHeader(name, value) { const key = name.toLowerCase(); this._headers[key] = [name, value]; - if (automaticHeaders[key]) - this._removedHeader[key] = false; + switch (key.length) { + case 10: + if (key === 'connection') + this._removedConnection = false; + break; + case 14: + if (key === 'content-length') + this._removedContLen = false; + break; + case 17: + if (key === 'transfer-encoding') + this._removedTE = false; + break; + } }; @@ -435,10 +441,24 @@ OutgoingMessage.prototype.removeHeader = function removeHeader(name) { var key = name.toLowerCase(); - if (key === 'date') - this.sendDate = false; - else if (automaticHeaders[key]) - this._removedHeader[key] = true; + switch (key.length) { + case 10: + if (key === 'connection') + this._removedConnection = true; + break; + case 14: + if (key === 'content-length') + this._removedContLen = true; + break; + case 17: + if (key === 'transfer-encoding') + this._removedTE = true; + break; + case 4: + if (key === 'date') + this.sendDate = false; + break; + } if (this._headers) { delete this._headers[key];