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.annotation.NotThreadSafe;
34
35 import org.apache.http.FormattedHeader;
36 import org.apache.http.Header;
37 import org.apache.http.HeaderElement;
38 import org.apache.http.cookie.ClientCookie;
39 import org.apache.http.cookie.Cookie;
40 import org.apache.http.cookie.CookieOrigin;
41 import org.apache.http.cookie.CookieSpec;
42 import org.apache.http.cookie.MalformedCookieException;
43 import org.apache.http.cookie.SM;
44 import org.apache.http.message.BufferedHeader;
45 import org.apache.http.message.ParserCursor;
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 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 if (!header.getName().equalsIgnoreCase(SM.SET_COOKIE)) {
117 throw new MalformedCookieException("Unrecognized cookie header '"
118 + header.toString() + "'");
119 }
120 NetscapeDraftHeaderParser parser = NetscapeDraftHeaderParser.DEFAULT;
121 CharArrayBuffer buffer;
122 ParserCursor cursor;
123 if (header instanceof FormattedHeader) {
124 buffer = ((FormattedHeader) header).getBuffer();
125 cursor = new ParserCursor(
126 ((FormattedHeader) header).getValuePos(),
127 buffer.length());
128 } else {
129 String s = header.getValue();
130 if (s == null) {
131 throw new MalformedCookieException("Header value is null");
132 }
133 buffer = new CharArrayBuffer(s.length());
134 buffer.append(s);
135 cursor = new ParserCursor(0, buffer.length());
136 }
137 return parse(new HeaderElement[] { parser.parseHeader(buffer, cursor) }, origin);
138 }
139
140 public List<Header> formatCookies(final List<Cookie> cookies) {
141 if (cookies == null) {
142 throw new IllegalArgumentException("List of cookies may not be null");
143 }
144 if (cookies.isEmpty()) {
145 throw new IllegalArgumentException("List of cookies may not be empty");
146 }
147 CharArrayBuffer buffer = new CharArrayBuffer(20 * cookies.size());
148 buffer.append(SM.COOKIE);
149 buffer.append(": ");
150 for (int i = 0; i < cookies.size(); i++) {
151 Cookie cookie = cookies.get(i);
152 if (i > 0) {
153 buffer.append("; ");
154 }
155 buffer.append(cookie.getName());
156 String s = cookie.getValue();
157 if (s != null) {
158 buffer.append("=");
159 buffer.append(s);
160 }
161 }
162 List<Header> headers = new ArrayList<Header>(1);
163 headers.add(new BufferedHeader(buffer));
164 return headers;
165 }
166
167 public int getVersion() {
168 return 0;
169 }
170
171 public Header getVersionHeader() {
172 return null;
173 }
174
175 @Override
176 public String toString() {
177 return "netscape";
178 }
179
180 }