From e848ee8553bee236df6ff4fd45ed160e53f1d0f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Mon, 11 Sep 2023 16:01:29 +0200 Subject: [PATCH] feat: revert `.getAll` removal, mark deprecated (#597) * feat: revert `.getAll` removal, mark deprecated * add changelog * Update fetch.js * fix imports * add test * Update slimy-seals-confess.md --- .changeset/slimy-seals-confess.md | 5 +++ .../integration-tests/tests/response.test.ts | 5 +++ packages/primitives/src/primitives/fetch.js | 39 +++++++++++++++++++ .../primitives/type-definitions/fetch.d.ts | 5 ++- 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 .changeset/slimy-seals-confess.md diff --git a/.changeset/slimy-seals-confess.md b/.changeset/slimy-seals-confess.md new file mode 100644 index 00000000..6a9bcfec --- /dev/null +++ b/.changeset/slimy-seals-confess.md @@ -0,0 +1,5 @@ +--- +'@edge-runtime/primitives': patch +--- + +Reverts the removal of `Headers#getAll` introduced in #586 for compatibility reasons. It is still marked as deprecated, as `Headers.getSetCookie` is the preferred method now. diff --git a/packages/integration-tests/tests/response.test.ts b/packages/integration-tests/tests/response.test.ts index 125d13b1..4f820e09 100644 --- a/packages/integration-tests/tests/response.test.ts +++ b/packages/integration-tests/tests/response.test.ts @@ -12,6 +12,11 @@ test('allow to append multiple `set-cookie` header', async () => { response.headers.append('set-cookie', 'bar=baz') expect(response.headers.getSetCookie()).toEqual(['foo=bar', 'bar=baz']) + + expect(response.headers.getAll?.('set-cookie')).toEqual([ + 'foo=bar', + 'bar=baz', + ]) }) test('disallow mutate response headers for redirects', async () => { diff --git a/packages/primitives/src/primitives/fetch.js b/packages/primitives/src/primitives/fetch.js index 11a3de70..510c6fd6 100644 --- a/packages/primitives/src/primitives/fetch.js +++ b/packages/primitives/src/primitives/fetch.js @@ -1,6 +1,8 @@ import * as FetchSymbols from 'undici/lib/fetch/symbols' import * as HeadersModule from 'undici/lib/fetch/headers' import * as ResponseModule from 'undici/lib/fetch/response' +import * as UtilModule from 'undici/lib/fetch/util' +import * as WebIDLModule from 'undici/lib/fetch/webidl' import { Request as BaseRequest } from 'undici/lib/fetch/request' import { fetch as fetchImpl } from 'undici/lib/fetch' @@ -43,6 +45,22 @@ HeadersModule.Headers.prototype.values = function* () { } } +/** + * Method for retrieving all independent `set-cookie` headers that + * may have been appended. This will only work when getting `set-cookie` + * headers. + * + * @deprecated Use [`.getSetCookie()`](https://developer.mozilla.org/en-US/docs/Web/API/Headers/getSetCookie) instead. + */ +HeadersModule.Headers.prototype.getAll = function (name) { + const _name = normalizeAndValidateHeaderName(name, 'Headers.getAll') + if (_name !== 'set-cookie') { + throw new Error(`getAll can only be used with 'set-cookie'`) + } + + return this.getSetCookie() +} + /** * We also must patch the error static method since it works just like * redirect and we need consistency. @@ -54,6 +72,27 @@ ResponseModule.Response.error = function (...args) { return response } +/** + * normalize header name per WHATWG spec, and validate + * + * @param {string} potentialName + * @param {'Header.append' | 'Headers.delete' | 'Headers.get' | 'Headers.has' | 'Header.set'} errorPrefix + */ +function normalizeAndValidateHeaderName(potentialName, errorPrefix) { + const normalizedName = potentialName.toLowerCase() + + if (UtilModule.isValidHeaderName(normalizedName)) { + return normalizedName + } + + // Generate an WHATWG fetch spec compliant error + WebIDLModule.errors.invalidArgument({ + prefix: errorPrefix, + value: normalizedName, + type: 'header name', + }) +} + /** * A global agent to be used with every fetch request. We also define a * couple of globals that we can hide in the runtime for advanced use. diff --git a/packages/primitives/type-definitions/fetch.d.ts b/packages/primitives/type-definitions/fetch.d.ts index fa9ae212..bd096340 100644 --- a/packages/primitives/type-definitions/fetch.d.ts +++ b/packages/primitives/type-definitions/fetch.d.ts @@ -1,4 +1,7 @@ -export class Headers extends globalThis.Headers {} +export class Headers extends globalThis.Headers { + /** @deprecated Use [`.getSetCookie()`](https://developer.mozilla.org/en-US/docs/Web/API/Headers/getSetCookie) instead. */ + getAll?(key: 'set-cookie'): string[] +} export class Request extends globalThis.Request { readonly headers: Headers