• 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/BrowserCompatSpec.java $
3  * $Revision: 657334 $
4  * $Date: 2008-05-17 04:44:16 -0700 (Sat, 17 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.ArrayList;
35 import java.util.List;
36 import java.util.Locale;
37 
38 import org.apache.http.FormattedHeader;
39 import org.apache.http.Header;
40 import org.apache.http.HeaderElement;
41 import org.apache.http.cookie.ClientCookie;
42 import org.apache.http.cookie.Cookie;
43 import org.apache.http.cookie.CookieOrigin;
44 import org.apache.http.cookie.MalformedCookieException;
45 import org.apache.http.cookie.SM;
46 import org.apache.http.message.BufferedHeader;
47 import org.apache.http.message.ParserCursor;
48 import org.apache.http.util.CharArrayBuffer;
49 
50 /**
51  * Cookie specification that strives to closely mimic (mis)behavior of
52  * common web browser applications such as Microsoft Internet Explorer
53  * and Mozilla FireFox.
54  *
55  * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
56  *
57  * @since 4.0
58  *
59  * @deprecated Please use {@link java.net.URL#openConnection} instead.
60  *     Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
61  *     for further details.
62  */
63 @Deprecated
64 public class BrowserCompatSpec extends CookieSpecBase {
65 
66     /** Valid date patterns used per default */
67     protected static final String[] DATE_PATTERNS = new String[] {
68             DateUtils.PATTERN_RFC1123,
69             DateUtils.PATTERN_RFC1036,
70             DateUtils.PATTERN_ASCTIME,
71             "EEE, dd-MMM-yyyy HH:mm:ss z",
72             "EEE, dd-MMM-yyyy HH-mm-ss z",
73             "EEE, dd MMM yy HH:mm:ss z",
74             "EEE dd-MMM-yyyy HH:mm:ss z",
75             "EEE dd MMM yyyy HH:mm:ss z",
76             "EEE dd-MMM-yyyy HH-mm-ss z",
77             "EEE dd-MMM-yy HH:mm:ss z",
78             "EEE dd MMM yy HH:mm:ss z",
79             "EEE,dd-MMM-yy HH:mm:ss z",
80             "EEE,dd-MMM-yyyy HH:mm:ss z",
81             "EEE, dd-MM-yyyy HH:mm:ss z",
82         };
83 
84     private final String[] datepatterns;
85 
86     /** Default constructor */
BrowserCompatSpec(final String[] datepatterns)87     public BrowserCompatSpec(final String[] datepatterns) {
88         super();
89         if (datepatterns != null) {
90             this.datepatterns = datepatterns.clone();
91         } else {
92             this.datepatterns = DATE_PATTERNS;
93         }
94         registerAttribHandler(ClientCookie.PATH_ATTR, new BasicPathHandler());
95         registerAttribHandler(ClientCookie.DOMAIN_ATTR, new BasicDomainHandler());
96         registerAttribHandler(ClientCookie.MAX_AGE_ATTR, new BasicMaxAgeHandler());
97         registerAttribHandler(ClientCookie.SECURE_ATTR, new BasicSecureHandler());
98         registerAttribHandler(ClientCookie.COMMENT_ATTR, new BasicCommentHandler());
99         registerAttribHandler(ClientCookie.EXPIRES_ATTR, new BasicExpiresHandler(
100                 this.datepatterns));
101     }
102 
103     /** Default constructor */
BrowserCompatSpec()104     public BrowserCompatSpec() {
105         this(null);
106     }
107 
parse(final Header header, final CookieOrigin origin)108     public List<Cookie> parse(final Header header, final CookieOrigin origin)
109             throws MalformedCookieException {
110         if (header == null) {
111             throw new IllegalArgumentException("Header may not be null");
112         }
113         if (origin == null) {
114             throw new IllegalArgumentException("Cookie origin may not be null");
115         }
116         String headervalue = header.getValue();
117         boolean isNetscapeCookie = false;
118         int i1 = headervalue.toLowerCase(Locale.ENGLISH).indexOf("expires=");
119         if (i1 != -1) {
120             i1 += "expires=".length();
121             int i2 = headervalue.indexOf(';', i1);
122             if (i2 == -1) {
123                 i2 = headervalue.length();
124             }
125             try {
126                 DateUtils.parseDate(headervalue.substring(i1, i2), this.datepatterns);
127                 isNetscapeCookie = true;
128             } catch (DateParseException e) {
129                 // Does not look like a valid expiry date
130             }
131         }
132         HeaderElement[] elems = null;
133         if (isNetscapeCookie) {
134             NetscapeDraftHeaderParser parser = NetscapeDraftHeaderParser.DEFAULT;
135             CharArrayBuffer buffer;
136             ParserCursor cursor;
137             if (header instanceof FormattedHeader) {
138                 buffer = ((FormattedHeader) header).getBuffer();
139                 cursor = new ParserCursor(
140                         ((FormattedHeader) header).getValuePos(),
141                         buffer.length());
142             } else {
143                 String s = header.getValue();
144                 if (s == null) {
145                     throw new MalformedCookieException("Header value is null");
146                 }
147                 buffer = new CharArrayBuffer(s.length());
148                 buffer.append(s);
149                 cursor = new ParserCursor(0, buffer.length());
150             }
151             elems = new HeaderElement[] { parser.parseHeader(buffer, cursor) };
152         } else {
153             elems = header.getElements();
154         }
155         return parse(elems, origin);
156     }
157 
formatCookies(final List<Cookie> cookies)158     public List<Header> formatCookies(final List<Cookie> cookies) {
159         if (cookies == null) {
160             throw new IllegalArgumentException("List of cookies may not be null");
161         }
162         if (cookies.isEmpty()) {
163             throw new IllegalArgumentException("List of cookies may not be empty");
164         }
165         CharArrayBuffer buffer = new CharArrayBuffer(20 * cookies.size());
166         buffer.append(SM.COOKIE);
167         buffer.append(": ");
168         for (int i = 0; i < cookies.size(); i++) {
169             Cookie cookie = cookies.get(i);
170             if (i > 0) {
171                 buffer.append("; ");
172             }
173             buffer.append(cookie.getName());
174             buffer.append("=");
175             String s = cookie.getValue();
176             if (s != null) {
177                 buffer.append(s);
178             }
179         }
180         List<Header> headers = new ArrayList<Header>(1);
181         headers.add(new BufferedHeader(buffer));
182         return headers;
183     }
184 
getVersion()185     public int getVersion() {
186         return 0;
187     }
188 
getVersionHeader()189     public Header getVersionHeader() {
190         return null;
191     }
192 
193 }
194