Initial refactoring of the CookieSpecBase and Cookie classes

git-svn-id: https://svn.apache.org/repos/asf/jakarta/httpcomponents/httpclient/trunk@406430 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Oleg Kalnichevski 2006-05-14 20:57:03 +00:00
parent b4a8206230
commit 9166e32b85
3 changed files with 136 additions and 77 deletions

View File

@ -1,5 +1,5 @@
/*
* $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//httpclient/src/java/org/apache/commons/httpclient/Cookie.java,v 1.44 2004/06/05 16:49:20 olegk Exp $
* $HeadURL$
* $Revision$
* $Date$
*
@ -56,84 +56,11 @@ import org.apache.http.util.LangUtils;
*/
public class Cookie extends NameValuePair {
// ----------------------------------------------------------- Constructors
/**
* Default constructor. Creates a blank cookie
*/
public Cookie() {
this(null, "noname", null, null, null, false);
}
/**
* Creates a cookie with the given name, value and domain attribute.
*
* @param name the cookie name
* @param value the cookie value
* @param domain the domain this cookie can be sent to
*/
public Cookie(String domain, String name, String value) {
this(domain, name, value, null, null, false);
}
/**
* Creates a cookie with the given name, value, domain attribute,
* path attribute, expiration attribute, and secure attribute
*
* @param name the cookie name
* @param value the cookie value
* @param domain the domain this cookie can be sent to
* @param path the path prefix for which this cookie can be sent
* @param expires the {@link Date} at which this cookie expires,
* or <tt>null</tt> if the cookie expires at the end
* of the session
* @param secure if true this cookie can only be sent over secure
* connections
* @throws IllegalArgumentException If cookie name is null or blank,
* cookie name contains a blank, or cookie name starts with character $
*
*/
public Cookie(String domain, String name, String value,
String path, Date expires, boolean secure) {
public Cookie(final String name, final String value) {
super(name, value);
if (name == null) {
throw new IllegalArgumentException("Cookie name may not be null");
}
if (name.trim().equals("")) {
throw new IllegalArgumentException("Cookie name may not be blank");
}
this.setPath(path);
this.setDomain(domain);
this.setExpiryDate(expires);
this.setSecure(secure);
}
/**
* Creates a cookie with the given name, value, domain attribute,
* path attribute, maximum age attribute, and secure attribute
*
* @param name the cookie name
* @param value the cookie value
* @param domain the domain this cookie can be sent to
* @param path the path prefix for which this cookie can be sent
* @param maxAge the number of seconds for which this cookie is valid.
* maxAge is expected to be a non-negative number.
* <tt>-1</tt> signifies that the cookie should never expire.
* @param secure if <tt>true</tt> this cookie can only be sent over secure
* connections
*/
public Cookie(String domain, String name, String value, String path,
int maxAge, boolean secure) {
this(domain, name, value, path, null, secure);
if (maxAge < -1) {
throw new IllegalArgumentException("Invalid max age: " + Integer.toString(maxAge));
}
if (maxAge >= 0) {
setExpiryDate(new Date(System.currentTimeMillis() + maxAge * 1000L));
}
}
/**

View File

@ -60,9 +60,13 @@ public final class CookieOrigin {
throw new IllegalArgumentException(
"Path of origin may not be null.");
}
this.host = host;
this.host = host.toLowerCase();
this.port = port;
this.path = path;
if (!path.trim().equals("")) {
this.path = path;
} else {
this.path = "/";
}
this.secure = secure;
}

View File

@ -0,0 +1,128 @@
/*
* $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 java.util.Iterator;
import org.apache.http.HeaderElement;
import org.apache.http.NameValuePair;
import org.apache.http.cookie.Cookie;
import org.apache.http.cookie.CookieAttributeHandler;
import org.apache.http.cookie.CookieOrigin;
import org.apache.http.cookie.MalformedCookieException;
/**
* Cookie management functions shared by all specification.
*
* @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
*
* @since 2.0
*/
public abstract class CookieSpecBase extends AbstractCookieSpec {
protected static String getDefaultPath(final CookieOrigin origin) {
String defaultPath = origin.getPath();
int lastSlashIndex = defaultPath.lastIndexOf('/');
if (lastSlashIndex >= 0) {
if (lastSlashIndex == 0) {
//Do not remove the very first slash
lastSlashIndex = 1;
}
defaultPath = defaultPath.substring(0, lastSlashIndex);
}
return defaultPath;
}
protected static String getDefaultDomain(final CookieOrigin origin) {
return origin.getHost();
}
protected Cookie[] parse(final HeaderElement[] elems, final CookieOrigin origin)
throws MalformedCookieException {
Cookie[] cookies = new Cookie[elems.length];
for (int i = 0; i < elems.length; i++) {
HeaderElement headerelement = elems[i];
String name = headerelement.getName();
String value = headerelement.getValue();
if (name == null || name.equals("")) {
throw new MalformedCookieException("Cookie name may not be empty");
}
Cookie cookie = new Cookie(name, value);
cookie.setPath(getDefaultPath(origin));
cookie.setDomain(getDefaultDomain(origin));
// cycle through the parameters
NameValuePair[] attribs = headerelement.getParameters();
for (int j = attribs.length - 1; j >= 0; j--) {
NameValuePair attrib = attribs[j];
String s = attrib.getName().toLowerCase();
CookieAttributeHandler handler = findAttribHandler(s);
if (handler != null) {
handler.parse(cookie, attrib.getValue());
}
}
cookies[i] = cookie;
}
return cookies;
}
public void validate(final Cookie cookie, final CookieOrigin origin)
throws MalformedCookieException {
if (cookie == null) {
throw new IllegalArgumentException("Cookie may not be null");
}
if (origin == null) {
throw new IllegalArgumentException("Cookie origin may not be null");
}
for (Iterator i = getAttribHandlerIterator(); i.hasNext();) {
CookieAttributeHandler handler = (CookieAttributeHandler) i.next();
handler.validate(cookie, origin);
}
}
public boolean match(final Cookie cookie, final CookieOrigin origin) {
if (cookie == null) {
throw new IllegalArgumentException("Cookie may not be null");
}
if (origin == null) {
throw new IllegalArgumentException("Cookie origin may not be null");
}
for (Iterator i = getAttribHandlerIterator(); i.hasNext();) {
CookieAttributeHandler handler = (CookieAttributeHandler) i.next();
if (!handler.match(cookie, origin)) {
return false;
}
}
return true;
}
}