http: lazy create IncomingMessage.headers

When rawHeaders is enough don't create the headers object.

PR-URL: https://github.com/nodejs/node/pull/35281
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
Robert Nagy committed 2020-10-27 09:29:32 +01:00
1 parent 7c3ce9db30
commit 0d474327a2
1 file changed
+56 -6
+56 -6
View File
@@ -24,10 +24,16 @@
const {
ObjectDefineProperty,
ObjectSetPrototypeOf,
Symbol
} = primordials;
const Stream = require('stream');
const kHeaders = Symbol('kHeaders');
const kHeadersCount = Symbol('kHeadersCount');
const kTrailers = Symbol('kTrailers');
const kTrailersCount = Symbol('kTrailersCount');
function readStart(socket) {
if (socket && !socket._paused && socket.readable)
socket.resume();
@@ -58,9 +64,11 @@ function IncomingMessage(socket) {
this.httpVersionMinor = null;
this.httpVersion = null;
this.complete = false;
this.headers = {};
this[kHeaders] = null;
this[kHeadersCount] = 0;
this.rawHeaders = [];
this.trailers = {};
this[kTrailers] = null;
this[kTrailersCount] = 0;
this.rawTrailers = [];
this.aborted = false;
@@ -93,6 +101,44 @@ ObjectDefineProperty(IncomingMessage.prototype, 'connection', {
}
});
ObjectDefineProperty(IncomingMessage.prototype, 'headers', {
get: function() {
if (!this[kHeaders]) {
this[kHeaders] = {};
const src = this.rawHeaders;
const dst = this[kHeaders];
for (let n = 0; n < this[kHeadersCount]; n += 2) {
this._addHeaderLine(src[n + 0], src[n + 1], dst);
}
}
return this[kHeaders];
},
set: function(val) {
this[kHeaders] = val;
}
});
ObjectDefineProperty(IncomingMessage.prototype, 'trailers', {
get: function() {
if (!this[kTrailers]) {
this[kTrailers] = {};
const src = this.rawTrailers;
const dst = this[kTrailers];
for (let n = 0; n < this[kTrailersCount]; n += 2) {
this._addHeaderLine(src[n + 0], src[n + 1], dst);
}
}
return this[kTrailers];
},
set: function(val) {
this[kTrailers] = val;
}
});
IncomingMessage.prototype.setTimeout = function setTimeout(msecs, callback) {
if (callback)
this.on('timeout', callback);
@@ -133,14 +179,18 @@ function _addHeaderLines(headers, n) {
let dest;
if (this.complete) {
this.rawTrailers = headers;
dest = this.trailers;
this[kTrailersCount] = n;
dest = this[kTrailers];
} else {
this.rawHeaders = headers;
dest = this.headers;
this[kHeadersCount] = n;
dest = this[kHeaders];
}
for (let i = 0; i < n; i += 2) {
this._addHeaderLine(headers[i], headers[i + 1], dest);
if (dest) {
for (let i = 0; i < n; i += 2) {
this._addHeaderLine(headers[i], headers[i + 1], dest);
}
}
}
}