From cf753812fa89ade5967d9dce0b2966c515ffab58 Mon Sep 17 00:00:00 2001 From: Evans Hauser Date: Wed, 6 Jun 2018 09:23:10 -0700 Subject: [PATCH] core: change gqlResponse to graphqlResponse and add custom RequestInit type --- .../apollo-server-adonis/src/adonisApollo.ts | 4 +- .../src/azureFunctionsApollo.ts | 4 +- .../src/cloudflareApollo.ts | 4 +- .../src/ApolloServer.test.ts | 8 +--- .../apollo-server-core/src/runHttpQuery.ts | 38 ++++++++++++++----- .../src/expressApollo.ts | 8 +--- packages/apollo-server-hapi/src/hapiApollo.ts | 29 +++++++------- packages/apollo-server-koa/src/koaApollo.ts | 8 +--- .../apollo-server-lambda/src/lambdaApollo.ts | 10 ++--- .../apollo-server-micro/src/microApollo.ts | 8 +--- .../src/restifyApollo.ts | 8 +--- 11 files changed, 64 insertions(+), 65 deletions(-) diff --git a/packages/apollo-server-adonis/src/adonisApollo.ts b/packages/apollo-server-adonis/src/adonisApollo.ts index 5155fa1c84e..44032afc79f 100644 --- a/packages/apollo-server-adonis/src/adonisApollo.ts +++ b/packages/apollo-server-adonis/src/adonisApollo.ts @@ -37,9 +37,9 @@ export function graphqlAdonis( query, request: convertNodeHttpToRequest(request.request), }).then( - ({ gqlResponse, responseInit }) => { + ({ graphqlResponse, responseInit }) => { response.type(responseInit.headers['Content-Type']); - response.json(gqlResponse); + response.json(graphqlResponse); }, (error: HttpQueryError) => { if ('HttpQueryError' !== error.name) { diff --git a/packages/apollo-server-azure-functions/src/azureFunctionsApollo.ts b/packages/apollo-server-azure-functions/src/azureFunctionsApollo.ts index fb2dc0a511c..89b7e002e25 100755 --- a/packages/apollo-server-azure-functions/src/azureFunctionsApollo.ts +++ b/packages/apollo-server-azure-functions/src/azureFunctionsApollo.ts @@ -66,11 +66,11 @@ export function graphqlAzureFunctions( } return runHttpQuery([httpContext, request], queryRequest as any) - .then(({ gqlResponse, responseInit }) => { + .then(({ graphqlResponse, responseInit }) => { const result = { status: HttpStatusCodes.OK, headers: responseInit.headers, - body: gqlResponse, + body: graphqlResponse, isRaw: true, }; httpContext.res = result; diff --git a/packages/apollo-server-cloudflare/src/cloudflareApollo.ts b/packages/apollo-server-cloudflare/src/cloudflareApollo.ts index c66ac6bc6ce..59b793bd7aa 100644 --- a/packages/apollo-server-cloudflare/src/cloudflareApollo.ts +++ b/packages/apollo-server-cloudflare/src/cloudflareApollo.ts @@ -39,8 +39,8 @@ export function graphqlCloudflare(options: GraphQLOptions) { query, request: req as Request, }).then( - ({ gqlResponse, responseInit }) => - new Response(gqlResponse, responseInit), + ({ graphqlResponse, responseInit }) => + new Response(graphqlResponse, responseInit), (error: HttpQueryError) => { if ('HttpQueryError' !== error.name) throw error; diff --git a/packages/apollo-server-core/src/ApolloServer.test.ts b/packages/apollo-server-core/src/ApolloServer.test.ts index c9e81134441..578ed60744f 100644 --- a/packages/apollo-server-core/src/ApolloServer.test.ts +++ b/packages/apollo-server-core/src/ApolloServer.test.ts @@ -86,15 +86,11 @@ function createHttpServer(server) { : JSON.parse(body), request: convertNodeHttpToRequest(req), }) - .then(({ gqlResponse, responseInit }) => { + .then(({ graphqlResponse, responseInit }) => { Object.keys(responseInit.headers).forEach(key => res.setHeader(key, responseInit.headers[key]), ); - res.setHeader( - 'Content-Length', - Buffer.byteLength(gqlResponse, 'utf8').toString(), - ); - res.write(gqlResponse); + res.write(graphqlResponse); res.end(); }) .catch(error => { diff --git a/packages/apollo-server-core/src/runHttpQuery.ts b/packages/apollo-server-core/src/runHttpQuery.ts index e831f8b1f16..9c28a542caf 100644 --- a/packages/apollo-server-core/src/runHttpQuery.ts +++ b/packages/apollo-server-core/src/runHttpQuery.ts @@ -32,9 +32,16 @@ function prettyJSONStringify(toStringfy) { return JSON.stringify(toStringfy) + '\n'; } +export interface ApolloServerHttpResponse { + headers?: Record; + // ResponseInit contains the follow, which we do not use + // status?: number; + // statusText?: string; +} + export interface HttpQueryResponse { - gqlResponse: string; - responseInit: ResponseInit; + graphqlResponse: string; + responseInit: ApolloServerHttpResponse; } export class HttpQueryError extends Error { @@ -338,28 +345,41 @@ export async function runHttpQuery( const responses = await Promise.all(requests); - const responseInit: ResponseInit = { - status: 200, + const responseInit: ApolloServerHttpResponse = { headers: { 'Content-Type': 'application/json', }, }; if (!isBatch) { - const gqlResponse = responses[0]; + const graphqlResponse = responses[0]; //This code is run on parse/validation errors and any other error that //doesn't reach GraphQL execution - if (gqlResponse.errors && typeof gqlResponse.data === 'undefined') { - throwHttpGraphQLError(400, gqlResponse.errors as any, optionsObject); + if (graphqlResponse.errors && typeof graphqlResponse.data === 'undefined') { + throwHttpGraphQLError(400, graphqlResponse.errors as any, optionsObject); } + const stringified = prettyJSONStringify(graphqlResponse); + + responseInit['Content-Length'] = Buffer.byteLength( + stringified, + 'utf8', + ).toString(); + return { - gqlResponse: prettyJSONStringify(gqlResponse), + graphqlResponse: stringified, responseInit, }; } + const stringified = prettyJSONStringify(responses); + + responseInit['Content-Length'] = Buffer.byteLength( + stringified, + 'utf8', + ).toString(); + return { - gqlResponse: prettyJSONStringify(responses), + graphqlResponse: stringified, responseInit, }; } diff --git a/packages/apollo-server-express/src/expressApollo.ts b/packages/apollo-server-express/src/expressApollo.ts index b22a312a3c4..47ad4b1dad8 100644 --- a/packages/apollo-server-express/src/expressApollo.ts +++ b/packages/apollo-server-express/src/expressApollo.ts @@ -48,15 +48,11 @@ export function graphqlExpress( query: req.method === 'POST' ? req.body : req.query, request: convertNodeHttpToRequest(req), }).then( - ({ gqlResponse, responseInit }) => { + ({ graphqlResponse, responseInit }) => { Object.keys(responseInit.headers).forEach(key => res.setHeader(key, responseInit.headers[key]), ); - res.setHeader( - 'Content-Length', - Buffer.byteLength(gqlResponse, 'utf8').toString(), - ); - res.write(gqlResponse); + res.write(graphqlResponse); res.end(); }, (error: HttpQueryError) => { diff --git a/packages/apollo-server-hapi/src/hapiApollo.ts b/packages/apollo-server-hapi/src/hapiApollo.ts index 6d294fe47df..414f641476c 100644 --- a/packages/apollo-server-hapi/src/hapiApollo.ts +++ b/packages/apollo-server-hapi/src/hapiApollo.ts @@ -42,25 +42,24 @@ const graphqlHapi: IPlugin = { options: options.route || {}, handler: async (request, h) => { try { - const { gqlResponse, responseInit } = await runHttpQuery([request], { - method: request.method.toUpperCase(), - options: options.graphqlOptions, - query: - request.method === 'post' - ? //TODO type payload as string or Record - (request.payload as any) - : request.query, - request: convertNodeHttpToRequest(request.raw.req), - }); + const { graphqlResponse, responseInit } = await runHttpQuery( + [request], + { + method: request.method.toUpperCase(), + options: options.graphqlOptions, + query: + request.method === 'post' + ? //TODO type payload as string or Record + (request.payload as any) + : request.query, + request: convertNodeHttpToRequest(request.raw.req), + }, + ); - const response = h.response(gqlResponse); + const response = h.response(graphqlResponse); Object.keys(responseInit.headers).forEach(key => response.header(key, responseInit.headers[key]), ); - response.header( - 'Content-Length', - Buffer.byteLength(gqlResponse, 'utf8').toString(), - ); return response; } catch (error) { if ('HttpQueryError' !== error.name) { diff --git a/packages/apollo-server-koa/src/koaApollo.ts b/packages/apollo-server-koa/src/koaApollo.ts index 33bbd03d2c5..3a8aa17a0fa 100644 --- a/packages/apollo-server-koa/src/koaApollo.ts +++ b/packages/apollo-server-koa/src/koaApollo.ts @@ -36,15 +36,11 @@ export function graphqlKoa( ctx.request.method === 'POST' ? ctx.request.body : ctx.request.query, request: convertNodeHttpToRequest(ctx.req), }).then( - ({ gqlResponse, responseInit }) => { + ({ graphqlResponse, responseInit }) => { Object.keys(responseInit.headers).forEach(key => ctx.set(key, responseInit.headers[key]), ); - ctx.set( - 'Content-Length', - Buffer.byteLength(gqlResponse, 'utf8').toString(), - ); - ctx.body = gqlResponse; + ctx.body = graphqlResponse; }, (error: HttpQueryError) => { if ('HttpQueryError' !== error.name) { diff --git a/packages/apollo-server-lambda/src/lambdaApollo.ts b/packages/apollo-server-lambda/src/lambdaApollo.ts index 869446aee44..09d618bc520 100755 --- a/packages/apollo-server-lambda/src/lambdaApollo.ts +++ b/packages/apollo-server-lambda/src/lambdaApollo.ts @@ -42,7 +42,7 @@ export function graphqlLambda( let query = event.httpMethod === 'POST' ? event.body : event.queryStringParameters, statusCode: number = null, - gqlResponse = null, + graphqlResponse = null, headers: { [headerName: string]: string } = {}; if (query && typeof query === 'string') { @@ -56,9 +56,9 @@ export function graphqlLambda( query: query, request: event, }); - gqlResponse = result.gqlResponse; + graphqlResponse = result.graphqlResponse; headers = result.responseInit.headers as Record; - statusCode = result.responseInit.status; + statusCode = 200; } catch (error) { if ('HttpQueryError' !== error.name) { throw error; @@ -66,12 +66,12 @@ export function graphqlLambda( headers = error.headers; statusCode = error.statusCode; - gqlResponse = error.message; + graphqlResponse = error.message; } finally { callback(null, { statusCode: statusCode, headers: headers, - body: gqlResponse, + body: graphqlResponse, }); } }; diff --git a/packages/apollo-server-micro/src/microApollo.ts b/packages/apollo-server-micro/src/microApollo.ts index 66057ade26c..8d8a9bfea50 100644 --- a/packages/apollo-server-micro/src/microApollo.ts +++ b/packages/apollo-server-micro/src/microApollo.ts @@ -38,7 +38,7 @@ export function microGraphql( } try { - const { gqlResponse, responseInit } = await runHttpQuery([req, res], { + const { graphqlResponse, responseInit } = await runHttpQuery([req, res], { method: req.method, options: options, query: query, @@ -47,11 +47,7 @@ export function microGraphql( Object.keys(responseInit.headers).forEach(key => res.setHeader(key, responseInit.headers[key]), ); - res.setHeader( - 'Content-Length', - Buffer.byteLength(gqlResponse, 'utf8').toString(), - ); - return gqlResponse; + return graphqlResponse; } catch (error) { if ('HttpQueryError' === error.name) { if (error.headers) { diff --git a/packages/apollo-server-restify/src/restifyApollo.ts b/packages/apollo-server-restify/src/restifyApollo.ts index 58371506289..445def30584 100644 --- a/packages/apollo-server-restify/src/restifyApollo.ts +++ b/packages/apollo-server-restify/src/restifyApollo.ts @@ -47,15 +47,11 @@ export function graphqlRestify( query: req.method === 'POST' ? req.body : req.query, request: convertNodeHttpToRequest(req), }).then( - ({ gqlResponse, responseInit }) => { + ({ graphqlResponse, responseInit }) => { Object.keys(responseInit.headers).forEach(key => res.setHeader(key, responseInit.headers[key]), ); - res.setHeader( - 'Content-Length', - Buffer.byteLength(gqlResponse, 'utf8').toString(), - ); - res.write(gqlResponse); + res.write(graphqlResponse); res.end(); next(); },