From 141be651b8709dbce9186df1733db19c7ea3a913 Mon Sep 17 00:00:00 2001 From: tsctx <91457664+tsctx@users.noreply.github.com> Date: Wed, 24 Jan 2024 23:22:14 +0900 Subject: [PATCH 1/5] refactor: use fromInnerResponse --- lib/cache/cache.js | 12 +++------- lib/fetch/index.js | 17 ++++--------- lib/fetch/response.js | 55 +++++++++++++++++++------------------------ 3 files changed, 32 insertions(+), 52 deletions(-) diff --git a/lib/cache/cache.js b/lib/cache/cache.js index 423fef422a6..b49822edf4e 100644 --- a/lib/cache/cache.js +++ b/lib/cache/cache.js @@ -3,12 +3,10 @@ const { kConstruct } = require('./symbols') const { urlEquals, fieldValues: getFieldValues } = require('./util') const { kEnumerableProperty, isDisturbed } = require('../core/util') -const { kHeadersList } = require('../core/symbols') const { webidl } = require('../fetch/webidl') -const { Response, cloneResponse } = require('../fetch/response') +const { Response, cloneResponse, fromInnerResponse } = require('../fetch/response') const { Request, fromInnerRequest } = require('../fetch/request') -const { Headers } = require('../fetch/headers') -const { kState, kHeaders, kGuard } = require('../fetch/symbols') +const { kState } = require('../fetch/symbols') const { fetching } = require('../fetch/index') const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = require('../fetch/util') const assert = require('assert') @@ -783,11 +781,7 @@ class Cache { // 5.5.2 for (const response of responses) { // 5.5.2.1 - const responseObject = new Response(kConstruct) - responseObject[kState] = response - responseObject[kHeaders] = new Headers(kConstruct) - responseObject[kHeaders][kHeadersList] = response.headersList - responseObject[kHeaders][kGuard] = 'immutable' + const responseObject = fromInnerResponse(response, 'immutable') responseList.push(responseObject.clone()) diff --git a/lib/fetch/index.js b/lib/fetch/index.js index 75939e18599..eeb7553c16a 100644 --- a/lib/fetch/index.js +++ b/lib/fetch/index.js @@ -3,13 +3,13 @@ 'use strict' const { - Response, makeNetworkError, makeAppropriateNetworkError, filterResponse, - makeResponse + makeResponse, + fromInnerResponse } = require('./response') -const { Headers, HeadersList } = require('./headers') +const { HeadersList } = require('./headers') const { Request, makeRequest } = require('./request') const zlib = require('zlib') const { @@ -45,7 +45,7 @@ const { simpleRangeHeaderValue, buildContentRange } = require('./util') -const { kState, kHeaders, kGuard, kRealm } = require('./symbols') +const { kState } = require('./symbols') const assert = require('assert') const { safelyExtractBody, extractBody } = require('./body') const { @@ -55,7 +55,6 @@ const { requestBodyHeader, subresourceSet } = require('./constants') -const { kHeadersList, kConstruct } = require('../core/symbols') const EE = require('events') const { Readable, pipeline } = require('stream') const { addAbortListener, isErrored, isReadable, nodeMajor, nodeMinor, bufferToLowerCasedHeaderName } = require('../core/util') @@ -232,13 +231,7 @@ function fetch (input, init = undefined) { // 4. Set responseObject to the result of creating a Response object, // given response, "immutable", and relevantRealm. - responseObject = new Response(kConstruct) - responseObject[kState] = response - responseObject[kRealm] = relevantRealm - responseObject[kHeaders] = new Headers(kConstruct) - responseObject[kHeaders][kHeadersList] = response.headersList - responseObject[kHeaders][kGuard] = 'immutable' - responseObject[kHeaders][kRealm] = relevantRealm + responseObject = fromInnerResponse(response, 'immutable', relevantRealm) // 5. Resolve p with responseObject. p.resolve(responseObject) diff --git a/lib/fetch/response.js b/lib/fetch/response.js index 29d3ac44c8a..96ab43908fe 100644 --- a/lib/fetch/response.js +++ b/lib/fetch/response.js @@ -38,13 +38,8 @@ class Response { // The static error() method steps are to return the result of creating a // Response object, given a new network error, "immutable", and this’s // relevant Realm. - const responseObject = new Response(kConstruct) - responseObject[kState] = makeNetworkError() - responseObject[kRealm] = relevantRealm - responseObject[kHeaders] = new Headers(kConstruct) - responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList - responseObject[kHeaders][kGuard] = 'immutable' - responseObject[kHeaders][kRealm] = relevantRealm + const responseObject = fromInnerResponse(makeNetworkError(), 'immutable', relevantRealm) + return responseObject } @@ -67,13 +62,7 @@ class Response { // 3. Let responseObject be the result of creating a Response object, given a new response, // "response", and this’s relevant Realm. const relevantRealm = { settingsObject: {} } - const responseObject = new Response(kConstruct) - responseObject[kState] = makeResponse({}) - responseObject[kRealm] = relevantRealm - responseObject[kHeaders] = new Headers(kConstruct) - responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList - responseObject[kHeaders][kGuard] = 'response' - responseObject[kHeaders][kRealm] = relevantRealm + const responseObject = fromInnerResponse(makeResponse({}), 'response', relevantRealm) // 4. Perform initialize a response given responseObject, init, and (body, "application/json"). initializeResponse(responseObject, init, { body: body[0], type: 'application/json' }) @@ -111,13 +100,7 @@ class Response { // 4. Let responseObject be the result of creating a Response object, // given a new response, "immutable", and this’s relevant Realm. - const responseObject = new Response(kConstruct) - responseObject[kState] = makeResponse({}) - responseObject[kRealm] = relevantRealm - responseObject[kHeaders] = new Headers(kConstruct) - responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList - responseObject[kHeaders][kGuard] = 'immutable' - responseObject[kHeaders][kRealm] = relevantRealm + const responseObject = fromInnerResponse(makeResponse({}), 'immutable', relevantRealm) // 5. Set responseObject’s response’s status to status. responseObject[kState].status = status @@ -269,15 +252,7 @@ class Response { // 3. Return the result of creating a Response object, given // clonedResponse, this’s headers’s guard, and this’s relevant Realm. - const clonedResponseObject = new Response(kConstruct) - clonedResponseObject[kState] = clonedResponse - clonedResponseObject[kRealm] = this[kRealm] - clonedResponseObject[kHeaders] = new Headers(kConstruct) - clonedResponseObject[kHeaders][kHeadersList] = clonedResponse.headersList - clonedResponseObject[kHeaders][kGuard] = this[kHeaders][kGuard] - clonedResponseObject[kHeaders][kRealm] = this[kHeaders][kRealm] - - return clonedResponseObject + return fromInnerResponse(clonedResponse, this[kHeaders][kGuard], this[kRealm]) } } @@ -512,6 +487,23 @@ function initializeResponse (response, init, body) { } } +/** + * @param {any} innerResponse + * @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard + * @param {any} [realm] + * @returns {Response} + */ +function fromInnerResponse (innerResponse, guard, realm) { + const response = new Response(kConstruct) + response[kState] = innerResponse + response[kRealm] = realm + response[kHeaders] = new Headers(kConstruct) + response[kHeaders][kHeadersList] = innerResponse.headersList + response[kHeaders][kGuard] = guard + response[kHeaders][kRealm] = realm + return response +} + webidl.converters.ReadableStream = webidl.interfaceConverter( ReadableStream ) @@ -588,5 +580,6 @@ module.exports = { makeAppropriateNetworkError, filterResponse, Response, - cloneResponse + cloneResponse, + fromInnerResponse } From b90dcc7e3add9c604b15f697d2fac34025b1893c Mon Sep 17 00:00:00 2001 From: tsctx <91457664+tsctx@users.noreply.github.com> Date: Wed, 24 Jan 2024 23:29:34 +0900 Subject: [PATCH 2/5] test: add --- test/fetch/response.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/fetch/response.js b/test/fetch/response.js index c22a649ff28..68f76fbe045 100644 --- a/test/fetch/response.js +++ b/test/fetch/response.js @@ -7,10 +7,13 @@ const { Response, FormData } = require('../../') +const { fromInnerResponse, makeResponse } = require('../../lib/fetch/response') const { Blob: ThirdPartyBlob, FormData: ThirdPartyFormData } = require('formdata-node') +const { kState, kGuard, kRealm, kHeaders } = require('../../lib/fetch/symbols') +const { kHeadersList } = require('../../lib/core/symbols') test('arg validation', async () => { // constructor @@ -269,3 +272,19 @@ test('Check the Content-Type of invalid formData', async (t) => { await rejects(response.formData(), TypeError) }) }) + +test('fromInnerResponse', () => { + const realm = { settingsObject: {} } + const innerResponse = makeResponse({ + urlList: [new URL('http://asd')] + }) + + const response = fromInnerResponse(innerResponse, 'immutable', realm) + + // check property + assert.strictEqual(response[kState], innerResponse) + assert.strictEqual(response[kRealm], realm) + assert.strictEqual(response[kHeaders][kHeadersList], innerResponse.headersList) + assert.strictEqual(response[kHeaders][kGuard], 'immutable') + assert.strictEqual(response[kHeaders][kRealm], realm) +}) From e154f8019c05777023a8056af591ff541011722d Mon Sep 17 00:00:00 2001 From: tsctx <91457664+tsctx@users.noreply.github.com> Date: Fri, 26 Jan 2024 13:18:20 +0900 Subject: [PATCH 3/5] Update lib/cache/cache.js --- lib/cache/cache.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cache/cache.js b/lib/cache/cache.js index b49822edf4e..a36ed6c23ae 100644 --- a/lib/cache/cache.js +++ b/lib/cache/cache.js @@ -781,7 +781,7 @@ class Cache { // 5.5.2 for (const response of responses) { // 5.5.2.1 - const responseObject = fromInnerResponse(response, 'immutable') + const responseObject = fromInnerResponse(response, 'immutable', { settingsObject: {} }) responseList.push(responseObject.clone()) From 52f7ff7049ff01199ca668a35163f138d6e9a05c Mon Sep 17 00:00:00 2001 From: tsctx <91457664+tsctx@users.noreply.github.com> Date: Sat, 27 Jan 2024 12:59:12 +0900 Subject: [PATCH 4/5] Update lib/fetch/response.js --- lib/fetch/response.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/fetch/response.js b/lib/fetch/response.js index 96ab43908fe..b8fc425891e 100644 --- a/lib/fetch/response.js +++ b/lib/fetch/response.js @@ -488,6 +488,7 @@ function initializeResponse (response, init, body) { } /** + * @see https://fetch.spec.whatwg.org/#response-create * @param {any} innerResponse * @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard * @param {any} [realm] From 3a7f1e0b4d45fe15e29316e1679b998e0f262097 Mon Sep 17 00:00:00 2001 From: tsctx <91457664+tsctx@users.noreply.github.com> Date: Sat, 27 Jan 2024 13:03:59 +0900 Subject: [PATCH 5/5] Update request.js --- lib/fetch/request.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/fetch/request.js b/lib/fetch/request.js index db8ec6f28ff..a23e6644c11 100644 --- a/lib/fetch/request.js +++ b/lib/fetch/request.js @@ -836,6 +836,7 @@ function cloneRequest (request) { } /** + * @see https://fetch.spec.whatwg.org/#request-create * @param {any} innerRequest * @param {AbortSignal} signal * @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard