Cookie Utilities
/**********************************************************************************
*
* Copyright (c) 2003, 2004 The Regents of the University of Michigan, Trustees of Indiana University,
* Board of Trustees of the Leland Stanford, Jr., University, and The MIT Corporation
*
* Licensed under the Educational Community License Version 1.0 (the "License");
* By obtaining, using and/or copying this Original Work, you agree that you have read,
* understand, and will comply with the terms and conditions of the Educational Community License.
* You may obtain a copy of the License at:
*
* http://cvs.sakaiproject.org/licenses/license_1_0.html
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
**********************************************************************************/
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class CookieUtils {
private CookieUtils() {
}
/**
* Get a new (empty) CookieData list return An empty ArrayList
*/
public static List newCookieList() {
return new ArrayList();
}
/**
* Parse an HTTP cookie
*
* @param value
* Cookie value
* @return A CookieData object representing this cookie
*/
public static CookieData parseCookie(URL url, String value) {
String[] cookieFields;
CookieData cookie;
cookieFields = value.split(";\\s*");
cookie = makeCookieData(url, cookieFields[0]);
for (int j = 1; j < cookieFields.length; j++) {
if ("secure".equalsIgnoreCase(cookieFields[j])) {
cookie.setSecure(true);
continue;
}
if (cookieFields[j].indexOf('=') > 0) {
String[] field = cookieFields[j].split("=");
if ("expires".equalsIgnoreCase(field[0])) {
cookie.setExpires(field[1]);
} else if ("domain".equalsIgnoreCase(field[0])) {
cookie.setDomain(field[1]);
} else if ("path".equalsIgnoreCase(field[0])) {
cookie.setPath(field[1]);
} else if ("version".equalsIgnoreCase(field[0])) {
cookie.setVersion(field[1]);
} else if ("max-age".equalsIgnoreCase(field[0])) {
cookie.setMaxAge(field[1]);
}
}
}
return cookie;
}
/**
* Build a CookieData object from cookieName=cookieValue text
*
* @param url
* URL this cookie belongs to
* @param cookieText
* cookieName[=cookieValue] text
* @return A new CookieData object
*/
private static CookieData makeCookieData(URL url, String cookieText) {
for (int i = 0; i < cookieText.length(); i++) {
if (cookieText.charAt(i) == '=') {
String name = cookieText.substring(0, i);
String value = "";
if (i + 1 <= cookieText.length()) {
value = cookieText.substring(i + 1);
}
return new CookieData(url, name, value);
}
}
return new CookieData(url, cookieText, "");
}
/**
* Maintain a list of CookieData objects (add, replace, or delete a cookie)
*
* @param cookieList
* CookieData list
* @param cookie
* A CookieData object
*/
public static void storeCookie(List cookieList, CookieData cookie) {
int size = cookieList.size();
for (int i = 0; i < size; i++) {
CookieData cd = (CookieData) cookieList.get(i);
if (cookie.equals(cd)) {
if (cookie.getMaxAge() == 0) {
cookieList.remove(i);
return;
}
cookieList.set(i, cookie);
return;
}
}
if (cookie.getMaxAge() != 0) {
cookieList.add(cookie);
}
}
/**
* Does the cookie domain match the URL?
*
* @param urlString
* URL String to match
* @param cookie
* CookieData object (the cookie)
* @return true if the cookie domain matches the URL
*/
public static boolean inDomain(String urlString, CookieData cookie) {
URL url;
try {
url = new URL(urlString);
} catch (MalformedURLException exception) {
return false;
}
return inDomain(url, cookie);
}
/**
* Does the cookie domain match the URL?
*
* @param url
* URL to match
* @param cookie
* CookieData object (the cookie)
* @return true if the cookie domain matches the URL
*/
public static boolean inDomain(URL url, CookieData cookie) {
String domain = cookie.getDomain();
return url.getHost().toLowerCase().endsWith(domain.toLowerCase());
}
/**
* Does the cookie path match the URL "file"?
*
* @param urlString
* String URL to match
* @param cookie
* CookieData object (the cookie)
* @return true if the cookie domain matches the URL
*/
public static boolean inPath(String urlString, CookieData cookie) {
URL url;
try {
url = new URL(urlString);
} catch (MalformedURLException exception) {
return false;
}
return inPath(url, cookie);
}
/**
* Does the cookie path match the URL "file"?
*
* @param url
* URL to match
* @param cookie
* CookieData object (the cookie)
* @return true if the cookie domain matches the URL
*/
public static boolean inPath(URL url, CookieData cookie) {
return url.getFile().startsWith(cookie.getPath());
}
/**
* Find all stored cookies which associated with this server
*
* @param cookieList
* List of stored cookies (CookieData objects)
* @param url
* URL representing the request to lookup (server)
* @return A List of associated cookies
*/
public static List findCookiesForServer(List cookieList, URL url) {
Iterator iterator = cookieList.iterator();
ArrayList list = new ArrayList();
while (iterator.hasNext()) {
CookieData cookie = (CookieData) iterator.next();
if ((inDomain(url, cookie)) && (inPath(url, cookie))) {
list.add(cookie);
}
}
return list;
}
/**
* Find cookies associated with this server (by name)
*
* @param cookieList
* List of stored cookies (CookieData objects)
* @param url
* URL representing the request to lookup (server)
* @param name
* Cookie name
* @param exact
* true for exact name match, false to match on name prefix
* @return A List of associated cookies
*/
public static List getCookies(List cookieList, URL url, String name, boolean exact) {
List serverCookies = findCookiesForServer(cookieList, url);
Iterator iterator = serverCookies.iterator();
ArrayList list = new ArrayList();
while (iterator.hasNext()) {
CookieData cookie = (CookieData) iterator.next();
if (exact) {
if (cookie.getName().equals(name)) {
list.add(cookie);
}
continue;
}
if (cookie.getName().startsWith(name)) {
list.add(cookie);
}
}
return list;
}
/**
* Find cookies associated with this server (exact name match)
*
* @param cookieList
* List of stored cookies (CookieData objects)
* @param url
* URL representing the request to lookup (server)
* @param name
* Cookie name
* @return A List of associated cookies
*/
public static List getCookiesByName(List cookieList, URL url, String name) {
return getCookies(cookieList, url, name, true);
}
/**
* Find cookies associated with this server (match on name "prefix")
*
* @param cookieList
* List of stored cookies (CookieData objects)
* @param url
* URL representing the request to lookup (server)
* @param name
* Cookie name
* @return A List of associated cookies
*/
public static List getCookiesByPrefix(List cookieList, URL url, String name) {
return getCookies(cookieList, url, name, false);
}
}
/*******************************************************************************
*
* Copyright (c) 2003, 2004 The Regents of the University of Michigan, Trustees
* of Indiana University, Board of Trustees of the Leland Stanford, Jr.,
* University, and The MIT Corporation
*
* Licensed under the Educational Community License Version 1.0 (the "License");
* By obtaining, using and/or copying this Original Work, you agree that you
* have read, understand, and will comply with the terms and conditions of the
* Educational Community License. You may obtain a copy of the License at:
*
* http://cvs.sakaiproject.org/licenses/license_1_0.html
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
******************************************************************************/
/**
* Represent a single cookie
*/
class CookieData {
/**
* Null (unset) cookie age
*/
public static final int NULL_AGE = -1;
/**
* Expired cookie
*/
public static final int EXPIRED_AGE = 0;
private String key;
private String value;
private String path;
private String domain;
private String version;
private String expires;
private int maxAge;
private boolean secure;
private CookieData() {
}
/**
* Constructor
*
* @param url
* URL associated with this cookie
* @param key
* Cookie name
* @param value
* Cookie value
*/
public CookieData(URL url, String key, String value) {
int slash = url.getFile().lastIndexOf("/");
/*
* Save cookie name and content
*/
this.key = key;
this.value = value;
/*
* Domain defaults to hostname, path to the "directory" portion of the
* request, minus all text from the rightmost "/" character to the end of
* the string...
*/
this.path = slash < 1 ? "" : url.getFile().substring(0, slash);
this.domain = url.getHost();
this.version = null;
this.expires = null;
this.maxAge = NULL_AGE;
this.secure = false;
}
/**
* Get cookie name
*
* @return The cooke name
*/
public String getName() {
return this.key;
}
/**
* Get cookie value (the cookie "text")
*
* @return The value
*/
public String getValue() {
return this.value;
}
/**
* Save the path
*/
public void setPath(String path) {
this.path = path;
}
/**
* Get the path
*
* @return The cooke path attribute value (null if none)
*/
public String getPath() {
return this.path;
}
/**
* Save the expiration date
*/
public void setExpires(String expires) {
this.expires = expires;
}
/**
* Get the expiration date
*
* @return The expires attribute value (null if none)
*/
public String getExpires() {
return this.expires;
}
/**
* Save the domain
*/
public void setDomain(String domain) {
this.domain = domain;
}
/**
* Get the domain
*
* @return The domain attribute value (null if none)
*/
public String getDomain() {
return this.domain;
}
/**
* Save the version
*/
public void setVersion(String version) {
this.version = version;
}
/**
* Get the cookie version
*
* @return The version (null if none)
*/
public String getVersion() {
return this.version;
}
/**
* Set the maximum age for this cookie
*/
public void setMaxAge(String maxAge) {
try {
this.maxAge = Integer.parseInt(maxAge);
} catch (NumberFormatException ignore) {
}
}
/**
* Get the maximum age for this cookie
*/
public int getMaxAge() {
return this.maxAge;
}
/**
* Save security setting (true if cookie to be sent only via HTTPS)
*/
public void setSecure(boolean secure) {
this.secure = secure;
}
public boolean getSecure() {
return this.secure;
}
/**
* Equal strings?
*
* @param a
* String one
* @param b
* Stringtwo
* @return true if both are null, or String "equals" is true
*/
private boolean stringEquals(String a, String b) {
if ((a == null) && (b == null)) {
return true;
}
if ((a == null) || (b == null)) {
return false;
}
return a.equals(b);
}
/**
* Equal cookies?
*
* @param cookie
* for comparison
* @return true if cookie name, path, and domain are all equal
*/
public boolean equals(CookieData cookie) {
if (!key.equals(cookie.getName())) {
return false;
}
return stringEquals(path, cookie.getPath()) && stringEquals(domain, cookie.getDomain());
}
}
Related examples in the same category