• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/module-client/src/main/java/org/apache/http/impl/cookie/BasicClientCookie.java $
3  * $Revision: 659191 $
4  * $Date: 2008-05-22 11:26:53 -0700 (Thu, 22 May 2008) $
5  *
6  * ====================================================================
7  * Licensed to the Apache Software Foundation (ASF) under one
8  * or more contributor license agreements.  See the NOTICE file
9  * distributed with this work for additional information
10  * regarding copyright ownership.  The ASF licenses this file
11  * to you under the Apache License, Version 2.0 (the
12  * "License"); you may not use this file except in compliance
13  * with the License.  You may obtain a copy of the License at
14  *
15  *   http://www.apache.org/licenses/LICENSE-2.0
16  *
17  * Unless required by applicable law or agreed to in writing,
18  * software distributed under the License is distributed on an
19  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
20  * KIND, either express or implied.  See the License for the
21  * specific language governing permissions and limitations
22  * under the License.
23  * ====================================================================
24  *
25  * This software consists of voluntary contributions made by many
26  * individuals on behalf of the Apache Software Foundation.  For more
27  * information on the Apache Software Foundation, please see
28  * <http://www.apache.org/>.
29  *
30  */
31 
32 package org.apache.http.impl.cookie;
33 
34 import java.util.Date;
35 import java.util.HashMap;
36 import java.util.Locale;
37 import java.util.Map;
38 
39 import org.apache.http.cookie.ClientCookie;
40 import org.apache.http.cookie.SetCookie;
41 
42 /**
43  * HTTP "magic-cookie" represents a piece of state information
44  * that the HTTP agent and the target server can exchange to maintain
45  * a session.
46  *
47  * @author B.C. Holmes
48  * @author <a href="mailto:jericho@thinkfree.com">Park, Sung-Gu</a>
49  * @author <a href="mailto:dsale@us.britannica.com">Doug Sale</a>
50  * @author Rod Waldhoff
51  * @author dIon Gillard
52  * @author Sean C. Sullivan
53  * @author <a href="mailto:JEvans@Cyveillance.com">John Evans</a>
54  * @author Marc A. Saegesser
55  * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
56  * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
57  *
58  * @version $Revision: 659191 $
59  */
60 public class BasicClientCookie implements SetCookie, ClientCookie, Cloneable {
61 
62     /**
63      * Default Constructor taking a name and a value. The value may be null.
64      *
65      * @param name The name.
66      * @param value The value.
67      */
BasicClientCookie(final String name, final String value)68     public BasicClientCookie(final String name, final String value) {
69         super();
70         if (name == null) {
71             throw new IllegalArgumentException("Name may not be null");
72         }
73         this.name = name;
74         this.attribs = new HashMap<String, String>();
75         this.value = value;
76     }
77 
78     /**
79      * Returns the name.
80      *
81      * @return String name The name
82      */
getName()83     public String getName() {
84         return this.name;
85     }
86 
87     /**
88      * Returns the value.
89      *
90      * @return String value The current value.
91      */
getValue()92     public String getValue() {
93         return this.value;
94     }
95 
96     /**
97      * Sets the value
98      *
99      * @param value
100      */
setValue(final String value)101     public void setValue(final String value) {
102         this.value = value;
103     }
104 
105     /**
106      * Returns the comment describing the purpose of this cookie, or
107      * <tt>null</tt> if no such comment has been defined.
108      *
109      * @return comment
110      *
111      * @see #setComment(String)
112      */
getComment()113     public String getComment() {
114         return cookieComment;
115     }
116 
117     /**
118      * If a user agent (web browser) presents this cookie to a user, the
119      * cookie's purpose will be described using this comment.
120      *
121      * @param comment
122      *
123      * @see #getComment()
124      */
setComment(String comment)125     public void setComment(String comment) {
126         cookieComment = comment;
127     }
128 
129 
130     /**
131      * Returns null. Cookies prior to RFC2965 do not set this attribute
132      */
getCommentURL()133     public String getCommentURL() {
134         return null;
135     }
136 
137 
138     /**
139      * Returns the expiration {@link Date} of the cookie, or <tt>null</tt>
140      * if none exists.
141      * <p><strong>Note:</strong> the object returned by this method is
142      * considered immutable. Changing it (e.g. using setTime()) could result
143      * in undefined behaviour. Do so at your peril. </p>
144      * @return Expiration {@link Date}, or <tt>null</tt>.
145      *
146      * @see #setExpiryDate(java.util.Date)
147      *
148      */
getExpiryDate()149     public Date getExpiryDate() {
150         return cookieExpiryDate;
151     }
152 
153     /**
154      * Sets expiration date.
155      * <p><strong>Note:</strong> the object returned by this method is considered
156      * immutable. Changing it (e.g. using setTime()) could result in undefined
157      * behaviour. Do so at your peril.</p>
158      *
159      * @param expiryDate the {@link Date} after which this cookie is no longer valid.
160      *
161      * @see #getExpiryDate
162      *
163      */
setExpiryDate(Date expiryDate)164     public void setExpiryDate (Date expiryDate) {
165         cookieExpiryDate = expiryDate;
166     }
167 
168 
169     /**
170      * Returns <tt>false</tt> if the cookie should be discarded at the end
171      * of the "session"; <tt>true</tt> otherwise.
172      *
173      * @return <tt>false</tt> if the cookie should be discarded at the end
174      *         of the "session"; <tt>true</tt> otherwise
175      */
isPersistent()176     public boolean isPersistent() {
177         return (null != cookieExpiryDate);
178     }
179 
180 
181     /**
182      * Returns domain attribute of the cookie.
183      *
184      * @return the value of the domain attribute
185      *
186      * @see #setDomain(java.lang.String)
187      */
getDomain()188     public String getDomain() {
189         return cookieDomain;
190     }
191 
192     /**
193      * Sets the domain attribute.
194      *
195      * @param domain The value of the domain attribute
196      *
197      * @see #getDomain
198      */
setDomain(String domain)199     public void setDomain(String domain) {
200         if (domain != null) {
201             cookieDomain = domain.toLowerCase(Locale.ENGLISH);
202         } else {
203             cookieDomain = null;
204         }
205     }
206 
207 
208     /**
209      * Returns the path attribute of the cookie
210      *
211      * @return The value of the path attribute.
212      *
213      * @see #setPath(java.lang.String)
214      */
getPath()215     public String getPath() {
216         return cookiePath;
217     }
218 
219     /**
220      * Sets the path attribute.
221      *
222      * @param path The value of the path attribute
223      *
224      * @see #getPath
225      *
226      */
setPath(String path)227     public void setPath(String path) {
228         cookiePath = path;
229     }
230 
231     /**
232      * @return <code>true</code> if this cookie should only be sent over secure connections.
233      * @see #setSecure(boolean)
234      */
isSecure()235     public boolean isSecure() {
236         return isSecure;
237     }
238 
239     /**
240      * Sets the secure attribute of the cookie.
241      * <p>
242      * When <tt>true</tt> the cookie should only be sent
243      * using a secure protocol (https).  This should only be set when
244      * the cookie's originating server used a secure protocol to set the
245      * cookie's value.
246      *
247      * @param secure The value of the secure attribute
248      *
249      * @see #isSecure()
250      */
setSecure(boolean secure)251     public void setSecure (boolean secure) {
252         isSecure = secure;
253     }
254 
255 
256     /**
257      * Returns null. Cookies prior to RFC2965 do not set this attribute
258      */
getPorts()259     public int[] getPorts() {
260         return null;
261     }
262 
263 
264     /**
265      * Returns the version of the cookie specification to which this
266      * cookie conforms.
267      *
268      * @return the version of the cookie.
269      *
270      * @see #setVersion(int)
271      *
272      */
getVersion()273     public int getVersion() {
274         return cookieVersion;
275     }
276 
277     /**
278      * Sets the version of the cookie specification to which this
279      * cookie conforms.
280      *
281      * @param version the version of the cookie.
282      *
283      * @see #getVersion
284      */
setVersion(int version)285     public void setVersion(int version) {
286         cookieVersion = version;
287     }
288 
289     /**
290      * Returns true if this cookie has expired.
291      * @param date Current time
292      *
293      * @return <tt>true</tt> if the cookie has expired.
294      */
isExpired(final Date date)295     public boolean isExpired(final Date date) {
296         if (date == null) {
297             throw new IllegalArgumentException("Date may not be null");
298         }
299         return (cookieExpiryDate != null
300             && cookieExpiryDate.getTime() <= date.getTime());
301     }
302 
setAttribute(final String name, final String value)303     public void setAttribute(final String name, final String value) {
304         this.attribs.put(name, value);
305     }
306 
getAttribute(final String name)307     public String getAttribute(final String name) {
308         return this.attribs.get(name);
309     }
310 
containsAttribute(final String name)311     public boolean containsAttribute(final String name) {
312         return this.attribs.get(name) != null;
313     }
314 
315     @Override
clone()316     public Object clone() throws CloneNotSupportedException {
317         BasicClientCookie clone = (BasicClientCookie) super.clone();
318         clone.attribs = new HashMap<String, String>(this.attribs);
319         return clone;
320     }
321 
322     @Override
toString()323     public String toString() {
324         StringBuilder buffer = new StringBuilder();
325         buffer.append("[version: ");
326         buffer.append(Integer.toString(this.cookieVersion));
327         buffer.append("]");
328         buffer.append("[name: ");
329         buffer.append(this.name);
330         buffer.append("]");
331         buffer.append("[value: ");
332         buffer.append(this.value);
333         buffer.append("]");
334         buffer.append("[domain: ");
335         buffer.append(this.cookieDomain);
336         buffer.append("]");
337         buffer.append("[path: ");
338         buffer.append(this.cookiePath);
339         buffer.append("]");
340         buffer.append("[expiry: ");
341         buffer.append(this.cookieExpiryDate);
342         buffer.append("]");
343         return buffer.toString();
344     }
345 
346    // ----------------------------------------------------- Instance Variables
347 
348     /** Cookie name */
349     private final String name;
350 
351     /** Cookie attributes as specified by the origin server */
352     private Map<String, String> attribs;
353 
354     /** Cookie value */
355     private String value;
356 
357     /** Comment attribute. */
358     private String  cookieComment;
359 
360     /** Domain attribute. */
361     private String  cookieDomain;
362 
363     /** Expiration {@link Date}. */
364     private Date cookieExpiryDate;
365 
366     /** Path attribute. */
367     private String cookiePath;
368 
369     /** My secure flag. */
370     private boolean isSecure;
371 
372     /** The version of the cookie specification I was created from. */
373     private int cookieVersion;
374 
375 }
376 
377