Skip to content

Commit 3e2bca5

Browse files
committed
[UNDERTOW-2603] Fix double cookie on quoted value
1 parent 40a00c3 commit 3e2bca5

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

core/src/main/java/io/undertow/util/Cookies.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,35 @@ private static void parseCookie(final String cookie, final Set<Cookie> parsedCoo
326326
i++;
327327
cookieCount = createCookie(name, containsEscapedQuotes ? unescapeDoubleQuotes(cookie.substring(start, i)) : cookie.substring(start, i), maxCookies, cookieCount, cookies, additional);
328328
} else {
329+
final boolean existed = cookies.containsKey(name);
329330
cookieCount = createCookie(name, containsEscapedQuotes ? unescapeDoubleQuotes(cookie.substring(start, i)) : cookie.substring(start, i), maxCookies, cookieCount, cookies, additional);
331+
//if there is more, make sure next is separator
332+
if (i + 1 < cookie.length() && (cookie.charAt(i + 1) == ';' // Cookie: key="\"; key2=...
333+
|| (commaIsSeperator && cookie.charAt(i + 1) == ','))) { // Cookie: key="\", key2=...
334+
//adjust position to delimiter and let state == 0 spin again whole thing
335+
i++;
336+
start++;
337+
} else {
338+
if(UndertowLogger.REQUEST_LOGGER.isTraceEnabled()) {
339+
UndertowLogger.REQUEST_LOGGER.trace("Ignoring invalid cookies in header " + cookie);
340+
}
341+
if(!existed) {
342+
//RN we dont add copy, so lets not remove proper cookie that we stored
343+
//prior to this one
344+
cookies.remove(name);
345+
}
346+
additional.remove(name);
347+
//seek next separator
348+
while(i<cookie.length()) {
349+
char seeker = cookie.charAt(i);
350+
if(!(seeker == ';' // Cookie: key="\"; key2=...
351+
|| (commaIsSeperator && seeker == ','))) {
352+
i++;
353+
} else {
354+
break;
355+
}
356+
}
357+
}
330358
}
331359
state = 0;
332360
start = i + 1;

core/src/test/java/io/undertow/util/CookiesTestCase.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,15 @@ public void testCommaSeparatedCookies() {
221221
cookie = cookies.get("SHIPPING");
222222
Assert.assertNotNull(cookie);
223223
Assert.assertEquals("FEDEX", cookie.getValue());
224+
225+
cookies = Cookies.parseRequestCookies(5, false, Arrays.asList("CUSTOMER=\"WILE_E_COYOTE\", BAD_CUSTOMER=\"APPLE\" IGNORED=PART, SHIPPING=FEDEX" ), true);
226+
Assert.assertEquals(2, cookies.size());
227+
cookie = cookies.get("CUSTOMER");
228+
Assert.assertNotNull(cookie);
229+
Assert.assertEquals("WILE_E_COYOTE", cookie.getValue());
230+
cookie = cookies.get("SHIPPING");
231+
Assert.assertNotNull(cookie);
232+
Assert.assertEquals("FEDEX", cookie.getValue());
224233
}
225234

226235
@Test

0 commit comments

Comments
 (0)