diff options
Diffstat (limited to 'ext/fetch/23_request.js')
-rw-r--r-- | ext/fetch/23_request.js | 37 |
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; } |