Skip to content
This repository was archived by the owner on Mar 3, 2026. It is now read-only.

Commit 4df6a70

Browse files
committed
normalize cookie management between servers fix jooby-project#72
1 parent 9678fcb commit 4df6a70

37 files changed

+757
-870
lines changed
Lines changed: 15 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
package org.jooby;
22

3-
import static org.junit.Assert.assertArrayEquals;
43
import static org.junit.Assert.assertEquals;
54

6-
import java.util.Arrays;
75
import java.util.List;
86
import java.util.Optional;
97

10-
import org.jooby.Cookie;
118
import org.jooby.mvc.Path;
129
import org.jooby.test.ServerFeature;
1310
import org.junit.Test;
@@ -24,22 +21,6 @@ public String list(final List<Cookie> cookies) {
2421
}
2522
}
2623

27-
// @Before
28-
// public void debug() {
29-
// java.util.logging.Logger.getLogger("httpclient.wire.header").setLevel(
30-
// java.util.logging.Level.FINEST);
31-
// //
32-
// java.util.logging.Logger.getLogger("httpclient.wire.content").setLevel(java.util.logging.Level.FINEST);
33-
//
34-
// System.setProperty("org.apache.commons.logging.Log",
35-
// "org.apache.commons.logging.impl.SimpleLog");
36-
// System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true");
37-
// System.setProperty("org.apache.commons.logging.simplelog.log.httpclient.wire", "debug");
38-
// System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http", "debug");
39-
// System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.headers",
40-
// "debug");
41-
// }
42-
4324
{
4425

4526
get("/set", (req, rsp) -> {
@@ -49,9 +30,7 @@ public String list(final List<Cookie> cookies) {
4930

5031
get("/get",
5132
(req, rsp) -> {
52-
assertEquals(
53-
"[{name=X, value=Optional[x], domain=Optional.empty, path=/set, maxAge=-1, secure=false}]",
54-
req.cookies().toString());
33+
assertEquals("[X=x;Version=1;Path=/set]", req.cookies().toString());
5534
Optional<Cookie> cookie = req.cookie("X");
5635
rsp.send(cookie.isPresent() ? "present" : "deleted");
5736
});
@@ -73,13 +52,9 @@ public String list(final List<Cookie> cookies) {
7352
public void responseCookie() throws Exception {
7453
request()
7554
.get("/set")
76-
.expect(
77-
"{name=X, value=Optional[x], domain=Optional.empty, path=/set, maxAge=-1, secure=false}")
55+
.expect("X=x;Version=1;Path=/set")
7856
.header("Set-Cookie", setCookie -> {
79-
String undertow = "X=x; Version=1; Path=/set";
80-
String jetty = "X=x;Version=1;Path=/set";
81-
String netty = "X=x; Path=\"/set\"; Version=1";
82-
assertFirst(setCookie, undertow, jetty, netty);
57+
assertEquals("X=x;Version=1;Path=/set", setCookie);
8358
request()
8459
.get("/get")
8560
.header("Cookie", "X=x; $Path=/set; $Version=1")
@@ -100,22 +75,17 @@ public void noCookies() throws Exception {
10075
public void clearCookie() throws Exception {
10176
request()
10277
.get("/set")
103-
.expect(
104-
"{name=X, value=Optional[x], domain=Optional.empty, path=/set, maxAge=-1, secure=false}")
105-
.header("Set-Cookie", setCookie -> {
106-
assertFirst(setCookie, "X=x; Version=1; Path=/set", "X=x;Version=1;Path=/set",
107-
"X=x; Path=\"/set\"; Version=1");
108-
request()
109-
.get("/clear")
110-
.header("Cookie", "X=x; $Path=/clear; $Version=1")
111-
.expect(200)
112-
.header("Set-Cookie", expiredCookie -> {
113-
String undertow = "X=x; Version=1; Path=/clear; Max-Age=0";
114-
String jetty = "X=x;Path=/clear;Expires=Thu, 01-Jan-1970 00:00:00 GMT";
115-
String netty = "X=x; Max-Age=0; Path=\"/clear\"; Version=1";
116-
assertFirst(expiredCookie, undertow, jetty, netty);
117-
});
118-
});
78+
.expect("X=x;Version=1;Path=/set")
79+
.header("Set-Cookie",
80+
setCookie -> {
81+
assertEquals(setCookie, "X=x;Version=1;Path=/set");
82+
request()
83+
.get("/clear")
84+
.header("Cookie", "X=x; $Path=/clear; $Version=1")
85+
.expect(200)
86+
.header("Set-Cookie",
87+
"X=;Version=1;Max-Age=0;Expires=Thu, 01-Jan-1970 00:00:00 GMT");
88+
});
11989

12090
}
12191

@@ -125,18 +95,8 @@ public void listCookies() throws Exception {
12595
.get("/r/cookies")
12696
.header("Cookie", "X=x")
12797
.expect(200)
128-
.expect(
129-
"[{name=X, value=Optional[x], domain=Optional.empty, path=/, maxAge=-1, secure=false}]");
98+
.expect("[X=x;Version=1]");
13099

131100
}
132101

133-
private void assertFirst(final String found, final String... expectations) {
134-
for (String expect : expectations) {
135-
if (expect.equals(found)) {
136-
return;
137-
}
138-
}
139-
assertArrayEquals("expected " + Arrays.toString(expectations) + " found " + found,
140-
expectations, new String[]{found });
141-
}
142102
}

coverage-report/src/test/java/org/jooby/RequestParamFeature.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
import javax.inject.Named;
1212

13-
import org.jooby.Cookie;
1413
import org.jooby.mvc.GET;
1514
import org.jooby.mvc.Path;
1615
import org.jooby.test.ServerFeature;
@@ -314,14 +313,12 @@ public void cookieParam() throws Exception {
314313
request()
315314
.get("/cookie")
316315
.header("Cookie", "galleta=galleta")
317-
.expect(
318-
"{name=galleta, value=Optional[galleta], domain=Optional.empty, path=/, maxAge=-1, secure=false}");
316+
.expect("galleta=galleta;Version=1");
319317

320318
request()
321319
.get("/ocookie")
322320
.header("Cookie", "galleta=galleta")
323-
.expect(
324-
"Optional[{name=galleta, value=Optional[galleta], domain=Optional.empty, path=/, maxAge=-1, secure=false}]");
321+
.expect("Optional[galleta=galleta;Version=1]");
325322

326323
}
327324

coverage-report/src/test/java/org/jooby/RequestParamProdEnvFeature.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
import javax.inject.Named;
1212

13-
import org.jooby.Cookie;
1413
import org.jooby.mvc.GET;
1514
import org.jooby.mvc.Path;
1615
import org.jooby.test.ServerFeature;
@@ -320,14 +319,12 @@ public void cookieParam() throws Exception {
320319
request()
321320
.get("/cookie")
322321
.header("Cookie", "galleta=galleta")
323-
.expect(
324-
"{name=galleta, value=Optional[galleta], domain=Optional.empty, path=/, maxAge=-1, secure=false}");
322+
.expect("galleta=galleta;Version=1");
325323

326324
request()
327325
.get("/ocookie")
328326
.header("Cookie", "galleta=galleta")
329-
.expect(
330-
"Optional[{name=galleta, value=Optional[galleta], domain=Optional.empty, path=/, maxAge=-1, secure=false}]");
327+
.expect("Optional[galleta=galleta;Version=1]");
331328

332329
}
333330

coverage-report/src/test/java/org/jooby/ResponseHeaderFeature.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.jooby;
22

3-
import java.util.Date;
3+
import static org.junit.Assert.assertEquals;
4+
5+
import java.util.Calendar;
46

57
import org.jooby.test.ServerFeature;
68
import org.junit.Test;
@@ -9,15 +11,19 @@ public class ResponseHeaderFeature extends ServerFeature {
911

1012
{
1113
get("/headers", (req, rsp) -> {
14+
Calendar calendar = Calendar.getInstance();
15+
calendar.setTimeInMillis(1416700709415L);
1216
rsp.header("byte", (byte) 7);
1317
rsp.header("char", 'c');
1418
rsp.header("double", 7.0d);
1519
rsp.header("float", 2.1f);
1620
rsp.header("int", 4);
1721
rsp.header("long", 2L);
18-
rsp.header("date", new Date(1416700709415L));
22+
rsp.header("date", calendar.getTime());
23+
rsp.header("calendar", calendar);
1924
rsp.header("short", (short) 43);
2025
rsp.header("str", "str");
26+
rsp.header("list", 1, 2, 3, 4);
2127
rsp.status(200);
2228
});
2329
}
@@ -34,6 +40,13 @@ public void headers() throws Exception {
3440
.header("int", 4)
3541
.header("long", 2)
3642
.header("date", "Sat, 22 Nov 2014 23:58:29 GMT")
43+
.header("calendar", "Sat, 22 Nov 2014 23:58:29 GMT")
44+
.headers("list", values -> {
45+
assertEquals("1", values[0]);
46+
assertEquals("2", values[1]);
47+
assertEquals("3", values[2]);
48+
assertEquals("4", values[3]);
49+
})
3750
.header("short", 43)
3851
.header("str", "str");
3952
}

coverage-report/src/test/java/org/jooby/session/SessionConfigCookieFeature.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
import static org.junit.Assert.assertTrue;
44

55
import java.time.Instant;
6-
import java.time.OffsetDateTime;
7-
import java.time.ZoneOffset;
6+
import java.time.ZoneId;
87
import java.time.format.DateTimeFormatter;
98
import java.util.List;
109

@@ -44,9 +43,9 @@ public class SessionConfigCookieFeature extends ServerFeature {
4443
public void cookieConfig() throws Exception {
4544
long maxAge = System.currentTimeMillis() + 60 * 1000;
4645
// remove seconds to make sure test always work
47-
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, dd-MMM-yyyy HH:mm");
46+
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E, dd-MMM-yyyy HH:mm")
47+
.withZone(ZoneId.of("GMT"));
4848
Instant instant = Instant.ofEpochMilli(maxAge);
49-
OffsetDateTime utc = instant.atOffset(ZoneOffset.UTC);
5049

5150
request()
5251
.get("/session")
@@ -63,12 +62,9 @@ public void cookieConfig() throws Exception {
6362
assertTrue(value, setCookie.remove("Max-Age=60"));
6463
assertTrue(setCookie.remove("Domain=localhost"));
6564
assertTrue(value, setCookie.remove("Version=1"));
66-
setCookie.remove("Comment=\"jooby cookie\"");
67-
if (setCookie.size() > 0) {
68-
// Expires is optional on version=1?
69-
assertTrue(setCookie.remove(0).startsWith(
70-
"Expires=" + formatter.format(utc).replace("GMT", "")));
71-
}
65+
assertTrue(setCookie.remove("Comment=\"jooby cookie\""));
66+
assertTrue(setCookie.remove(0).startsWith(
67+
"Expires=" + formatter.format(instant).replace("GMT", "")));
7268
});
7369
}
7470

coverage-report/src/test/java/org/jooby/session/SessionCookieFeature.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
import static org.junit.Assert.assertTrue;
44

55
import java.time.Instant;
6-
import java.time.OffsetDateTime;
7-
import java.time.ZoneOffset;
6+
import java.time.ZoneId;
87
import java.time.format.DateTimeFormatter;
98
import java.util.List;
109

@@ -40,9 +39,9 @@ public class SessionCookieFeature extends ServerFeature {
4039
public void cookieConfig() throws Exception {
4140
long maxAge = System.currentTimeMillis() + 60 * 1000;
4241
// remove seconds to make sure test always work
43-
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, dd-MMM-yyyy HH:mm");
42+
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E, dd-MMM-yyyy HH:mm")
43+
.withZone(ZoneId.of("GMT"));
4444
Instant instant = Instant.ofEpochMilli(maxAge);
45-
OffsetDateTime utc = instant.atOffset(ZoneOffset.UTC);
4645

4746
request()
4847
.get("/session")
@@ -57,12 +56,9 @@ public void cookieConfig() throws Exception {
5756
assertTrue(setCookie.remove("Max-Age=60"));
5857
assertTrue(setCookie.remove("Domain=localhost"));
5958
assertTrue(setCookie.remove("Version=1"));
60-
setCookie.remove("Comment=\"jooby cookie\"");
61-
if (setCookie.size() > 0) {
62-
// Expires is optional on version=1?
63-
assertTrue(setCookie.remove(0).startsWith(
64-
"Expires=" + formatter.format(utc).replace("GMT", "")));
65-
}
59+
assertTrue(setCookie.remove("Comment=\"jooby cookie\""));
60+
assertTrue(setCookie.remove(0).startsWith(
61+
"Expires=" + formatter.format(instant).replace("GMT", "")));
6662
});
6763

6864
}

coverage-report/src/test/java/org/jooby/session/SessionCookieNoSecretFeature.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
import static org.junit.Assert.assertTrue;
44

55
import java.time.Instant;
6-
import java.time.OffsetDateTime;
7-
import java.time.ZoneOffset;
6+
import java.time.ZoneId;
87
import java.time.format.DateTimeFormatter;
98
import java.util.List;
109

@@ -33,9 +32,10 @@ public class SessionCookieNoSecretFeature extends ServerFeature {
3332
public void cookieConfig() throws Exception {
3433
long maxAge = System.currentTimeMillis() + 60 * 1000;
3534
// remove seconds to make sure test always work
36-
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, dd-MMM-yyyy HH:mm");
35+
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E, dd-MMM-yyyy HH:mm")
36+
.withZone(ZoneId.of("GMT"));
3737
Instant instant = Instant.ofEpochMilli(maxAge);
38-
OffsetDateTime utc = instant.atOffset(ZoneOffset.UTC);
38+
3939
request()
4040
.get("/session")
4141
.expect(200)
@@ -47,12 +47,8 @@ public void cookieConfig() throws Exception {
4747
assertTrue(setCookie.remove("HttpOnly") || setCookie.remove("HTTPOnly"));
4848
assertTrue(setCookie.remove("Max-Age=60"));
4949
assertTrue(setCookie.remove("Version=1"));
50-
setCookie.remove("Comment=\"jooby cookie\"");
51-
if (setCookie.size() > 0) {
52-
// Expires is optional on version=1?
53-
assertTrue(setCookie.remove(0).startsWith(
54-
"Expires=" + formatter.format(utc).replace("GMT", "")));
55-
}
50+
assertTrue(setCookie.remove(0).startsWith(
51+
"Expires=" + formatter.format(instant).replace("GMT", "")));
5652
});
5753

5854
}

0 commit comments

Comments
 (0)