Skip to content

Commit 8c4a437

Browse files
committed
Added full request URI to Jersey's ContainerRequest object, including scheme, host, and path; excluding the stage
1 parent 7c91d8a commit 8c4a437

File tree

5 files changed

+57
-4
lines changed

5 files changed

+57
-4
lines changed

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ public abstract class RequestReader<RequestType, ContainerRequestType> {
4545
*/
4646
public static final String API_GATEWAY_STAGE_VARS_PROPERTY = "com.amazonaws.apigateway.stage.variables";
4747

48+
/**
49+
* The key to store the entire API Gateway event
50+
*/
51+
public static final String API_GATEWAY_EVENT_PROPERTY = "com.amazonaws.apigateway.request";
52+
4853
/**
4954
* The key for the <strong>AWS Lambda context</strong> property in the PropertiesDelegate object
5055
*/
@@ -56,6 +61,7 @@ public abstract class RequestReader<RequestType, ContainerRequestType> {
5661
public static final String JAX_SECURITY_CONTEXT_PROPERTY = "com.amazonaws.serverless.jaxrs.securityContext";
5762

5863

64+
5965
//-------------------------------------------------------------
6066
// Methods - Abstract
6167
//-------------------------------------------------------------

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public AwsProxyHttpServletRequest readRequest(AwsProxyRequest request, SecurityC
3737
AwsProxyHttpServletRequest servletRequest = new AwsProxyHttpServletRequest(request, lambdaContext, securityContext, config);
3838
servletRequest.setAttribute(API_GATEWAY_CONTEXT_PROPERTY, request.getRequestContext());
3939
servletRequest.setAttribute(API_GATEWAY_STAGE_VARS_PROPERTY, request.getStageVariables());
40+
servletRequest.setAttribute(API_GATEWAY_EVENT_PROPERTY, request);
4041
servletRequest.setAttribute(LAMBDA_CONTEXT_PROPERTY, lambdaContext);
4142
servletRequest.setAttribute(JAX_SECURITY_CONTEXT_PROPERTY, securityContext);
4243

aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest;
55
import com.amazonaws.serverless.proxy.internal.testutils.Timer;
66
import com.amazonaws.serverless.proxy.jersey.suppliers.AwsProxyServletRequestSupplier;
7+
import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext;
78

89
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
910
import org.glassfish.jersey.internal.MapPropertiesDelegate;
@@ -53,7 +54,7 @@ public class JerseyHandlerFilter implements Filter, Container {
5354
private ApplicationHandler jersey;
5455
private Application app;
5556
private Logger log = LoggerFactory.getLogger(JerseyHandlerFilter.class);
56-
private URI basePathUri;
57+
private URI baseUri;
5758

5859

5960
/**
@@ -66,7 +67,6 @@ public class JerseyHandlerFilter implements Filter, Container {
6667

6768
jersey = new ApplicationHandler(app);
6869
jersey.onStartup(this);
69-
basePathUri = URI.create("/");
7070
Timer.stop("JERSEY_FILTER_CONSTRUCTOR");
7171
}
7272

@@ -123,7 +123,11 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request
123123
Timer.start("JERSEY_SERVLET_REQUEST_TO_CONTAINER");
124124
HttpServletRequest servletRequest = (HttpServletRequest)request;
125125

126-
UriBuilder uriBuilder = UriBuilder.fromPath(servletRequest.getPathInfo());
126+
if (baseUri == null) {
127+
baseUri = getBaseUri(request, "/");
128+
}
129+
130+
UriBuilder uriBuilder = UriBuilder.fromUri(baseUri).path(servletRequest.getPathInfo());
127131
uriBuilder.replaceQuery(AwsProxyHttpServletRequest.decodeValueIfEncoded(servletRequest.getQueryString()));
128132

129133
PropertiesDelegate apiGatewayProperties = new MapPropertiesDelegate();
@@ -133,7 +137,7 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request
133137
apiGatewayProperties.setProperty(JERSEY_SERVLET_REQUEST_PROPERTY, servletRequest);
134138

135139
ContainerRequest requestContext = new ContainerRequest(
136-
basePathUri,
140+
null, // jersey uses "/" by default
137141
uriBuilder.build(),
138142
servletRequest.getMethod().toUpperCase(Locale.ENGLISH),
139143
(SecurityContext)servletRequest.getAttribute(JAX_SECURITY_CONTEXT_PROPERTY),
@@ -161,6 +165,25 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request
161165
return requestContext;
162166
}
163167

168+
private URI getBaseUri(ServletRequest request, String basePath) {
169+
ApiGatewayRequestContext apiGatewayCtx = (ApiGatewayRequestContext) request.getAttribute(API_GATEWAY_CONTEXT_PROPERTY);
170+
String region = System.getenv("AWS_REGION");
171+
if (region == null) {
172+
// this is not a critical failure, we just put a static region in the URI
173+
region = "us-east-1";
174+
}
175+
StringBuilder uriBuilder = new StringBuilder();
176+
uriBuilder.append("https://") // we assume it's always https
177+
.append(apiGatewayCtx.getApiId())
178+
.append(".execute-api.")
179+
.append(region)
180+
.append(".amazonaws.com")
181+
.append("/");
182+
183+
184+
return UriBuilder.fromUri(uriBuilder.toString()).build();
185+
}
186+
164187
//-------------------------------------------------------------
165188
// Implementation - Container
166189
//-------------------------------------------------------------

aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,15 @@ public MapResponseModel echoQueryString(@Context UriInfo context) {
9797
return queryStrings;
9898
}
9999

100+
@Path("/scheme") @GET
101+
@Produces(MediaType.APPLICATION_JSON)
102+
public SingleValueModel echoRequestScheme(@Context UriInfo context) {
103+
SingleValueModel model = new SingleValueModel();
104+
System.out.println("RequestUri: " + context.getRequestUri().toString());
105+
model.setValue(context.getRequestUri().getScheme());
106+
return model;
107+
}
108+
100109
@Path("/authorizer-principal") @GET
101110
@Produces(MediaType.APPLICATION_JSON)
102111
public SingleValueModel echoAuthorizerPrincipal(@Context ContainerRequestContext context) {

aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,20 @@ public void queryString_encoded_echo() {
151151
validateMapResponseModel(output, QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE);
152152
}
153153

154+
@Test
155+
public void requestScheme_valid_expectHttps() {
156+
AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/scheme", "GET")
157+
.json()
158+
.queryString(QUERY_STRING_KEY, QUERY_STRING_ENCODED_VALUE)
159+
.build();
160+
161+
AwsProxyResponse output = handler.proxy(request, lambdaContext);
162+
assertEquals(200, output.getStatusCode());
163+
assertEquals("application/json", output.getHeaders().get("Content-Type"));
164+
165+
validateSingleValueModel(output, "https");
166+
}
167+
154168
@Test
155169
public void authorizer_securityContext_customPrincipalSuccess() {
156170
AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/authorizer-principal", "GET")

0 commit comments

Comments
 (0)