diff --git a/src/lib/run-dev.js b/src/lib/run-dev.js index 190173b..70dbb05 100644 --- a/src/lib/run-dev.js +++ b/src/lib/run-dev.js @@ -601,7 +601,7 @@ function createActionParametersFromRequest ({ req, contextItem, actionInputs = { const isFormData = req.is('application/x-www-form-urlencoded') const isRaw = isRawWebAction(contextItem) - if (params.__ow_method === 'post' && req.body !== null) { + if (['post', 'put', 'patch', 'delete'].includes(params.__ow_method?.toLowerCase()) && req.body !== null) { if (isRaw) { if (isFormData) { params.__ow_body = new URLSearchParams(req.body).toString() // convert json back to query string diff --git a/test/lib/run-dev.test.js b/test/lib/run-dev.test.js index 5eb0ce7..a60248f 100644 --- a/test/lib/run-dev.test.js +++ b/test/lib/run-dev.test.js @@ -192,6 +192,8 @@ test('exports', () => { }) describe('createActionParametersFromRequest', () => { + const methodsWithBody = ['PUT', 'PATCH', 'DELETE'] + /** @private */ async function createAsyncFnCall ({ isRaw, mimeType, body, method }) { const is = jest.fn((_type) => _type === mimeType) @@ -243,6 +245,16 @@ describe('createActionParametersFromRequest', () => { expect(actionParams.__ow_body).not.toBeDefined() }) + test.each(methodsWithBody)('non-raw: %s application/json', async (method) => { + const isRaw = false + const mimeType = 'application/json' + const body = { some: 'json' } + + const actionParams = await createAsyncFnCall({ isRaw, mimeType, body, method }) + expect(actionParams).toMatchObject(body) + expect(actionParams.__ow_body).not.toBeDefined() + }) + test('non-raw: POST application/x-www-form-urlencoded', async () => { const isRaw = false const method = 'POST' @@ -295,6 +307,15 @@ describe('createActionParametersFromRequest', () => { expect(actionParams.__ow_body).toEqual(Buffer.from(JSON.stringify(body)).toString('base64')) // raw body will be base64'ed }) + test.each(methodsWithBody)('raw: %s application/json', async (method) => { + const isRaw = true + const mimeType = 'application/json' + const body = { some: 'json' } // simulate middleware processing + + const actionParams = await createAsyncFnCall({ isRaw, mimeType, body, method }) + expect(actionParams.__ow_body).toEqual(Buffer.from(JSON.stringify(body)).toString('base64')) // raw body will be base64'ed + }) + test('raw: POST application/x-www-form-urlencoded', async () => { const isRaw = true const method = 'POST'