Skip to content

Commit d2c2ab9

Browse files
authored
Merge pull request #45 from awslabs/servlet-improvements
Fixes for #40 and #43
2 parents dfa6689 + 237a7c7 commit d2c2ab9

File tree

14 files changed

+214
-59
lines changed

14 files changed

+214
-59
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,12 @@ public Principal getUserPrincipal() {
6969
if (getAuthenticationScheme().equals(AUTH_SCHEME_CUSTOM)) {
7070
return event.getRequestContext().getAuthorizer().getPrincipalId();
7171
} else if (getAuthenticationScheme().equals(AUTH_SCHEME_AWS_IAM)) {
72-
return event.getRequestContext().getIdentity().getUserArn();
72+
// if we received credentials from Cognito Federated Identities then we return the identity id
73+
if (event.getRequestContext().getIdentity().getCognitoIdentityId() != null) {
74+
return event.getRequestContext().getIdentity().getCognitoIdentityId();
75+
} else { // otherwise the user arn from the credentials
76+
return event.getRequestContext().getIdentity().getUserArn();
77+
}
7378
} else if (getAuthenticationScheme().equals(AUTH_SCHEME_COGNITO_POOL)) {
7479
return event.getRequestContext().getAuthorizer().getClaims().getSubject();
7580
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010
* OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
1111
* and limitations under the License.
1212
*/
13-
package com.amazonaws.serverless.proxy.test.jersey;
13+
package com.amazonaws.serverless.proxy.jersey;
1414

1515
import com.amazonaws.serverless.proxy.internal.RequestReader;
1616
import com.amazonaws.serverless.proxy.internal.model.ApiGatewayRequestContext;
17-
import com.amazonaws.serverless.proxy.test.jersey.model.MapResponseModel;
18-
import com.amazonaws.serverless.proxy.test.jersey.model.SingleValueModel;
17+
import com.amazonaws.serverless.proxy.jersey.model.MapResponseModel;
18+
import com.amazonaws.serverless.proxy.jersey.model.SingleValueModel;
1919

2020
import javax.servlet.ServletContext;
2121
import javax.servlet.http.HttpServletRequest;
Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,16 @@
1010
* OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
1111
* and limitations under the License.
1212
*/
13-
package com.amazonaws.serverless.proxy.test.jersey;
13+
package com.amazonaws.serverless.proxy.jersey;
1414

1515

1616
import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest;
1717
import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse;
1818
import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext;
1919
import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletContextFactory;
2020
import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletRequestFactory;
21-
import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler;
22-
import com.amazonaws.serverless.proxy.test.jersey.model.MapResponseModel;
23-
import com.amazonaws.serverless.proxy.test.jersey.model.SingleValueModel;
21+
import com.amazonaws.serverless.proxy.jersey.model.MapResponseModel;
22+
import com.amazonaws.serverless.proxy.jersey.model.SingleValueModel;
2423
import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder;
2524
import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext;
2625
import com.amazonaws.services.lambda.runtime.Context;
@@ -51,7 +50,7 @@ public class JerseyAwsProxyTest {
5150

5251

5352
private static ObjectMapper objectMapper = new ObjectMapper();
54-
private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.test.jersey")
53+
private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey")
5554
.register(new AbstractBinder() {
5655
@Override
5756
protected void configure() {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
1111
* and limitations under the License.
1212
*/
13-
package com.amazonaws.serverless.proxy.test.jersey.model;
13+
package com.amazonaws.serverless.proxy.jersey.model;
1414

1515
import java.util.HashMap;
1616
import java.util.Map;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
1111
* and limitations under the License.
1212
*/
13-
package com.amazonaws.serverless.proxy.test.jersey.model;
13+
package com.amazonaws.serverless.proxy.jersey.model;
1414

1515
/**
1616
* Request/response model

aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ public class SparkLambdaContainerHandler<RequestType, ResponseType> extends AwsL
6464

6565

6666
//-------------------------------------------------------------
67-
// Variables - Private - Static
67+
// Variables - Private
6868
//-------------------------------------------------------------
6969

70-
private static LambdaEmbeddedServer embeddedServer;
70+
private LambdaEmbeddedServer embeddedServer;
7171

7272

7373
//-------------------------------------------------------------
@@ -145,13 +145,15 @@ protected AwsHttpServletResponse getContainerResponse(CountDownLatch latch) {
145145
@Override
146146
protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsHttpServletResponse httpServletResponse, Context lambdaContext)
147147
throws Exception {
148+
// this method of the AwsLambdaServletContainerHandler sets the request context
149+
super.handleRequest(httpServletRequest, httpServletResponse, lambdaContext);
150+
148151
if (embeddedServer == null) {
149152
embeddedServer = LambdaEmbeddedServerFactory.getServerInstance();
150-
servletContext = httpServletRequest.getServletContext();
151153

152154
// call the onStartup event if set to give developers a chance to set filters in the context
153155
if (startupHandler != null) {
154-
startupHandler.onStartup(this.servletContext);
156+
startupHandler.onStartup(getServletContext());
155157
}
156158
}
157159

aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ public int ignite(String host,
6262

6363
public void configureWebSockets(Map<String, WebSocketHandlerWrapper> webSocketHandlers,
6464
Optional<Integer> webSocketIdleTimeoutMillis) {
65-
throw new UnsupportedOperationException();
65+
// Swallowing this exception to prevent Spark from getting stuck
66+
// throw new UnsupportedOperationException();
67+
System.out.println("Spark called configureWebSockets. However, web sockets are not supported");
6668
}
6769

6870

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.amazonaws.serverless.proxy.spark;
2+
3+
4+
import com.amazonaws.serverless.exceptions.ContainerInitializationException;
5+
import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest;
6+
import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse;
7+
import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder;
8+
import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext;
9+
10+
import org.junit.Test;
11+
12+
import static org.junit.Assert.*;
13+
import static spark.Spark.get;
14+
15+
16+
public class HelloWorldSparkTest {
17+
private static final String CUSTOM_HEADER_KEY = "X-Custom-Header";
18+
private static final String CUSTOM_HEADER_VALUE = "My Header Value";
19+
private static final String BODY_TEXT_RESPONSE = "Hello World";
20+
21+
private static SparkLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler;
22+
23+
@Test
24+
public void basicServer_initialize() {
25+
try {
26+
handler = SparkLambdaContainerHandler.getAwsProxyHandler();
27+
28+
configureRoutes();
29+
30+
} catch (RuntimeException | ContainerInitializationException e) {
31+
e.printStackTrace();
32+
fail();
33+
}
34+
}
35+
36+
@Test
37+
public void basicServer_handleRequest_emptyFilters() {
38+
AwsProxyRequest req = new AwsProxyRequestBuilder().method("GET").path("/hello").build();
39+
AwsProxyResponse response = handler.proxy(req, new MockLambdaContext());
40+
41+
assertEquals(200, response.getStatusCode());
42+
assertTrue(response.getHeaders().containsKey(CUSTOM_HEADER_KEY));
43+
assertEquals(CUSTOM_HEADER_VALUE, response.getHeaders().get(CUSTOM_HEADER_KEY));
44+
assertEquals(BODY_TEXT_RESPONSE, response.getBody());
45+
}
46+
47+
private void configureRoutes() {
48+
get("/hello", (req, res) -> {
49+
res.status(200);
50+
res.header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE);
51+
return BODY_TEXT_RESPONSE;
52+
});
53+
}
54+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.amazonaws.serverless.proxy.spark;
2+
3+
4+
import com.amazonaws.serverless.exceptions.ContainerInitializationException;
5+
import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest;
6+
import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse;
7+
import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder;
8+
import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext;
9+
import com.amazonaws.serverless.proxy.spark.filter.CustomHeaderFilter;
10+
11+
import org.junit.Test;
12+
13+
import javax.servlet.DispatcherType;
14+
import javax.servlet.FilterRegistration;
15+
16+
import java.util.EnumSet;
17+
18+
import static org.junit.Assert.*;
19+
import static spark.Spark.get;
20+
21+
22+
public class SparkLambdaContainerHandlerTest {
23+
private static final String RESPONSE_BODY_TEXT = "hello";
24+
25+
@Test
26+
public void filters_onStartupMethod_executeFilters() {
27+
28+
SparkLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler = null;
29+
try {
30+
handler = SparkLambdaContainerHandler.getAwsProxyHandler();
31+
} catch (ContainerInitializationException e) {
32+
e.printStackTrace();
33+
fail();
34+
}
35+
36+
handler.onStartup(c -> {
37+
if (c == null) {
38+
System.out.println("Null servlet context");
39+
fail();
40+
}
41+
FilterRegistration.Dynamic registration = c.addFilter("CustomHeaderFilter", CustomHeaderFilter.class);
42+
// update the registration to map to a path
43+
registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
44+
// servlet name mappings are disabled and will throw an exception
45+
});
46+
47+
configureRoutes();
48+
49+
AwsProxyRequest req = new AwsProxyRequestBuilder().method("GET").path("/header-filter").build();
50+
AwsProxyResponse response = handler.proxy(req, new MockLambdaContext());
51+
52+
assertNotNull(response);
53+
assertEquals(200, response.getStatusCode());
54+
assertTrue(response.getHeaders().containsKey(CustomHeaderFilter.HEADER_NAME));
55+
assertEquals(CustomHeaderFilter.HEADER_VALUE, response.getHeaders().get(CustomHeaderFilter.HEADER_NAME));
56+
assertEquals(RESPONSE_BODY_TEXT, response.getBody());
57+
58+
}
59+
60+
private void configureRoutes() {
61+
get("/header-filter", (req, res) -> {
62+
res.status(200);
63+
return RESPONSE_BODY_TEXT;
64+
});
65+
}
66+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.amazonaws.serverless.proxy.spark.embeddedserver;
2+
3+
4+
import org.junit.Test;
5+
6+
import java.util.Optional;
7+
8+
import static org.junit.Assert.*;
9+
10+
11+
public class LambdaEmbeddedServerTest {
12+
private static LambdaEmbeddedServer server = new LambdaEmbeddedServer(null, null, false);
13+
14+
@Test
15+
public void webSocket_configureWebSocket_noException() {
16+
try {
17+
server.configureWebSockets(null, Optional.of(0));
18+
} catch (Exception e) {
19+
e.printStackTrace();
20+
fail();
21+
}
22+
}
23+
}

0 commit comments

Comments
 (0)