diff --git a/packages/@aws-cdk/aws-apigateway/README.md b/packages/@aws-cdk/aws-apigateway/README.md index cfe75be5b0976..552f515d61488 100644 --- a/packages/@aws-cdk/aws-apigateway/README.md +++ b/packages/@aws-cdk/aws-apigateway/README.md @@ -1378,9 +1378,8 @@ api.addGatewayResponse('test-response', { type: apigateway.ResponseType.ACCESS_DENIED, statusCode: '500', responseHeaders: { - // Note that values must be enclosed within a pair of single quotes - 'Access-Control-Allow-Origin': "'test.com'", - 'test-key': "'test-value'", + 'Access-Control-Allow-Origin': 'test.com', + 'test-key': 'test-value', }, templates: { 'application/json': '{ "message": $context.error.messageString, "statusCode": "488", "type": "$context.error.responseType" }' diff --git a/packages/@aws-cdk/aws-apigateway/lib/gateway-response.ts b/packages/@aws-cdk/aws-apigateway/lib/gateway-response.ts index 0ab490a893051..137b2c66395b4 100644 --- a/packages/@aws-cdk/aws-apigateway/lib/gateway-response.ts +++ b/packages/@aws-cdk/aws-apigateway/lib/gateway-response.ts @@ -2,6 +2,7 @@ import { IResource, Resource } from '@aws-cdk/core'; import { Construct } from 'constructs'; import { CfnGatewayResponse, CfnGatewayResponseProps } from './apigateway.generated'; import { IRestApi } from './restapi'; +import { normalizeResponseParameterValue } from './util'; /** * Represents gateway response resource. @@ -88,7 +89,7 @@ export class GatewayResponse extends Resource implements IGatewayResponse { const responseParameters: { [key: string]: string } = {}; for (const [header, value] of Object.entries(responseHeaders)) { - responseParameters[`gatewayresponse.header.${header}`] = value; + responseParameters[`gatewayresponse.header.${header}`] = normalizeResponseParameterValue(value) ; } return responseParameters; } diff --git a/packages/@aws-cdk/aws-apigateway/lib/util.ts b/packages/@aws-cdk/aws-apigateway/lib/util.ts index e5df3afa246af..29513553d3cf8 100644 --- a/packages/@aws-cdk/aws-apigateway/lib/util.ts +++ b/packages/@aws-cdk/aws-apigateway/lib/util.ts @@ -11,6 +11,22 @@ export function validateHttpMethod(method: string, messagePrefix: string = '') { } } +/** + * Response header values need to be enclosed in single quotes. + */ +export function normalizeResponseParameterValue(value: string) { + if (!value) { + return value; + } + + // check if the value is already enclosed in single quotes + if (value.startsWith("'") && value.endsWith("'")) { + return value; + } + + return `'${value}'`; +} + export function parseMethodOptionsPath(originalPath: string): { resourcePath: string, httpMethod: string } { if (!originalPath.startsWith('/')) { throw new Error(`Method options path must start with '/': ${originalPath}`); diff --git a/packages/@aws-cdk/aws-apigateway/test/gateway-response.test.ts b/packages/@aws-cdk/aws-apigateway/test/gateway-response.test.ts index 80093aba04de1..438d824d2e9d5 100644 --- a/packages/@aws-cdk/aws-apigateway/test/gateway-response.test.ts +++ b/packages/@aws-cdk/aws-apigateway/test/gateway-response.test.ts @@ -45,6 +45,7 @@ describe('gateway response', () => { responseHeaders: { 'Access-Control-Allow-Origin': 'test.com', 'test-key': 'test-value', + 'another-test': "'test-value-enclosed-within-single-quotes'", }, }); @@ -54,8 +55,9 @@ describe('gateway response', () => { RestApiId: stack.resolve(api.restApiId), StatusCode: '500', ResponseParameters: { - 'gatewayresponse.header.Access-Control-Allow-Origin': 'test.com', - 'gatewayresponse.header.test-key': 'test-value', + 'gatewayresponse.header.Access-Control-Allow-Origin': "'test.com'", + 'gatewayresponse.header.test-key': "'test-value'", + 'gatewayresponse.header.another-test': "'test-value-enclosed-within-single-quotes'", }, ResponseTemplates: Match.absent(), });