Home | History | Annotate | Download | only in cookie
      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 (at) thinkfree.com">Park, Sung-Gu</a>
     54  * @author <a href="mailto:dsale (at) 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 (at) Cyveillance.com">John Evans</a>
     59  * @author Marc A. Saegesser
     60  * @author <a href="mailto:oleg (at) ural.ru">Oleg Kalnichevski</a>
     61  * @author <a href="mailto:mbowler (at) 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 */
     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 */
     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       */
    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 
    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 
    179     public int getVersion() {
    180         return 0;
    181     }
    182 
    183     public Header getVersionHeader() {
    184         return null;
    185     }
    186 
    187 }
    188