From 12b23bb708b7d2a1bc5e9f81183d9a048ad787f0 Mon Sep 17 00:00:00 2001 From: "Nicolas NESMON (NicoNes)" Date: Wed, 9 Jun 2021 17:48:12 -0400 Subject: [PATCH] Fix NewCookie parsing Signed-off-by: Nicolas NESMON (NicoNes) --- .../delegates/NewCookieHeaderDelegate.java | 13 ++++--- .../jboss/resteasy/util/ParameterParser.java | 17 +++++----- .../cookie/NewCookieHeaderDelegateTest.java | 34 +++++++++++++++++++ 3 files changed, 50 insertions(+), 14 deletions(-) create mode 100644 testsuite/unit-tests/src/test/java/org/jboss/resteasy/test/cookie/NewCookieHeaderDelegateTest.java diff --git a/resteasy-core/src/main/java/org/jboss/resteasy/plugins/delegates/NewCookieHeaderDelegate.java b/resteasy-core/src/main/java/org/jboss/resteasy/plugins/delegates/NewCookieHeaderDelegate.java index ac831986a48..1e3aa3d3375 100644 --- a/resteasy-core/src/main/java/org/jboss/resteasy/plugins/delegates/NewCookieHeaderDelegate.java +++ b/resteasy-core/src/main/java/org/jboss/resteasy/plugins/delegates/NewCookieHeaderDelegate.java @@ -10,6 +10,7 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.LinkedHashMap; import java.util.Locale; import java.util.Map; @@ -21,6 +22,7 @@ public class NewCookieHeaderDelegate implements RuntimeDelegate.HeaderDelegate map = parser.parse(newCookie, ';'); + LinkedHashMap map = parser.parse(newCookie, ';'); for (Map.Entry entry : map.entrySet()) { String name = entry.getKey(); String value = entry.getValue(); - if (name.equalsIgnoreCase("Comment")) + // Cookie name is always the first attribute (https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.1). + if (cookieName == null) { + cookieName = name; + cookieValue = value; + } else if (name.equalsIgnoreCase("Comment")) comment = value; else if (name.equalsIgnoreCase("Domain")) domain = value; @@ -62,9 +68,6 @@ else if (name.equalsIgnoreCase("Expires")) { catch (ParseException e) { } - } else { - cookieName = name; - cookieValue = value; } } diff --git a/resteasy-core/src/main/java/org/jboss/resteasy/util/ParameterParser.java b/resteasy-core/src/main/java/org/jboss/resteasy/util/ParameterParser.java index 201fe46534c..e5b9b09535e 100644 --- a/resteasy-core/src/main/java/org/jboss/resteasy/util/ParameterParser.java +++ b/resteasy-core/src/main/java/org/jboss/resteasy/util/ParameterParser.java @@ -1,7 +1,6 @@ package org.jboss.resteasy.util; -import java.util.HashMap; -import java.util.Map; +import java.util.LinkedHashMap; /** * A simple parser intended to parse sequences of name/value pairs. @@ -223,11 +222,11 @@ public void setLowerCaseNames(boolean b) * @param separator the name/value pairs separator * @return a map of name/value pairs */ - public Map parse(final String str, char separator) + public LinkedHashMap parse(final String str, char separator) { if (str == null) { - return new HashMap(); + return new LinkedHashMap<>(); } return parse(str.toCharArray(), separator); } @@ -241,11 +240,11 @@ public Map parse(final String str, char separator) * @param separator the name/value pairs separator * @return a map of name/value pairs */ - public Map parse(final char[] chars, char separator) + public LinkedHashMap parse(final char[] chars, char separator) { if (chars == null) { - return new HashMap(); + return new LinkedHashMap<>(); } return parse(chars, 0, chars.length, separator); } @@ -261,7 +260,7 @@ public Map parse(final char[] chars, char separator) * @param separator the name/value pairs separator * @return a map of name/value pairs */ - public Map parse( + public LinkedHashMap parse( final char[] chars, int offset, int length, @@ -270,9 +269,9 @@ public Map parse( if (chars == null) { - return new HashMap(); + return new LinkedHashMap<>(); } - HashMap params = new HashMap(); + LinkedHashMap params = new LinkedHashMap<>(); this.chars = chars; this.pos = offset; this.len = length; diff --git a/testsuite/unit-tests/src/test/java/org/jboss/resteasy/test/cookie/NewCookieHeaderDelegateTest.java b/testsuite/unit-tests/src/test/java/org/jboss/resteasy/test/cookie/NewCookieHeaderDelegateTest.java new file mode 100644 index 00000000000..e52146f18c5 --- /dev/null +++ b/testsuite/unit-tests/src/test/java/org/jboss/resteasy/test/cookie/NewCookieHeaderDelegateTest.java @@ -0,0 +1,34 @@ +package org.jboss.resteasy.test.cookie; + +import static org.junit.Assert.assertEquals; + +import javax.ws.rs.core.NewCookie; + +import org.jboss.resteasy.plugins.delegates.NewCookieHeaderDelegate; +import org.junit.Before; +import org.junit.Test; + +public class NewCookieHeaderDelegateTest +{ + + private NewCookieHeaderDelegate delegate; + + @Before + public void setUp() throws Exception + { + delegate = new NewCookieHeaderDelegate(); + } + + @Test + public void testParseIgnoresUnknownCookieAttributes() + { + + String expectedCookieName = "JSESSIONID"; + String expectedCookieValue = "1fn1creezbh0117ej8n463jjwm"; + NewCookie newCookie = delegate.fromString(expectedCookieName + "=" + expectedCookieValue + ";Path=/path;UnknownAttribute=AnyValue"); + + assertEquals(expectedCookieName, newCookie.getName()); + assertEquals(expectedCookieValue, newCookie.getValue()); + } + +} \ No newline at end of file