Skip to content

Commit

Permalink
Merge pull request #521 from benjifs/http-multipart-form-parse-array
Browse files Browse the repository at this point in the history
[http-multipart-body-parser] Parse array from multipart form data
  • Loading branch information
willfarrell authored Jul 24, 2020
2 parents f7aad0b + 8820ed8 commit 098fd25
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 1 deletion.
20 changes: 20 additions & 0 deletions packages/http-multipart-body-parser/__tests__/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)
})
})
12 changes: 11 additions & 1 deletion packages/http-multipart-body-parser/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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))

Expand Down

0 comments on commit 098fd25

Please sign in to comment.