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 &&