mirror of
https://github.com/nodejs/node.git
synced 2026-10-14 10:26:26 -04:00
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:
1 parent
7c3ce9db30
commit
0d474327a2
1 file changed
+56
-6
+56
-6
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user