Skip to content

Commit eff836f

Browse files
thewilkybarkideffect-bot
authored andcommitted
Allow removing multiple Headers (#4627)
1 parent ff3f6bc commit eff836f

File tree

3 files changed

+84
-5
lines changed

3 files changed

+84
-5
lines changed

.changeset/wild-melons-scream.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@effect/platform": minor
3+
---
4+
5+
Allow removing multiple Headers

packages/platform/src/Headers.ts

+25-5
Original file line numberDiff line numberDiff line change
@@ -197,14 +197,34 @@ export const merge: {
197197
* @category combinators
198198
*/
199199
export const remove: {
200-
(key: string): (self: Headers) => Headers
201-
(self: Headers, key: string): Headers
200+
(key: string | RegExp | ReadonlyArray<string | RegExp>): (self: Headers) => Headers
201+
(self: Headers, key: string | RegExp | ReadonlyArray<string | RegExp>): Headers
202202
} = dual<
203-
(key: string) => (self: Headers) => Headers,
204-
(self: Headers, key: string) => Headers
203+
(key: string | RegExp | ReadonlyArray<string | RegExp>) => (self: Headers) => Headers,
204+
(self: Headers, key: string | RegExp | ReadonlyArray<string | RegExp>) => Headers
205205
>(2, (self, key) => {
206206
const out = make(self)
207-
delete out[key.toLowerCase()]
207+
const modify = (key: string | RegExp) => {
208+
if (typeof key === "string") {
209+
const k = key.toLowerCase()
210+
if (k in self) {
211+
delete out[k]
212+
}
213+
} else {
214+
for (const name in self) {
215+
if (key.test(name)) {
216+
delete out[name]
217+
}
218+
}
219+
}
220+
}
221+
if (Array.isArray(key)) {
222+
for (let i = 0; i < key.length; i++) {
223+
modify(key[i])
224+
}
225+
} else {
226+
modify(key as string | RegExp)
227+
}
208228
return out
209229
})
210230

packages/platform/test/Headers.test.ts

+54
Original file line numberDiff line numberDiff line change
@@ -151,4 +151,58 @@ describe("Headers", () => {
151151
})
152152
})
153153
})
154+
155+
describe("remove", () => {
156+
it("one key", () => {
157+
const headers = Headers.fromInput({
158+
"Content-Type": "application/json",
159+
"Authorization": "Bearer some-token",
160+
"X-Api-Key": "some-key"
161+
})
162+
163+
const removed = Headers.remove(headers, "Authorization")
164+
165+
deepStrictEqual(
166+
removed,
167+
Headers.fromInput({
168+
"content-type": "application/json",
169+
"x-api-key": "some-key"
170+
})
171+
)
172+
})
173+
174+
it("multiple keys", () => {
175+
const headers = Headers.fromInput({
176+
"Content-Type": "application/json",
177+
"Authorization": "Bearer some-token",
178+
"X-Api-Key": "some-key"
179+
})
180+
181+
const removed = Headers.remove(headers, ["Authorization", "authorization", "X-Api-Token", "x-api-key"])
182+
183+
deepStrictEqual(
184+
removed,
185+
Headers.fromInput({
186+
"content-type": "application/json"
187+
})
188+
)
189+
})
190+
191+
it("RegExp", () => {
192+
const headers = Headers.fromInput({
193+
"Authorization": "Bearer some-token",
194+
"sec-ret": "some",
195+
"sec-ret-2": "some"
196+
})
197+
198+
const removed = Headers.remove(headers, [/^sec-/])
199+
200+
deepStrictEqual(
201+
removed,
202+
Headers.fromInput({
203+
"authorization": "Bearer some-token"
204+
})
205+
)
206+
})
207+
})
154208
})

0 commit comments

Comments
 (0)