1 /*
2  * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/module-client/src/main/java/org/apache/http/impl/cookie/NetscapeDraftSpec.java $
3  * $Revision: 677240 $
4  * $Date: 2008-07-16 04:25:47 -0700 (Wed, 16 Jul 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.ArrayList;
35 import java.util.List;
36 
37 import org.apache.http.FormattedHeader;
38 import org.apache.http.Header;
39 import org.apache.http.HeaderElement;
40 import org.apache.http.cookie.ClientCookie;
41 import org.apache.http.cookie.Cookie;
42 import org.apache.http.cookie.CookieOrigin;
43 import org.apache.http.cookie.MalformedCookieException;
44 import org.apache.http.cookie.SM;
45 import org.apache.http.message.BufferedHeader;
46 import org.apache.http.message.ParserCursor;
47 import org.apache.http.util.CharArrayBuffer;
48 
49 /**
50  * Netscape cookie draft compliant cookie policy
51  *
52  * @author  B.C. Holmes
53  * @author <a href="mailto:jericho@thinkfree.com">Park, Sung-Gu</a>
54  * @author <a href="mailto:dsale@us.britannica.com">Doug Sale</a>
55  * @author Rod Waldhoff
56  * @author dIon Gillard
57  * @author Sean C. Sullivan
58  * @author <a href="mailto:JEvans@Cyveillance.com">John Evans</a>
59  * @author Marc A. Saegesser
60  * @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a>
61  * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
62  *
63  * @since 4.0
64  *
65  * @deprecated Please use {@link java.net.URL#openConnection} instead.
66  *     Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
67  *     for further details.
68  */
69 @Deprecated
70 public class NetscapeDraftSpec extends CookieSpecBase {
71 
72     protected static final String EXPIRES_PATTERN = "EEE, dd-MMM-yyyy HH:mm:ss z";
73 
74     private final String[] datepatterns;
75 
76     /** Default constructor */
NetscapeDraftSpec(final String[] datepatterns)77     public NetscapeDraftSpec(final String[] datepatterns) {
78         super();
79         if (datepatterns != null) {
80             this.datepatterns = datepatterns.clone();
81         } else {
82             this.datepatterns = new String[] { EXPIRES_PATTERN };
83         }
84         registerAttribHandler(ClientCookie.PATH_ATTR, new BasicPathHandler());
85         registerAttribHandler(ClientCookie.DOMAIN_ATTR, new NetscapeDomainHandler());
86         registerAttribHandler(ClientCookie.MAX_AGE_ATTR, new BasicMaxAgeHandler());
87         registerAttribHandler(ClientCookie.SECURE_ATTR, new BasicSecureHandler());
88         registerAttribHandler(ClientCookie.COMMENT_ATTR, new BasicCommentHandler());
89         registerAttribHandler(ClientCookie.EXPIRES_ATTR, new BasicExpiresHandler(
90                 this.datepatterns));
91     }
92 
93     /** Default constructor */
NetscapeDraftSpec()94     public NetscapeDraftSpec() {
95         this(null);
96     }
97 
98     /**
99       * Parses the Set-Cookie value into an array of <tt>Cookie</tt>s.
100       *
101       * <p>Syntax of the Set-Cookie HTTP Response Header:</p>
102       *
103       * <p>This is the format a CGI script would use to add to
104       * the HTTP headers a new piece of data which is to be stored by
105       * the client for later retrieval.</p>
106       *
107       * <PRE>
108       *  Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure
109       * </PRE>
110       *
111       * <p>Please note that Netscape draft specification does not fully
112       * conform to the HTTP header format. Netscape draft does not specify
113       * whether multiple cookies may be sent in one header. Hence, comma
114       * character may be present in unquoted cookie value or unquoted
115       * parameter value.</p>
116       *
117       * @see <a href="http://wp.netscape.com/newsref/std/cookie_spec.html">
118       *  The Cookie Spec.</a>
119       *
120       * @param header the <tt>Set-Cookie</tt> received from the server
121       * @return an array of <tt>Cookie</tt>s parsed from the Set-Cookie value
122       * @throws MalformedCookieException if an exception occurs during parsing
123       */
parse(final Header header, final CookieOrigin origin)124     public List<Cookie> parse(final Header header, final CookieOrigin origin)
125             throws MalformedCookieException {
126         if (header == null) {
127             throw new IllegalArgumentException("Header may not be null");
128         }
129         if (origin == null) {
130             throw new IllegalArgumentException("Cookie origin may not be null");
131         }
132         NetscapeDraftHeaderParser parser = NetscapeDraftHeaderParser.DEFAULT;
133         CharArrayBuffer buffer;
134         ParserCursor cursor;
135         if (header instanceof FormattedHeader) {
136             buffer = ((FormattedHeader) header).getBuffer();
137             cursor = new ParserCursor(
138                     ((FormattedHeader) header).getValuePos(),
139                     buffer.length());
140         } else {
141             String s = header.getValue();
142             if (s == null) {
143                 throw new MalformedCookieException("Header value is null");
144             }
145             buffer = new CharArrayBuffer(s.length());
146             buffer.append(s);
147             cursor = new ParserCursor(0, buffer.length());
148         }
149         return parse(new HeaderElement[] { parser.parseHeader(buffer, cursor) }, origin);
150     }
151 
formatCookies(final List<Cookie> cookies)152     public List<Header> formatCookies(final List<Cookie> cookies) {
153         if (cookies == null) {
154             throw new IllegalArgumentException("List of cookies may not be null");
155         }
156         if (cookies.isEmpty()) {
157             throw new IllegalArgumentException("List of cookies may not be empty");
158         }
159         CharArrayBuffer buffer = new CharArrayBuffer(20 * cookies.size());
160         buffer.append(SM.COOKIE);
161         buffer.append(": ");
162         for (int i = 0; i < cookies.size(); i++) {
163             Cookie cookie = cookies.get(i);
164             if (i > 0) {
165                 buffer.append("; ");
166             }
167             buffer.append(cookie.getName());
168             String s = cookie.getValue();
169             if (s != null) {
170                 buffer.append("=");
171                 buffer.append(s);
172             }
173         }
174         List<Header> headers = new ArrayList<Header>(1);
175         headers.add(new BufferedHeader(buffer));
176         return headers;
177     }
178 
getVersion()179     public int getVersion() {
180         return 0;
181     }
182 
getVersionHeader()183     public Header getVersionHeader() {
184         return null;
185     }
186 
187 }
188