diff --git a/.changeset/breezy-bottles-mix.md b/.changeset/breezy-bottles-mix.md new file mode 100644 index 000000000..ba2be448b --- /dev/null +++ b/.changeset/breezy-bottles-mix.md @@ -0,0 +1,5 @@ +--- +"openapi-fetch": patch +--- + +Fix HEAD method requests to prevent body parsing regardless of Content-Length header value diff --git a/packages/openapi-fetch/src/index.js b/packages/openapi-fetch/src/index.js index 432b1ff33..ad83112e0 100644 --- a/packages/openapi-fetch/src/index.js +++ b/packages/openapi-fetch/src/index.js @@ -209,7 +209,7 @@ export default function createClient(clientOptions) { } // handle empty content - if (response.status === 204 || response.headers.get("Content-Length") === "0") { + if (response.status === 204 || request.method === "HEAD" || response.headers.get("Content-Length") === "0") { return response.ok ? { data: undefined, response } : { error: undefined, response }; } diff --git a/packages/openapi-fetch/test/http-methods/head.test.ts b/packages/openapi-fetch/test/http-methods/head.test.ts index 56dcd3abd..da28b40d9 100644 --- a/packages/openapi-fetch/test/http-methods/head.test.ts +++ b/packages/openapi-fetch/test/http-methods/head.test.ts @@ -13,4 +13,16 @@ describe("HEAD", () => { await client.HEAD("/resources/{id}", { params: { path: { id: 123 } } }); expect(method).toBe("HEAD"); }); + + test("handles HEAD requests with non-zero Content-Length without parsing the body", async () => { + const client = createObservedClient({}, async () => { + return new Response(null, { + headers: { "Content-Length": "42", "Content-Type": "application/json" }, + status: 200, + }); + }); + const result = await client.HEAD("/resources/{id}", { params: { path: { id: 123 } } }); + expect(result.data).toBeUndefined(); + expect(result.response.ok).toBe(true); + }); });