diff --git a/CHANGELOG.md b/CHANGELOG.md index 43bdd890..dc518787 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +## 0.15.4 + +- **Fix:** Set `body = ''` for POST, PUT, PATCH, and DELETE requests that do not have a body [#479](https://github.com/mapbox/mapbox-sdk-js/pull/479) + ## 0.15.3 - **Fix:** Maximum Optimization V1 request size limits should not be enforced client-side 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/package-lock.json b/package-lock.json index 21791f14..0b326ba0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mapbox/mapbox-sdk", - "version": "0.15.3", + "version": "0.15.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mapbox/mapbox-sdk", - "version": "0.15.3", + "version": "0.15.4", "license": "BSD-2-Clause", "dependencies": { "@mapbox/fusspot": "^0.4.0", diff --git a/package.json b/package.json index e2e1893e..159d89de 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mapbox/mapbox-sdk", - "version": "0.15.3", + "version": "0.15.4", "description": "JS SDK for accessing Mapbox APIs", "main": "index.js", "files": [ 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); + }); + }); +});