001: package com.meterware.httpunit.cookies;
002:
003: /********************************************************************************************************************
004: * $Id: Cookie.java,v 1.6 2004/09/24 20:13:16 russgold Exp $
005: *
006: * Copyright (c) 2002, Russell Gold
007: *
008: * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
009: * documentation files (the "Software"), to deal in the Software without restriction, including without limitation
010: * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
011: * to permit persons to whom the Software is furnished to do so, subject to the following conditions:
012: *
013: * The above copyright notice and this permission notice shall be included in all copies or substantial portions
014: * of the Software.
015: *
016: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
017: * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
018: * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
019: * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
020: * DEALINGS IN THE SOFTWARE.
021: *
022: *******************************************************************************************************************/
023: import java.util.Map;
024: import java.util.Iterator;
025: import java.net.URL;
026:
027: /**
028: * An HTTP client-side cookie.
029: * @author <a href="mailto:russgold@httpunit.org">Russell Gold</a>
030: **/
031: public class Cookie {
032:
033: private String _name;
034:
035: private String _value;
036:
037: private String _path;
038:
039: private String _domain;
040:
041: private long _expiredTime;
042:
043: /**
044: * Constructs a cookie w/o any domain or path restrictions.
045: */
046: Cookie(String name, String value) {
047: _name = name;
048: _value = value;
049: }
050:
051: Cookie(String name, String value, Map attributes) {
052: this (name, value);
053: for (Iterator iterator = attributes.keySet().iterator(); iterator
054: .hasNext();) {
055: String key = (String) iterator.next();
056: String attributeValue = (String) attributes.get(key);
057: if (key.equalsIgnoreCase("path")) {
058: _path = attributeValue;
059: } else if (key.equalsIgnoreCase("domain")) {
060: _domain = attributeValue;
061: } else if (key.equalsIgnoreCase("max-age")) {
062: _expiredTime = System.currentTimeMillis()
063: + getAgeInMsec(attributeValue);
064: }
065: }
066: }
067:
068: private int getAgeInMsec(String maxAgeValue) {
069: try {
070: return 1000 * Integer.parseInt(maxAgeValue);
071: } catch (NumberFormatException e) {
072: return 0;
073: }
074: }
075:
076: /**
077: * Returns the name of this cookie.
078: */
079: public String getName() {
080: return _name;
081: }
082:
083: /**
084: * Returns the value associated with this cookie.
085: */
086: public String getValue() {
087: return _value;
088: }
089:
090: /**
091: * Returns the path to which this cookie is restricted.
092: */
093: public String getPath() {
094: return _path;
095: }
096:
097: /**
098: * Returns the domain to which this cookie may be sent.
099: */
100: public String getDomain() {
101: return _domain;
102: }
103:
104: void setPath(String path) {
105: _path = path;
106: }
107:
108: void setDomain(String domain) {
109: _domain = domain;
110: }
111:
112: public int hashCode() {
113: int hashCode = _name.hashCode();
114: if (_domain != null)
115: hashCode ^= _domain.hashCode();
116: if (_path != null)
117: hashCode ^= _path.hashCode();
118: return hashCode;
119: }
120:
121: public boolean equals(Object obj) {
122: return obj.getClass() == getClass() && equals((Cookie) obj);
123: }
124:
125: private boolean equals(Cookie other) {
126: return _name.equalsIgnoreCase(other._name)
127: && equalProperties(getDomain(), other.getDomain())
128: && equalProperties(getPath(), other.getPath());
129: }
130:
131: private boolean equalProperties(String first, String second) {
132: return first == second
133: || (first != null && first.equals(second));
134: }
135:
136: boolean mayBeSentTo(URL url) {
137: if (getDomain() == null)
138: return true;
139: if (_expiredTime != 0
140: && _expiredTime <= System.currentTimeMillis())
141: return false;
142:
143: return acceptHost(getDomain(), url.getHost())
144: && acceptPath(getPath(), url.getPath());
145: }
146:
147: private boolean acceptPath(String pathPattern, String hostPath) {
148: return !CookieProperties.isPathMatchingStrict()
149: || hostPath.startsWith(pathPattern);
150: }
151:
152: private static boolean acceptHost(String hostPattern,
153: String hostName) {
154: return hostPattern.equalsIgnoreCase(hostName)
155: || (hostPattern.startsWith(".") && hostName
156: .endsWith(hostPattern));
157: }
158: }
|