diff --git a/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/HttpCookie.java b/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/HttpCookie.java index 030afc0b7c70..0b7b4ba5fe41 100644 --- a/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/HttpCookie.java +++ b/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/HttpCookie.java @@ -128,7 +128,7 @@ default String getPath() */ default boolean isSecure() { - return Boolean.parseBoolean(getAttributes().get(SECURE_ATTRIBUTE)); + return isSetToNotFalse(SECURE_ATTRIBUTE); } /** @@ -146,7 +146,7 @@ default SameSite getSameSite() */ default boolean isHttpOnly() { - return Boolean.parseBoolean(getAttributes().get(HTTP_ONLY_ATTRIBUTE)); + return isSetToNotFalse(HTTP_ONLY_ATTRIBUTE); } /** @@ -155,8 +155,13 @@ default boolean isHttpOnly() */ default boolean isPartitioned() { - String partitioned = getAttributes().get(PARTITIONED_ATTRIBUTE); - return partitioned != null && !StringUtil.asciiEqualsIgnoreCase("false", partitioned); + return isSetToNotFalse(PARTITIONED_ATTRIBUTE); + } + + private boolean isSetToNotFalse(String attribute) + { + String value = getAttributes().get(attribute); + return value != null && !StringUtil.asciiEqualsIgnoreCase("false", value); } /** diff --git a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/HttpCookieUtils.java b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/HttpCookieUtils.java index cb54a57bd794..84750a5085ca 100644 --- a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/HttpCookieUtils.java +++ b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/HttpCookieUtils.java @@ -27,6 +27,7 @@ import org.eclipse.jetty.util.Attributes; import org.eclipse.jetty.util.Index; import org.eclipse.jetty.util.QuotedStringTokenizer; +import org.eclipse.jetty.util.StringUtil; /** *
Utility methods for server-side HTTP cookie handling.
@@ -291,8 +292,9 @@ public static String getRFC6265SetCookie(HttpCookie httpCookie) { if (KNOWN_ATTRIBUTES.contains(e.getKey())) continue; - builder.append("; ").append(e.getKey()).append("="); - builder.append(e.getValue()); + builder.append("; ").append(e.getKey()); + if (StringUtil.isNotBlank(e.getValue())) + builder.append("=").append(e.getValue()); } return builder.toString(); diff --git a/jetty-core/jetty-server/src/test/java/org/eclipse/jetty/server/HttpCookieTest.java b/jetty-core/jetty-server/src/test/java/org/eclipse/jetty/server/HttpCookieTest.java index 56767860f8ab..f06eb29de726 100644 --- a/jetty-core/jetty-server/src/test/java/org/eclipse/jetty/server/HttpCookieTest.java +++ b/jetty-core/jetty-server/src/test/java/org/eclipse/jetty/server/HttpCookieTest.java @@ -93,7 +93,7 @@ public void testMatchCookie() } @Test - public void testSetRFC2965Cookie() throws Exception + public void testSetRFC2965Cookie() { HttpCookie httpCookie; @@ -162,10 +162,12 @@ public void testSetRFC6265Cookie() assertEquals("everything=value; Path=path; Domain=domain; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; HttpOnly; Partitioned; SameSite=Strict", HttpCookieUtils.getRFC6265SetCookie(httpCookie)); httpCookie = HttpCookie.from("everything", "value", Map.of(HttpCookie.DOMAIN_ATTRIBUTE, "domain", HttpCookie.PATH_ATTRIBUTE, "path", HttpCookie.MAX_AGE_ATTRIBUTE, Long.toString(1), HttpCookie.HTTP_ONLY_ATTRIBUTE, Boolean.toString(true), HttpCookie.SECURE_ATTRIBUTE, Boolean.toString(true), HttpCookie.SAME_SITE_ATTRIBUTE, SameSite.STRICT.getAttributeValue(), HttpCookie.PARTITIONED_ATTRIBUTE, Boolean.toString(true))); - String rfc6265SetCookie = HttpCookieUtils.getRFC6265SetCookie(httpCookie); assertThat(rfc6265SetCookie, startsWith("everything=value; Path=path; Domain=domain; Expires=")); assertThat(rfc6265SetCookie, endsWith(" GMT; Max-Age=1; Secure; HttpOnly; Partitioned; SameSite=Strict")); + + httpCookie = HttpCookie.from("everything", "value", -1, Map.of(HttpCookie.DOMAIN_ATTRIBUTE, "domain", HttpCookie.PATH_ATTRIBUTE, "path", HttpCookie.MAX_AGE_ATTRIBUTE, Long.toString(0), HttpCookie.HTTP_ONLY_ATTRIBUTE, Boolean.toString(true), HttpCookie.SECURE_ATTRIBUTE, Boolean.toString(true), "Other", "attribute", "Single", "")); + assertEquals("everything=value; Path=path; Domain=domain; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; HttpOnly; Other=attribute; Single", HttpCookieUtils.getRFC6265SetCookie(httpCookie)); } public static Stream