Skip to content

Commit 8b8741a

Browse files
committed
Fixed query string encoding issue with jersey reported in #140.
1 parent 15fac4a commit 8b8741a

File tree

5 files changed

+50
-19
lines changed

5 files changed

+50
-19
lines changed

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

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -299,23 +299,7 @@ protected String generateQueryString(Map<String, String> parameters) {
299299
}
300300

301301
queryString = parameters.keySet().stream()
302-
.map(key -> {
303-
String newKey = key;
304-
String newValue = parameters.get(key);
305-
try {
306-
if (!URLEncoder.encode(newKey, StandardCharsets.UTF_8.name()).equals(newKey)) {
307-
newKey = URLEncoder.encode(key, StandardCharsets.UTF_8.name());
308-
}
309-
310-
if (!URLEncoder.encode(newValue, StandardCharsets.UTF_8.name()).equals(newValue)) {
311-
newValue = URLEncoder.encode(newValue, StandardCharsets.UTF_8.name());
312-
}
313-
} catch (UnsupportedEncodingException e) {
314-
log.error(SecurityUtils.crlf("Could not URLEncode: " + newKey), e);
315-
316-
}
317-
return newKey + "=" + newValue;
318-
})
302+
.map(key -> key + "=" + parameters.get(key))
319303
.collect(Collectors.joining("&"));
320304
return queryString;
321305
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request
128128
}
129129

130130
UriBuilder uriBuilder = UriBuilder.fromUri(baseUri).path(servletRequest.getPathInfo());
131-
uriBuilder.replaceQuery(AwsProxyHttpServletRequest.decodeValueIfEncoded(servletRequest.getQueryString()));
131+
uriBuilder.replaceQuery(servletRequest.getQueryString());
132132

133133
PropertiesDelegate apiGatewayProperties = new MapPropertiesDelegate();
134134
apiGatewayProperties.setProperty(API_GATEWAY_CONTEXT_PROPERTY, servletRequest.getAttribute(API_GATEWAY_CONTEXT_PROPERTY));

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,22 @@ public class EchoJerseyResource {
4444
@Context
4545
SecurityContext securityCtx;
4646

47+
@Path("/decoded-param") @GET
48+
@Produces(MediaType.APPLICATION_JSON)
49+
public SingleValueModel echoDecodedParam(@QueryParam("param") String param) {
50+
SingleValueModel model = new SingleValueModel();
51+
model.setValue(param);
52+
return model;
53+
}
54+
55+
@Path("/encoded-param") @GET
56+
@Produces(MediaType.APPLICATION_JSON)
57+
public SingleValueModel echoEncodedParam(@QueryParam("param") @Encoded String param) {
58+
SingleValueModel model = new SingleValueModel();
59+
model.setValue(param);
60+
return model;
61+
}
62+
4763
@Path("/headers") @GET
4864
@Produces(MediaType.APPLICATION_JSON)
4965
public MapResponseModel echoHeaders(@Context ContainerRequestContext context) {

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232
import javax.ws.rs.core.Response;
3333

3434
import java.io.IOException;
35+
import java.io.UnsupportedEncodingException;
36+
import java.net.URLDecoder;
37+
import java.net.URLEncoder;
3538
import java.util.UUID;
3639

3740
import static org.junit.Assert.*;
@@ -305,6 +308,34 @@ public void securityContext_injectPrincipal_expectPrincipalName() {
305308
validateSingleValueModel(resp, USER_PRINCIPAL);
306309
}
307310

311+
@Test
312+
public void queryParam_encoding_expectUnencodedParam() {
313+
String paramValue = "p%2Fz%2B3";
314+
String decodedParam = "";
315+
try {
316+
decodedParam = URLDecoder.decode(paramValue, "UTF-8");
317+
System.out.println(decodedParam);
318+
} catch (UnsupportedEncodingException e) {
319+
e.printStackTrace();
320+
fail("Could not decode parameter");
321+
}
322+
AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/decoded-param", "GET").queryString("param", paramValue).build();
323+
324+
AwsProxyResponse resp = handler.proxy(request, lambdaContext);
325+
assertEquals(200, resp.getStatusCode());
326+
validateSingleValueModel(resp, decodedParam);
327+
}
328+
329+
@Test
330+
public void queryParam_encoding_expectEncodedParam() {
331+
String paramValue = "p%2Fz%2B3";
332+
AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/encoded-param", "GET").queryString("param", paramValue).build();
333+
334+
AwsProxyResponse resp = handler.proxy(request, lambdaContext);
335+
assertEquals(200, resp.getStatusCode());
336+
validateSingleValueModel(resp, paramValue);
337+
}
338+
308339
private void validateMapResponseModel(AwsProxyResponse output) {
309340
validateMapResponseModel(output, CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE);
310341
}

samples/springboot/pet-store/sam.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Globals:
66
Api:
77
# API Gateway regional endpoints
88
EndpointConfiguration: REGIONAL
9-
9+
1010
Resources:
1111
PetStoreFunction:
1212
Type: AWS::Serverless::Function

0 commit comments

Comments
 (0)