From b34324f0d2269eea9f49290578e5ccfae15512ec Mon Sep 17 00:00:00 2001 From: mapsam Date: Mon, 11 Mar 2024 16:10:20 -0700 Subject: [PATCH] set body to empty string --- lib/node/node-layer.js | 7 ++++++ test/node-interface.test.js | 43 +++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/lib/node/node-layer.js b/lib/node/node-layer.js index 028e1d4b..c9798e71 100644 --- a/lib/node/node-layer.js +++ b/lib/node/node-layer.js @@ -60,6 +60,13 @@ function createRequestStreams(request) { gotOptions.body = JSON.stringify(request.body); } + if ( + ['POST', 'PUT', 'PATCH', 'DELETE'].includes(request.method) && + !request.body + ) { + gotOptions.body = ''; + } + var gotStream = got.stream(url, gotOptions); gotStream.setEncoding(request.encoding); diff --git a/test/node-interface.test.js b/test/node-interface.test.js index bf0b00d0..7eed840c 100644 --- a/test/node-interface.test.js +++ b/test/node-interface.test.js @@ -82,3 +82,46 @@ describe('test node progress events', () => { }); }); }); + +describe('test empty request bodies', () => { + let server; + let createLocalClient; + const { mockToken } = tu; + + beforeAll(() => { + return tu.mockServer().then(s => { + server = s; + createLocalClient = server.localClient(nodeClient); + }); + }); + + afterAll(done => { + server.close(done); + }); + + afterEach(() => { + server.reset(); + }); + + beforeEach(() => { + server.setResponse((req, res) => { + res.append('Content-Type', 'application/json; charset=utf-8'); + res.json({ mockStyle: true }); + }); + }); + + test('request for POST, PATCH, PUT, or DELETE without an explicit body should include empty string as body', () => { + // https://github.com/sindresorhus/got/issues/2303 + const accessToken = mockToken(); + const client = createLocalClient({ accessToken }); + const request = client.createRequest({ + method: 'DELETE', + path: '/tilesets/v1/:tilesetId', + params: { tilesetId: 'foo.bar' } + }); + + return request.send().then(({ statusCode }) => { + expect(statusCode).toBe(200); + }); + }); +});