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.client.protocol;
29
30 import java.io.IOException;
31 import java.util.List;
32
33 import org.apache.commons.logging.Log;
34 import org.apache.commons.logging.LogFactory;
35 import org.apache.http.Header;
36 import org.apache.http.HeaderIterator;
37 import org.apache.http.HttpException;
38 import org.apache.http.HttpResponse;
39 import org.apache.http.HttpResponseInterceptor;
40 import org.apache.http.annotation.Immutable;
41 import org.apache.http.client.CookieStore;
42 import org.apache.http.cookie.Cookie;
43 import org.apache.http.cookie.CookieOrigin;
44 import org.apache.http.cookie.CookieSpec;
45 import org.apache.http.cookie.MalformedCookieException;
46 import org.apache.http.cookie.SM;
47 import org.apache.http.protocol.HttpContext;
48 import org.apache.http.util.Args;
49
50
51
52
53
54
55
56 @Immutable
57 public class ResponseProcessCookies implements HttpResponseInterceptor {
58
59 private final Log log = LogFactory.getLog(getClass());
60
61 public ResponseProcessCookies() {
62 super();
63 }
64
65 public void process(final HttpResponse response, final HttpContext context)
66 throws HttpException, IOException {
67 Args.notNull(response, "HTTP request");
68 Args.notNull(context, "HTTP context");
69
70 final HttpClientContext clientContext = HttpClientContext.adapt(context);
71
72
73 final CookieSpec cookieSpec = clientContext.getCookieSpec();
74 if (cookieSpec == null) {
75 this.log.debug("Cookie spec not specified in HTTP context");
76 return;
77 }
78
79 final CookieStore cookieStore = clientContext.getCookieStore();
80 if (cookieStore == null) {
81 this.log.debug("Cookie store not specified in HTTP context");
82 return;
83 }
84
85 final CookieOrigin cookieOrigin = clientContext.getCookieOrigin();
86 if (cookieOrigin == null) {
87 this.log.debug("Cookie origin not specified in HTTP context");
88 return;
89 }
90 HeaderIterator it = response.headerIterator(SM.SET_COOKIE);
91 processCookies(it, cookieSpec, cookieOrigin, cookieStore);
92
93
94 if (cookieSpec.getVersion() > 0) {
95
96
97 it = response.headerIterator(SM.SET_COOKIE2);
98 processCookies(it, cookieSpec, cookieOrigin, cookieStore);
99 }
100 }
101
102 private void processCookies(
103 final HeaderIterator iterator,
104 final CookieSpec cookieSpec,
105 final CookieOrigin cookieOrigin,
106 final CookieStore cookieStore) {
107 while (iterator.hasNext()) {
108 final Header header = iterator.nextHeader();
109 try {
110 final List<Cookie> cookies = cookieSpec.parse(header, cookieOrigin);
111 for (final Cookie cookie : cookies) {
112 try {
113 cookieSpec.validate(cookie, cookieOrigin);
114 cookieStore.addCookie(cookie);
115
116 if (this.log.isDebugEnabled()) {
117 this.log.debug("Cookie accepted: \""
118 + cookie + "\". ");
119 }
120 } catch (final MalformedCookieException ex) {
121 if (this.log.isWarnEnabled()) {
122 this.log.warn("Cookie rejected: \""
123 + cookie + "\". " + ex.getMessage());
124 }
125 }
126 }
127 } catch (final MalformedCookieException ex) {
128 if (this.log.isWarnEnabled()) {
129 this.log.warn("Invalid cookie header: \""
130 + header + "\". " + ex.getMessage());
131 }
132 }
133 }
134 }
135
136 }