perf(ext/http): lazy load headers (#15055)

This commit is contained in:
Divy Srivastava 2022-07-04 07:41:52 +05:30 committed by GitHub
parent 2c2126918b
commit a2643ae7bd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 50 additions and 12 deletions

View file

@ -43,6 +43,8 @@
const _request = Symbol("request");
const _headers = Symbol("headers");
const _getHeaders = Symbol("get headers");
const _headersCache = Symbol("headers cache");
const _signal = Symbol("signal");
const _mimeType = Symbol("mime type");
const _body = Symbol("body");
@ -52,7 +54,7 @@
* @property {string} method
* @property {() => string} url
* @property {() => string} currentUrl
* @property {[string, string][]} headerList
* @property {() => [string, string][]} headerList
* @property {null | typeof __window.bootstrap.fetchBody.InnerBody} body
* @property {"follow" | "error" | "manual"} redirectMode
* @property {number} redirectCount
@ -64,7 +66,7 @@
/**
* @param {string} method
* @param {string} url
* @param {[string, string][]} headerList
* @param {() => [string, string][]} headerList
* @param {typeof __window.bootstrap.fetchBody.InnerBody} body
* @param {boolean} maybeBlob
* @returns
@ -76,7 +78,16 @@
}
return {
method,
headerList,
headerListInner: null,
get headerList() {
if (this.headerListInner === null) {
this.headerListInner = headerList();
}
return this.headerListInner;
},
set headerList(value) {
this.headerListInner = value;
},
body,
redirectMode: "follow",
redirectCount: 0,
@ -167,7 +178,21 @@
/** @type {InnerRequest} */
[_request];
/** @type {Headers} */
[_headers];
[_headersCache];
[_getHeaders];
/** @type {Headers} */
get [_headers]() {
if (this[_headersCache] === undefined) {
this[_headersCache] = this[_getHeaders]();
}
return this[_headersCache];
}
set [_headers](value) {
this[_headersCache] = value;
}
/** @type {AbortSignal} */
[_signal];
get [_mimeType]() {
@ -210,7 +235,7 @@
// 5.
if (typeof input === "string") {
const parsedURL = new URL(input, baseURL);
request = newInnerRequest("GET", parsedURL.href, [], null, true);
request = newInnerRequest("GET", parsedURL.href, () => [], null, true);
} else { // 6.
if (!ObjectPrototypeIsPrototypeOf(RequestPrototype, input)) {
throw new TypeError("Unreachable");
@ -451,7 +476,7 @@
const request = webidl.createBranded(Request);
request[_request] = inner;
request[_signal] = signal;
request[_headers] = headersFromHeaderList(inner.headerList, guard);
request[_getHeaders] = () => headersFromHeaderList(inner.headerList, guard);
return request;
}