1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.http.impl.cookie;
29
30 import java.util.ArrayList;
31 import java.util.List;
32
33 import org.apache.http.FormattedHeader;
34 import org.apache.http.Header;
35 import org.apache.http.HeaderElement;
36 import org.apache.http.annotation.NotThreadSafe;
37 import org.apache.http.cookie.ClientCookie;
38 import org.apache.http.cookie.Cookie;
39 import org.apache.http.cookie.CookieOrigin;
40 import org.apache.http.cookie.CookieSpec;
41 import org.apache.http.cookie.MalformedCookieException;
42 import org.apache.http.cookie.SM;
43 import org.apache.http.message.BufferedHeader;
44 import org.apache.http.message.ParserCursor;
45 import org.apache.http.util.Args;
46 import org.apache.http.util.CharArrayBuffer;
47
48
49
50
51
52
53
54
55 @NotThreadSafe
56 public class NetscapeDraftSpec extends CookieSpecBase {
57
58 protected static final String EXPIRES_PATTERN = "EEE, dd-MMM-yy HH:mm:ss z";
59
60 private final String[] datepatterns;
61
62
63 public NetscapeDraftSpec(final String[] datepatterns) {
64 super();
65 if (datepatterns != null) {
66 this.datepatterns = datepatterns.clone();
67 } else {
68 this.datepatterns = new String[] { EXPIRES_PATTERN };
69 }
70 registerAttribHandler(ClientCookie.PATH_ATTR, new BasicPathHandler());
71 registerAttribHandler(ClientCookie.DOMAIN_ATTR, new NetscapeDomainHandler());
72 registerAttribHandler(ClientCookie.MAX_AGE_ATTR, new BasicMaxAgeHandler());
73 registerAttribHandler(ClientCookie.SECURE_ATTR, new BasicSecureHandler());
74 registerAttribHandler(ClientCookie.COMMENT_ATTR, new BasicCommentHandler());
75 registerAttribHandler(ClientCookie.EXPIRES_ATTR, new BasicExpiresHandler(
76 this.datepatterns));
77 }
78
79
80 public NetscapeDraftSpec() {
81 this(null);
82 }
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108 public List<Cookie> parse(final Header header, final CookieOrigin origin)
109 throws MalformedCookieException {
110 Args.notNull(header, "Header");
111 Args.notNull(origin, "Cookie origin");
112 if (!header.getName().equalsIgnoreCase(SM.SET_COOKIE)) {
113 throw new MalformedCookieException("Unrecognized cookie header '"
114 + header.toString() + "'");
115 }
116 final NetscapeDraftHeaderParser parser = NetscapeDraftHeaderParser.DEFAULT;
117 CharArrayBuffer buffer;
118 ParserCursor cursor;
119 if (header instanceof FormattedHeader) {
120 buffer = ((FormattedHeader) header).getBuffer();
121 cursor = new ParserCursor(
122 ((FormattedHeader) header).getValuePos(),
123 buffer.length());
124 } else {
125 final String s = header.getValue();
126 if (s == null) {
127 throw new MalformedCookieException("Header value is null");
128 }
129 buffer = new CharArrayBuffer(s.length());
130 buffer.append(s);
131 cursor = new ParserCursor(0, buffer.length());
132 }
133 return parse(new HeaderElement[] { parser.parseHeader(buffer, cursor) }, origin);
134 }
135
136 public List<Header> formatCookies(final List<Cookie> cookies) {
137 Args.notEmpty(cookies, "List of cookies");
138 final CharArrayBuffer buffer = new CharArrayBuffer(20 * cookies.size());
139 buffer.append(SM.COOKIE);
140 buffer.append(": ");
141 for (int i = 0; i < cookies.size(); i++) {
142 final Cookie cookie = cookies.get(i);
143 if (i > 0) {
144 buffer.append("; ");
145 }
146 buffer.append(cookie.getName());
147 final String s = cookie.getValue();
148 if (s != null) {
149 buffer.append("=");
150 buffer.append(s);
151 }
152 }
153 final List<Header> headers = new ArrayList<Header>(1);
154 headers.add(new BufferedHeader(buffer));
155 return headers;
156 }
157
158 public int getVersion() {
159 return 0;
160 }
161
162 public Header getVersionHeader() {
163 return null;
164 }
165
166 @Override
167 public String toString() {
168 return "netscape";
169 }
170
171 }