From 9aadcb620db9565d204929b1fdca056331dd95b4 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 2 Oct 2018 10:18:59 +0200 Subject: [PATCH] fix(aws-apigateway): allow + in path parts (#769) The RegEx was too restrictive when being used with proxy variables. The \+ in {proxy+} is valid and should not throw an exception. Fixes #768. --- .../@aws-cdk/aws-apigateway/lib/resource.ts | 8 ++++++- .../aws-apigateway/test/test.restapi.ts | 21 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/packages/@aws-cdk/aws-apigateway/lib/resource.ts b/packages/@aws-cdk/aws-apigateway/lib/resource.ts index 1bab6758d3d02..59d9fd980c5a8 100644 --- a/packages/@aws-cdk/aws-apigateway/lib/resource.ts +++ b/packages/@aws-cdk/aws-apigateway/lib/resource.ts @@ -138,9 +138,15 @@ function validateResourcePathPart(part: string) { // strip {} which indicate this is a parameter if (part.startsWith('{') && part.endsWith('}')) { part = part.substr(1, part.length - 2); + + // proxy resources are allowed to end with a '+' + if (part.endsWith('+')) { + part = part.substr(0, part.length - 1); + } } if (!/^[a-zA-Z0-9\.\_\-]+$/.test(part)) { - throw new Error(`Resource's path part only allow a-zA-Z0-9._- and curly braces at the beginning and the end: ${part}`); + throw new Error(`Resource's path part only allow [a-zA-Z0-9._-], an optional trailing '+' + and curly braces at the beginning and the end: ${part}`); } } diff --git a/packages/@aws-cdk/aws-apigateway/test/test.restapi.ts b/packages/@aws-cdk/aws-apigateway/test/test.restapi.ts index a90d1bbb6c4f7..c27a4dc00efff 100644 --- a/packages/@aws-cdk/aws-apigateway/test/test.restapi.ts +++ b/packages/@aws-cdk/aws-apigateway/test/test.restapi.ts @@ -223,6 +223,27 @@ export = { test.done(); }, + '"addResource" allows configuration of proxy paths'(test: Test) { + // GIVEN + const stack = new cdk.Stack(); + const api = new apigateway.RestApi(stack, 'restapi', { + deploy: false, + cloudWatchRole: false, + restApiName: 'my-rest-api' + }); + + // WHEN + const proxy = api.root.addResource('{proxy+}'); + proxy.addMethod('ANY'); + + // THEN + expect(stack).to(haveResource('AWS::ApiGateway::Resource', { + PathPart: "{proxy+}", + ParentId: { "Fn::GetAtt": ["restapiC5611D27", "RootResourceId"] } + })); + test.done(); + }, + '"addMethod" can be used to add methods to resources'(test: Test) { // GIVEN const stack = new cdk.Stack();