Refactored the browser compatibility cookie policy ported from the Commons HttpClient 3.x code line

git-svn-id: https://svn.apache.org/repos/asf/jakarta/httpcomponents/httpclient/trunk@409981 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Oleg Kalnichevski 2006-05-28 19:46:39 +00:00
parent 134c37f28a
commit b7476807f1
3 changed files with 143 additions and 0 deletions

View File

@ -102,6 +102,9 @@ public class BrowserCompatDomainHandler implements CookieAttributeHandler {
}
String host = origin.getHost();
String domain = cookie.getDomain();
if (domain == null) {
return false;
}
if (host.equals(domain)) {
return true;
}

View File

@ -0,0 +1,137 @@
/*
* $HeadURL$
* $Revision$
* $Date$
*
* ====================================================================
*
* Copyright 2002-2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
*/
package org.apache.http.cookie.impl;
import org.apache.http.Header;
import org.apache.http.HeaderElement;
import org.apache.http.cookie.Cookie;
import org.apache.http.cookie.CookieOrigin;
import org.apache.http.cookie.MalformedCookieException;
import org.apache.http.io.CharArrayBuffer;
import org.apache.http.util.DateParseException;
import org.apache.http.util.DateUtils;
/**
* Cookie specification that stives to closely mimic (mis)behavior of
* common web browser applications such as Microsoft Internet Explorer
* and Mozilla FireFox.
*
* @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
*
* @since 4.0
*/
public class BrowserCompatSpec extends CookieSpecBase {
/** Valid date patterns */
private String[] datepatterns = new String[] {
DateUtils.PATTERN_RFC1123,
DateUtils.PATTERN_RFC1036,
DateUtils.PATTERN_ASCTIME,
"EEE, dd-MMM-yyyy HH:mm:ss z",
"EEE, dd-MMM-yyyy HH-mm-ss z",
"EEE, dd MMM yy HH:mm:ss z",
"EEE dd-MMM-yyyy HH:mm:ss z",
"EEE dd MMM yyyy HH:mm:ss z",
"EEE dd-MMM-yyyy HH-mm-ss z",
"EEE dd-MMM-yy HH:mm:ss z",
"EEE dd MMM yy HH:mm:ss z",
"EEE,dd-MMM-yy HH:mm:ss z",
"EEE,dd-MMM-yyyy HH:mm:ss z",
"EEE, dd-MM-yyyy HH:mm:ss z",
};
/** Default constructor */
public BrowserCompatSpec() {
super();
registerAttribHandler("path", new BasicPathHandler());
registerAttribHandler("domain", new BrowserCompatDomainHandler());
registerAttribHandler("max-age", new BasicMaxAgeHandler());
registerAttribHandler("secure", new BasicSecureHandler());
registerAttribHandler("comment", new BasicCommentHandler());
registerAttribHandler("expires", new BasicExpiresHandler(this.datepatterns));
}
public Cookie[] parse(final Header header, final CookieOrigin origin)
throws MalformedCookieException {
if (header == null) {
throw new IllegalArgumentException("Header may not be null");
}
if (header == null) {
throw new IllegalArgumentException("Cookie origin may not be null");
}
String headervalue = header.getValue();
boolean isNetscapeCookie = false;
int i1 = headervalue.toLowerCase().indexOf("expires=");
if (i1 != -1) {
i1 += "expires=".length();
int i2 = headervalue.indexOf(";", i1);
if (i2 == -1) {
i2 = headervalue.length();
}
try {
DateUtils.parseDate(headervalue.substring(i1, i2), this.datepatterns);
isNetscapeCookie = true;
} catch (DateParseException e) {
// Does not look like a valid expiry date
}
}
HeaderElement[] elems = null;
if (isNetscapeCookie) {
elems = new HeaderElement[] { HeaderElement.parse(headervalue) };
} else {
elems = header.getElements();
}
return parse(elems, origin);
}
public Header[] formatCookies(final Cookie[] cookies) {
if (cookies == null) {
throw new IllegalArgumentException("Cookie array may not be null");
}
if (cookies.length == 0) {
throw new IllegalArgumentException("Cookie array may not be empty");
}
CharArrayBuffer buffer = new CharArrayBuffer(20 * cookies.length);
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
if (i > 0) {
buffer.append("; ");
}
buffer.append(cookie.getName());
buffer.append("=");
String s = cookie.getValue();
if (s != null) {
buffer.append(s);
}
}
return new Header[] { new Header("Cookie", buffer.toString()) };
}
}

View File

@ -103,6 +103,9 @@ public abstract class CookieSpecBase extends AbstractCookieSpec {
if (origin == null) {
throw new IllegalArgumentException("Cookie origin may not be null");
}
if (cookie.getName() == null || cookie.getName().trim().equals("")) {
throw new MalformedCookieException("Cookie name may not be blank");
}
for (Iterator i = getAttribHandlerIterator(); i.hasNext();) {
CookieAttributeHandler handler = (CookieAttributeHandler) i.next();
handler.validate(cookie, origin);