From 03e455761403e1295bc2c1494da7833c55a73890 Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Thu, 5 Feb 2026 08:54:21 +0000 Subject: [PATCH] fix: Prevent overriding `Content-Type` when it's already set (#30) --- .changeset/nice-masks-buy.md | 5 +++++ src/__tests__/fetch.test.ts | 10 ++++++++++ src/fetch.ts | 7 +++++-- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 .changeset/nice-masks-buy.md diff --git a/.changeset/nice-masks-buy.md b/.changeset/nice-masks-buy.md new file mode 100644 index 0000000..d8a86b6 --- /dev/null +++ b/.changeset/nice-masks-buy.md @@ -0,0 +1,5 @@ +--- +'fetch-nodeshim': patch +--- + +Fix `Content-Type` being overridden for string inputs when it's already set diff --git a/src/__tests__/fetch.test.ts b/src/__tests__/fetch.test.ts index c9fdd29..65fcada 100644 --- a/src/__tests__/fetch.test.ts +++ b/src/__tests__/fetch.test.ts @@ -122,6 +122,16 @@ describe(fetch, () => { }); }); + it('should send custom Content-Type with body', async () => { + const response = await fetch(new URL('inspect', baseURL), { + headers: { 'content-type': 'some/magic' }, + body: 'test', + }); + expect(await response.json()).toMatchObject({ + headers: expect.objectContaining({ 'content-type': 'some/magic' }), + }); + }); + it('should prefer init headers when Request is passed', async () => { const request = new Request(new URL('inspect', baseURL), { headers: { 'x-custom-header': 'abc' }, diff --git a/src/fetch.ts b/src/fetch.ts index 96c5277..3d5c323 100644 --- a/src/fetch.ts +++ b/src/fetch.ts @@ -287,9 +287,12 @@ async function _fetch( outgoing.on('error', destroy); - if (!requestHeaders.has('Accept')) requestHeaders.set('Accept', '*/*'); - if (requestBody.contentType) + if (!requestHeaders.has('Accept')) { + requestHeaders.set('Accept', '*/*'); + } + if (!requestHeaders.has('Content-Type') && requestBody.contentType) { requestHeaders.set('Content-Type', requestBody.contentType); + } if ( requestBody.body == null && -- 2.51.2