Skip to content

Commit 0ec6f5e

Browse files
committed
Fix for Jersey routing issue #200. Added unit tests and fixed the base path stripping method in main container handler. Changed log path format to include the encoded path with the full context
1 parent f641606 commit 0ec6f5e

File tree

8 files changed

+62
-10
lines changed

8 files changed

+62
-10
lines changed

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,13 @@ public static ObjectMapper getObjectMapper() {
135135
* @param basePath The base path to be stripped from the request
136136
*/
137137
public void stripBasePath(String basePath) {
138-
config.setStripBasePath(true);
139-
config.setServiceBasePath(basePath);
138+
if (basePath == null || "".equals(basePath)) {
139+
config.setStripBasePath(false);
140+
config.setServiceBasePath(null);
141+
} else {
142+
config.setStripBasePath(true);
143+
config.setServiceBasePath(basePath);
144+
}
140145
}
141146

142147
/**

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public String format(ContainerRequestType servletRequest, ContainerResponseType
108108
logLineBuilder.append("\"");
109109
logLineBuilder.append(servletRequest.getMethod().toUpperCase(Locale.ENGLISH));
110110
logLineBuilder.append(" ");
111-
logLineBuilder.append(servletRequest.getPathInfo());
111+
logLineBuilder.append(servletRequest.getRequestURI());
112112
logLineBuilder.append(" ");
113113
logLineBuilder.append(servletRequest.getProtocol());
114114
logLineBuilder.append("\" ");

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ public String getMethod() {
203203

204204
@Override
205205
public String getPathInfo() {
206-
String pathInfo = cleanUri(request.getPath()); //getServletPath().replace(getContextPath(), "");
206+
String pathInfo = cleanUri(request.getPath());
207207
return decodeRequestPath(pathInfo, LambdaContainerHandler.getContainerConfig());
208208
}
209209

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public static ContainerConfig defaultConfig() {
1919
ContainerConfig configuration = new ContainerConfig();
2020
configuration.setStripBasePath(false);
2121
configuration.setUriEncoding(DEFAULT_URI_ENCODING);
22-
configuration.setConsolidateSetCookieHeaders(true);
22+
configuration.setConsolidateSetCookieHeaders(false);
2323
configuration.setUseStageAsServletContext(false);
2424
configuration.setValidFilePaths(DEFAULT_FILE_PATHS);
2525
configuration.setQueryStringCaseSensitive(false);

aws-serverless-java-container-jersey/pom.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,15 @@
8484

8585
<build>
8686
<plugins>
87+
<!-- fork JVM before each spring test to make sure we have a clean context -->
88+
<plugin>
89+
<groupId>org.apache.maven.plugins</groupId>
90+
<artifactId>maven-surefire-plugin</artifactId>
91+
<version>2.9</version>
92+
<configuration>
93+
<forkMode>always</forkMode>
94+
</configuration>
95+
</plugin>
8796
<plugin>
8897
<groupId>com.github.spotbugs</groupId>
8998
<artifactId>spotbugs-maven-plugin</artifactId>

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.amazonaws.serverless.proxy.jersey;
22

33

4+
import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler;
45
import com.amazonaws.serverless.proxy.internal.testutils.Timer;
56
import com.amazonaws.serverless.proxy.jersey.suppliers.AwsProxyServletRequestSupplier;
67

@@ -34,6 +35,7 @@
3435
import java.util.concurrent.CountDownLatch;
3536

3637
import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_CONTEXT_PROPERTY;
38+
import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_EVENT_PROPERTY;
3739
import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_STAGE_VARS_PROPERTY;
3840
import static com.amazonaws.serverless.proxy.RequestReader.JAX_SECURITY_CONTEXT_PROPERTY;
3941
import static com.amazonaws.serverless.proxy.RequestReader.LAMBDA_CONTEXT_PROPERTY;
@@ -125,7 +127,16 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request
125127
baseUri = getBaseUri(request, "/");
126128
}
127129

128-
UriBuilder uriBuilder = UriBuilder.fromUri(baseUri).path(servletRequest.getPathInfo());
130+
String requestFullPath = servletRequest.getRequestURI();
131+
if (LambdaContainerHandler.getContainerConfig().getServiceBasePath() != null && LambdaContainerHandler.getContainerConfig().isStripBasePath()) {
132+
if (requestFullPath.startsWith(LambdaContainerHandler.getContainerConfig().getServiceBasePath())) {
133+
requestFullPath = requestFullPath.replaceFirst(LambdaContainerHandler.getContainerConfig().getServiceBasePath(), "");
134+
if (!requestFullPath.startsWith("/")) {
135+
requestFullPath = "/" + requestFullPath;
136+
}
137+
}
138+
}
139+
UriBuilder uriBuilder = UriBuilder.fromUri(baseUri).path(requestFullPath);
129140
uriBuilder.replaceQuery(servletRequest.getQueryString());
130141

131142
PropertiesDelegate apiGatewayProperties = new MapPropertiesDelegate();
@@ -136,7 +147,7 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request
136147

137148
ContainerRequest requestContext = new ContainerRequest(
138149
null, // jersey uses "/" by default
139-
uriBuilder.build(), //requestUri,
150+
uriBuilder.build(),
140151
servletRequest.getMethod().toUpperCase(Locale.ENGLISH),
141152
(SecurityContext)servletRequest.getAttribute(JAX_SECURITY_CONTEXT_PROPERTY),
142153
apiGatewayProperties);

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,10 @@
2727
import javax.ws.rs.core.Response;
2828
import javax.ws.rs.core.SecurityContext;
2929
import javax.ws.rs.core.UriInfo;
30-
import javax.ws.rs.ext.ContextResolver;
31-
import javax.ws.rs.ext.Providers;
3230

3331
import java.util.Enumeration;
3432
import java.util.List;
3533
import java.util.Random;
36-
import java.util.Set;
3734

3835

3936
/**
@@ -206,4 +203,13 @@ public Response emptyStream(@PathParam("paramId") String paramId, @PathParam("pa
206203
public Response throwException() {
207204
throw new UnsupportedOperationException(EXCEPTION_MESSAGE);
208205
}
206+
207+
@Path("/encoded-path/{resource}") @GET
208+
@Produces(MediaType.APPLICATION_JSON)
209+
@Consumes(MediaType.APPLICATION_JSON)
210+
public Response encodedPathParam(@Encoded @PathParam("resource") String resource) {
211+
SingleValueModel sv = new SingleValueModel();
212+
sv.setValue(resource);
213+
return Response.ok(sv).build();
214+
}
209215
}

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,27 @@ public void queryParam_encoding_expectFullyEncodedUrl() {
141141
System.out.println("body:" + resp.getBody());
142142
}
143143

144+
@Test
145+
public void pathParam_encoded_routesToCorrectPath() {
146+
String encodedParam = "http%3A%2F%2Fhelloresource.com";
147+
String path = "/echo/encoded-path/" + encodedParam;
148+
AwsProxyRequest request = new AwsProxyRequestBuilder(path, "GET").build();
149+
AwsProxyResponse resp = handler.proxy(request, lambdaContext);
150+
assertNotNull(resp);
151+
assertEquals(resp.getStatusCode(), 200);
152+
validateSingleValueModel(resp, encodedParam);
153+
}
154+
155+
@Test
156+
public void pathParam_encoded_returns404() {
157+
String encodedParam = "http://helloresource.com";
158+
String path = "/echo/encoded-path/" + encodedParam;
159+
AwsProxyRequest request = new AwsProxyRequestBuilder(path, "GET").build();
160+
AwsProxyResponse resp = handler.proxy(request, lambdaContext);
161+
assertNotNull(resp);
162+
assertEquals(resp.getStatusCode(), 404);
163+
}
164+
144165
@Test
145166
@Ignore
146167
public void queryParam_listOfString_expectCorrectLength() {

0 commit comments

Comments
 (0)