Skip to content

Commit 9fe91fe

Browse files
authored
Merge pull request quarkusio#50137 from juliusz-cwiakalski/fix/50075/aws-lambda-http-multiple-cookies
Correctly handle multiple Set-Cookie headers for API Gateway v2
2 parents 79c1829 + 74649ea commit 9fe91fe

File tree

3 files changed

+90
-1
lines changed

3 files changed

+90
-1
lines changed

extensions/amazon-lambda-http/runtime/src/main/java/io/quarkus/amazon/lambda/http/LambdaHttpHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public void handleMessage(Object msg) {
109109
continue;
110110
}
111111
// Handle cookies separately to preserve commas in the header values
112-
if ("set-cookie".equals(name)) {
112+
if ("set-cookie".equalsIgnoreCase(name)) {
113113
responseBuilder.setCookies(allForName);
114114
continue;
115115
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.quarkus.it.amazon.lambda;
2+
3+
import jakarta.ws.rs.GET;
4+
import jakarta.ws.rs.Path;
5+
import jakarta.ws.rs.PathParam;
6+
import jakarta.ws.rs.Produces;
7+
import jakarta.ws.rs.core.MediaType;
8+
import jakarta.ws.rs.core.NewCookie;
9+
import jakarta.ws.rs.core.Response;
10+
11+
@Path("/cookies")
12+
@Produces(MediaType.APPLICATION_JSON)
13+
public class CookiesResource {
14+
15+
@GET
16+
@Path("/one/{name}")
17+
public Response one(@PathParam("name") String name) {
18+
NewCookie cookie = buildCookie("cookie1", name);
19+
return Response.ok("{\"status\":\"ok\"}").cookie(cookie).build();
20+
}
21+
22+
@GET
23+
@Path("/two/{name1}/{name2}")
24+
public Response two(@PathParam("name1") String name1, @PathParam("name2") String name2) {
25+
NewCookie cookie1 = buildCookie("cookie1", name1);
26+
NewCookie cookie2 = buildCookie("cookie2", name2);
27+
return Response.ok("{\"status\":\"ok\"}").cookie(cookie1, cookie2).build();
28+
}
29+
30+
private static NewCookie buildCookie(String name, String value) {
31+
return new NewCookie.Builder(name)
32+
.value(value)
33+
.path("/")
34+
.maxAge(3600)
35+
.secure(true)
36+
.httpOnly(true)
37+
.sameSite(NewCookie.SameSite.LAX)
38+
.build();
39+
}
40+
}

integration-tests/amazon-lambda-http/src/test/java/io/quarkus/it/amazon/lambda/AmazonLambdaSimpleTestCase.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
import static io.restassured.RestAssured.given;
44
import static org.hamcrest.CoreMatchers.containsString;
55
import static org.hamcrest.CoreMatchers.equalTo;
6+
import static org.hamcrest.Matchers.hasItems;
67

78
import java.util.Arrays;
89
import java.util.HashMap;
10+
import java.util.List;
911

1012
import jakarta.ws.rs.core.MediaType;
1113

@@ -328,4 +330,51 @@ public void testProxyRequestContext() throws Exception {
328330
.then()
329331
.statusCode(204);
330332
}
333+
334+
@Test
335+
public void testSingleCookieByEvent() {
336+
APIGatewayV2HTTPEvent request = request("/cookies/one/value1");
337+
given()
338+
.contentType("application/json")
339+
.accept("application/json")
340+
.body(request)
341+
.when()
342+
.post(AmazonLambdaApi.API_BASE_PATH_TEST)
343+
.then()
344+
.statusCode(200)
345+
.body("cookies.size()", equalTo(1))
346+
.body("cookies[0]", containsString("cookie1=value1"))
347+
.body("headers.'Set-Cookie'", equalTo(null));
348+
}
349+
350+
@Test
351+
public void testMultipleCookiesByEvent() {
352+
APIGatewayV2HTTPEvent request = request("/cookies/two/value1/value2");
353+
given()
354+
.contentType("application/json")
355+
.accept("application/json")
356+
.body(request)
357+
.when()
358+
.post(AmazonLambdaApi.API_BASE_PATH_TEST)
359+
.then()
360+
.statusCode(200)
361+
.body("cookies.size()", equalTo(2))
362+
.body("cookies", hasItems(containsString("cookie1=value1"), containsString("cookie2=value2")))
363+
.body("headers.'Set-Cookie'", equalTo(null));
364+
}
365+
366+
@Test
367+
public void testMultipleCookiesDirectHttp() {
368+
List<String> cookies = given()
369+
.when()
370+
.get("/cookies/two/value1/value2")
371+
.then()
372+
.statusCode(200)
373+
.extract()
374+
.headers()
375+
.getValues("Set-Cookie");
376+
Assertions.assertEquals(2, cookies.size());
377+
Assertions.assertTrue(cookies.stream().anyMatch(s -> s.contains("cookie1=value1")));
378+
Assertions.assertTrue(cookies.stream().anyMatch(s -> s.contains("cookie2=value2")));
379+
}
331380
}

0 commit comments

Comments
 (0)