diff --git a/packages/aws-lambda/src/body.test.ts b/packages/aws-lambda/src/body.test.ts index 3ad660d..01c1c0f 100644 --- a/packages/aws-lambda/src/body.test.ts +++ b/packages/aws-lambda/src/body.test.ts @@ -66,6 +66,21 @@ describe('toStandardBody', () => { }))).resolves.toEqual({ foo: 'bar' }) }) + it('strips a leading BOM from json', async () => { + await expect(toStandardBody(event({ + body: '\uFEFF{"foo":"bar"}', + multiValueHeaders: { 'Content-Type': ['application/json'] }, + }))).resolves.toEqual({ foo: 'bar' }) + }) + + it('strips a leading BOM from base64-encoded json', async () => { + await expect(toStandardBody(event({ + body: Buffer.from('\uFEFF{"foo":"bar"}').toString('base64'), + isBase64Encoded: true, + multiValueHeaders: { 'Content-Type': ['application/json'] }, + }))).resolves.toEqual({ foo: 'bar' }) + }) + it('parses empty json as undefined', async () => { await expect(toStandardBody(event({ body: '', @@ -81,6 +96,13 @@ describe('toStandardBody', () => { multiValueHeaders: { 'Content-Type': ['application/x-www-form-urlencoded'] }, }))).resolves.toEqual(new URLSearchParams('foo=bar&baz=qux')) }) + + it('strips a leading BOM from url-encoded forms', async () => { + await expect(toStandardBody(event({ + body: '\uFEFFfoo=bar', + multiValueHeaders: { 'Content-Type': ['application/x-www-form-urlencoded'] }, + }))).resolves.toEqual(new URLSearchParams('foo=bar')) + }) }) describe('form-data', () => { diff --git a/packages/fetch/src/body.test.ts b/packages/fetch/src/body.test.ts index 03192c2..bc676bf 100644 --- a/packages/fetch/src/body.test.ts +++ b/packages/fetch/src/body.test.ts @@ -73,6 +73,18 @@ describe('toStandardBody', () => { expect(await toStandardBody(request)).toEqual({ foo: 'bar' }) }) + it('json strips a leading BOM', async () => { + const request = new Request('https://example.com', { + method: 'POST', + body: '\uFEFF{"foo":"bar"}', + headers: { + 'standard-server': 'json', + }, + }) + + expect(await toStandardBody(request)).toEqual({ foo: 'bar' }) + }) + it('async iterator object', async () => { const stream = new ReadableStream({ async pull(controller) { @@ -130,6 +142,18 @@ describe('toStandardBody', () => { expect(await toStandardBody(request)).toEqual(new URLSearchParams('foo=bar&bar=baz')) }) + it('url-search-params strips a leading BOM', async () => { + const request = new Request('https://example.com', { + method: 'POST', + body: '\uFEFFfoo=bar', + headers: { + 'standard-server': 'url-search-params', + }, + }) + + expect(await toStandardBody(request)).toEqual(new URLSearchParams('foo=bar')) + }) + it('file/blob', async () => { const request = new Request('https://example.com', { method: 'POST', diff --git a/packages/node/src/body.test.ts b/packages/node/src/body.test.ts index 891faf5..4029c93 100644 --- a/packages/node/src/body.test.ts +++ b/packages/node/src/body.test.ts @@ -86,6 +86,20 @@ describe('toStandardBody', () => { expect(standardBody).toEqual({ foo: 'bar' }) }) + it('json strips a leading BOM', async () => { + let standardBody: StandardBody = {} as any + + await request(async (req: IncomingMessage, res: ServerResponse) => { + standardBody = await toStandardBody(req) + res.end() + }) + .post('/') + .set('standard-server', 'json') + .send('\uFEFF{"foo":"bar"}') + + expect(standardBody).toEqual({ foo: 'bar' }) + }) + it('async iterator object', async () => { let standardBody: any @@ -133,6 +147,20 @@ describe('toStandardBody', () => { expect(standardBody).toEqual(new URLSearchParams('foo=bar&bar=baz')) }) + it('url-search-params strips a leading BOM', async () => { + let standardBody: any + + await request(async (req: IncomingMessage, res: ServerResponse) => { + standardBody = await toStandardBody(req) + res.end() + }) + .post('/') + .set('standard-server', 'url-search-params') + .send('\uFEFFfoo=bar') + + expect(standardBody).toEqual(new URLSearchParams('foo=bar')) + }) + it('file/blob', async () => { let standardBody: any