6901170: HttpCookie parsing of version and max-age mis-handled

Accept single quotes in cookies and better exception handling in CookieManager

Reviewed-by: chegar
This commit is contained in:
Jean-Christophe Collet 2009-11-20 14:50:55 +01:00
parent 8d62fe076c
commit 4da1e67db3
3 changed files with 23 additions and 6 deletions

View file

@ -30,6 +30,7 @@ import java.util.List;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.io.IOException; import java.io.IOException;
import sun.util.logging.PlatformLogger;
/** /**
* CookieManager provides a concrete implementation of {@link CookieHandler}, * CookieManager provides a concrete implementation of {@link CookieHandler},
@ -263,6 +264,7 @@ public class CookieManager extends CookieHandler
if (cookieJar == null) if (cookieJar == null)
return; return;
PlatformLogger logger = PlatformLogger.getLogger("java.net.CookieManager");
for (String headerKey : responseHeaders.keySet()) { for (String headerKey : responseHeaders.keySet()) {
// RFC 2965 3.2.2, key must be 'Set-Cookie2' // RFC 2965 3.2.2, key must be 'Set-Cookie2'
// we also accept 'Set-Cookie' here for backward compatibility // we also accept 'Set-Cookie' here for backward compatibility
@ -277,7 +279,16 @@ public class CookieManager extends CookieHandler
for (String headerValue : responseHeaders.get(headerKey)) { for (String headerValue : responseHeaders.get(headerKey)) {
try { try {
List<HttpCookie> cookies = HttpCookie.parse(headerValue); List<HttpCookie> cookies;
try {
cookies = HttpCookie.parse(headerValue);
} catch (IllegalArgumentException e) {
// Bogus header, make an empty list and log the error
cookies = java.util.Collections.EMPTY_LIST;
if (logger.isLoggable(PlatformLogger.SEVERE)) {
logger.severe("Invalid cookie for " + uri + ": " + headerValue);
}
}
for (HttpCookie cookie : cookies) { for (HttpCookie cookie : cookies) {
if (cookie.getPath() == null) { if (cookie.getPath() == null) {
// If no path is specified, then by default // If no path is specified, then by default

View file

@ -1036,7 +1036,7 @@ public final class HttpCookie implements Cloneable {
int version = Integer.parseInt(attrValue); int version = Integer.parseInt(attrValue);
cookie.setVersion(version); cookie.setVersion(version);
} catch (NumberFormatException ignored) { } catch (NumberFormatException ignored) {
throw new IllegalArgumentException("Illegal cookie version attribute"); // Just ignore bogus version, it will default to 0 or 1
} }
} }
}); });
@ -1147,12 +1147,15 @@ public final class HttpCookie implements Cloneable {
} }
private static String stripOffSurroundingQuote(String str) { private static String stripOffSurroundingQuote(String str) {
if (str != null && str.length() > 0 && if (str != null && str.length() > 2 &&
str.charAt(0) == '"' && str.charAt(str.length() - 1) == '"') { str.charAt(0) == '"' && str.charAt(str.length() - 1) == '"') {
return str.substring(1, str.length() - 1); return str.substring(1, str.length() - 1);
} else {
return str;
} }
if (str != null && str.length() > 2 &&
str.charAt(0) == '\'' && str.charAt(str.length() - 1) == '\'') {
return str.substring(1, str.length() - 1);
}
return str;
} }
private static boolean equalsIgnoreCase(String s, String t) { private static boolean equalsIgnoreCase(String s, String t) {

View file

@ -24,7 +24,7 @@
/** /**
* @test * @test
* @summary Unit test for java.net.HttpCookie * @summary Unit test for java.net.HttpCookie
* @bug 6244040 6277796 6277801 6277808 6294071 6692802 6790677 * @bug 6244040 6277796 6277801 6277808 6294071 6692802 6790677 6901170
* @author Edward Wang * @author Edward Wang
*/ */
@ -335,6 +335,9 @@ public class TestHttpCookie {
// bug 6277801 // bug 6277801
test("set-cookie: CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT; path=\"/acme\"") test("set-cookie: CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT; path=\"/acme\"")
.n("CUSTOMER").v("WILE_E_COYOTE").p("/").ver(0); .n("CUSTOMER").v("WILE_E_COYOTE").p("/").ver(0);
// bug 6901170
test("set-cookie: CUSTOMER=WILE_E_COYOTE; version='1'").ver(1);
} }
static void misc() { static void misc() {