diff --git a/.changeset/fix-http-client-request-content-length.md b/.changeset/fix-http-client-request-content-length.md new file mode 100644 index 00000000000..12f66418c14 --- /dev/null +++ b/.changeset/fix-http-client-request-content-length.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +Remove stale `content-length` headers when replacing an HTTP client request body with one of unknown length. diff --git a/packages/effect/src/unstable/http/HttpClientRequest.ts b/packages/effect/src/unstable/http/HttpClientRequest.ts index 2363374e1ef..9ac4077fe67 100644 --- a/packages/effect/src/unstable/http/HttpClientRequest.ts +++ b/packages/effect/src/unstable/http/HttpClientRequest.ts @@ -658,6 +658,8 @@ export const setBody: { } if (body.contentLength !== undefined) { headers = Headers.set(headers, "content-length", body.contentLength.toString()) + } else { + headers = Headers.remove(headers, "content-length") } } return makeWith( diff --git a/packages/effect/test/unstable/http/HttpClientRequest.test.ts b/packages/effect/test/unstable/http/HttpClientRequest.test.ts index 85dc93564a6..ba09c404a9f 100644 --- a/packages/effect/test/unstable/http/HttpClientRequest.test.ts +++ b/packages/effect/test/unstable/http/HttpClientRequest.test.ts @@ -2,7 +2,7 @@ import { describe, it } from "@effect/vitest" import { assertNone, assertSome, assertTrue, deepStrictEqual, strictEqual } from "@effect/vitest/utils" import { Effect, Stream } from "effect" import * as Option from "effect/Option" -import { Headers, HttpClientRequest } from "effect/unstable/http" +import { Headers, HttpBody, HttpClientRequest } from "effect/unstable/http" describe("HttpClientRequest", () => { describe("appendUrl", () => { @@ -82,6 +82,16 @@ describe("HttpClientRequest", () => { }) }) + describe("setBody", () => { + it("removes stale content length when the replacement body has no known length", () => { + const request = HttpClientRequest.bodyText(HttpClientRequest.post("https://example.com"), "abc").pipe( + HttpClientRequest.setBody(HttpBody.stream(Stream.empty)) + ) + + strictEqual(request.headers["content-length"], undefined) + }) + }) + describe("removeHeader", () => { it("removes an existing header", () => { const request = HttpClientRequest.get("/").pipe(