package com.macfaq.http; import java.net.URI; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; public class Cookie { private String version = "0"; private String name; private String value; private URI uri; private String domain; private Date expires; private String path; private boolean secure = false; private static DateFormat expiresFormat = new SimpleDateFormat("E, dd-MMM-yyyy k:m:s 'GMT'"); // prevent instantiation private Cookie() {} public static Cookie bake(String header, URI uri) throws CookieException { try { String[] attributes = header.split(";"); String nameValue = attributes[0]; Cookie cookie = new Cookie(); cookie.uri = uri; cookie.name = nameValue.substring(0, nameValue.indexOf('=')); cookie.value = nameValue.substring(nameValue.indexOf('=')+1); cookie.path = "/"; cookie.domain = uri.getHost(); if (attributes[attributes.length-1].trim().equals("secure")) { cookie.secure = true; } for (int i=1; i < attributes.length; i++) { nameValue = attributes[i].trim(); int equals = nameValue.indexOf('='); if (equals == -1) continue; String attributeName = nameValue.substring(0, equals); String attributeValue = nameValue.substring(equals+1); if (attributeName.equalsIgnoreCase("domain")) { String uriDomain = uri.getHost(); if (uriDomain.equals(attributeValue)) { cookie.domain = attributeValue; } else { if (!attributeValue.startsWith(".")) { attributeValue = "." + attributeValue; } uriDomain = uriDomain.substring(uriDomain.indexOf('.')); if (!uriDomain.equals(attributeValue)) { throw new CookieException( "Server tried to set cookie in another domain"); } cookie.domain = attributeValue; } } else if (attributeName.equalsIgnoreCase("path")) { cookie.path = attributeValue; } else if (attributeName.equalsIgnoreCase("expires")) { cookie.expires = expiresFormat.parse(attributeValue); } else if (attributeName.equalsIgnoreCase("Version")) { if (!"1".equals(attributeValue)) { throw new CookieException("Unexpected version " + attributeValue); } cookie.version = attributeValue; } } return cookie; } catch (Exception ex) { // ParseException, StringIndexOutOfBoundsException etc. throw new CookieException(ex); } } public boolean isExpired() { if (expires == null) return false; Date now = new Date(); return now.after(expires); } public String getName() { return name; } public boolean isSecure() { return secure; } public URI getURI() { return uri; } public String getVersion() { return version; } // should this cookie be sent when retrieving the specified URI? public boolean matches(URI u) { if (isExpired()) return false; String path = u.getPath(); if (path == null) path = "/"; if (path.startsWith(this.path)) return true; return false; } public String toExternalForm() { StringBuffer result = new StringBuffer(name); result.append("="); result.append(value); if ("1".equals(version)) { result.append(" Version=1"); } return result.toString(); } }