From babc688531fd8710ab2dc74625964d5089e0438b Mon Sep 17 00:00:00 2001 From: Dan Perkins Date: Tue, 30 Jul 2019 10:38:12 -0400 Subject: [PATCH] Updating the lambda handler to handle invalid JSON bodies instead of throwing errors --- .../src/index.ts | 11 +++++++++++ .../apollo-server-lambda/src/lambdaApollo.ts | 18 ++++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/packages/apollo-server-integration-testsuite/src/index.ts b/packages/apollo-server-integration-testsuite/src/index.ts index f6029d998f3..8177a597877 100644 --- a/packages/apollo-server-integration-testsuite/src/index.ts +++ b/packages/apollo-server-integration-testsuite/src/index.ts @@ -240,6 +240,17 @@ export default (createApp: CreateAppFunc, destroyApp?: DestroyAppFunc) => { }); }); + it('throws an error if POST body contains invalid JSON', async () => { + app = await createApp(); + const req = request(app) + .post('/graphql') + .send('**_NOT_JSON_**'); + return req.then(res => { + expect(res.status).toBeGreaterThanOrEqual(400); + expect(res.status).toBeLessThanOrEqual(500); + }); + }); + it('throws an error if GET query is missing', async () => { app = await createApp(); const req = request(app).get(`/graphql`); diff --git a/packages/apollo-server-lambda/src/lambdaApollo.ts b/packages/apollo-server-lambda/src/lambdaApollo.ts index fb7fd1066ab..cc456103af5 100644 --- a/packages/apollo-server-lambda/src/lambdaApollo.ts +++ b/packages/apollo-server-lambda/src/lambdaApollo.ts @@ -39,13 +39,23 @@ export function graphqlLambda( statusCode: 500, }); } + + let query: any = event.queryStringParameters; + if (event.httpMethod === 'POST' && event.body) { + try { + query = JSON.parse(event.body); + } catch (error) { + return callback(null, { + body: 'Error parsing JSON POST body', + statusCode: 415, + }); + } + } + runHttpQuery([event, context], { method: event.httpMethod, options: options, - query: - event.httpMethod === 'POST' && event.body - ? JSON.parse(event.body) - : event.queryStringParameters, + query: query, request: { url: event.path, method: event.httpMethod,