summaryrefslogtreecommitdiff
path: root/ext/fetch/23_request.js
diff options
context:
space:
mode:
authorDivy Srivastava <dj.srivastava23@gmail.com>2022-07-04 07:41:52 +0530
committerGitHub <noreply@github.com>2022-07-04 07:41:52 +0530
commita2643ae7bd92d006ac099483b14f709c0b5ec2ed (patch)
tree9321e0a203283110e2ac5b6235c9f979661e2896 /ext/fetch/23_request.js
parent2c2126918bafadca43e6b4bb8daaca40afc2ee98 (diff)
perf(ext/http): lazy load headers (#15055)
Diffstat (limited to 'ext/fetch/23_request.js')
-rw-r--r--ext/fetch/23_request.js37
1 files changed, 31 insertions, 6 deletions
diff --git a/ext/fetch/23_request.js b/ext/fetch/23_request.js
index b61f46c61..3058db6f7 100644
--- a/ext/fetch/23_request.js
+++ b/ext/fetch/23_request.js
@@ -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;
}