From 8820ed89f4b1538ae6bbee63db60a521c98868df Mon Sep 17 00:00:00 2001 From: Benji Encalada Mora Date: Thu, 21 May 2020 13:58:51 -0500 Subject: [PATCH] feat: parse array from multipart form data --- .../__tests__/index.js | 20 +++++++++++++++++++ packages/http-multipart-body-parser/index.js | 12 ++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/packages/http-multipart-body-parser/__tests__/index.js b/packages/http-multipart-body-parser/__tests__/index.js index de9b1a9fa..af3005682 100644 --- a/packages/http-multipart-body-parser/__tests__/index.js +++ b/packages/http-multipart-body-parser/__tests__/index.js @@ -164,4 +164,24 @@ describe('📦 Middleware Multipart Form Data Body Parser', () => { const response = await invoke(handler, event) expect(response).toEqual('LS0tLS0tV2ViS2l0Rm9ybUJvdW5kYXJ5cHBzUUV3ZjJCVkplQ2UwTQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9ImZvbyIKCmJhcgotLS0tLS1XZWJLaXRGb3JtQm91bmRhcnlwcHNRRXdmMkJWSmVDZTBNLS0=') }) + + test('It should parse an array from a multipart/form-data request', async () => { + const handler = middy((event, context, cb) => { + cb(null, event.body) // propagates the body as a response + }) + + handler.use(httpMultipartBodyParser()) + + const event = { + headers: { + 'content-type': 'multipart/form-data; boundary=----WebKitFormBoundaryppsQEwf2BVJeCe0M' + }, + body: 'LS0tLS0tV2ViS2l0Rm9ybUJvdW5kYXJ5cHBzUUV3ZjJCVkplQ2UwTQ0KQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJmb29bXSINCg0Kb25lDQotLS0tLS1XZWJLaXRGb3JtQm91bmRhcnlwcHNRRXdmMkJWSmVDZTBNDQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9ImZvb1tdIg0KDQp0d28NCi0tLS0tLVdlYktpdEZvcm1Cb3VuZGFyeXBwc1FFd2YyQlZKZUNlME0tLQ==', + isBase64Encoded: true + } + const response = await invoke(handler, event) + + expect(Object.keys(response)).toContain('foo') + expect(response.foo.length).toEqual(2) + }) }) diff --git a/packages/http-multipart-body-parser/index.js b/packages/http-multipart-body-parser/index.js index 5eae22699..522fe3307 100644 --- a/packages/http-multipart-body-parser/index.js +++ b/packages/http-multipart-body-parser/index.js @@ -59,7 +59,17 @@ const parseMultipartData = (event, options) => { multipartData[fieldname] = attachment }) }) - .on('field', (fieldname, value) => { multipartData[fieldname] = value }) + .on('field', (fieldname, value) => { + const matches = fieldname.match(/(.+)\[(.*)]$/) + if (!matches) { + multipartData[fieldname] = value + } else { + if (!multipartData[matches[1]]) { + multipartData[matches[1]] = [] + } + multipartData[matches[1]].push(value) + } + }) .on('finish', () => resolve(multipartData)) .on('error', err => reject(err))