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 package org.apache.hc.client5.http.cache;
28
29 import java.io.Serializable;
30 import java.util.Collections;
31 import java.util.Date;
32 import java.util.HashMap;
33 import java.util.Iterator;
34 import java.util.Map;
35
36 import org.apache.hc.client5.http.utils.DateUtils;
37 import org.apache.hc.core5.annotation.Contract;
38 import org.apache.hc.core5.annotation.ThreadingBehavior;
39 import org.apache.hc.core5.http.Header;
40 import org.apache.hc.core5.http.HttpHeaders;
41 import org.apache.hc.core5.http.HttpStatus;
42 import org.apache.hc.core5.http.MessageHeaders;
43 import org.apache.hc.core5.http.ProtocolException;
44 import org.apache.hc.core5.http.message.HeaderGroup;
45 import org.apache.hc.core5.util.Args;
46
47
48
49
50
51
52
53
54
55
56 @Contract(threading = ThreadingBehavior.IMMUTABLE)
57 public class HttpCacheEntry implements MessageHeaders, Serializable {
58
59 private static final long serialVersionUID = -6300496422359477413L;
60 private static final String REQUEST_METHOD_HEADER_NAME = "Hc-Request-Method";
61
62 private final Date requestDate;
63 private final Date responseDate;
64 private final int status;
65 private final HeaderGroup responseHeaders;
66 private final Resource resource;
67 private final Map<String, String> variantMap;
68 private final Date date;
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 public HttpCacheEntry(
89 final Date requestDate,
90 final Date responseDate,
91 final int status,
92 final Header[] responseHeaders,
93 final Resource resource,
94 final Map<String, String> variantMap) {
95 super();
96 Args.notNull(requestDate, "Request date");
97 Args.notNull(responseDate, "Response date");
98 Args.check(status >= HttpStatus.SC_SUCCESS, "Status code");
99 Args.notNull(responseHeaders, "Response headers");
100 this.requestDate = requestDate;
101 this.responseDate = responseDate;
102 this.status = status;
103 this.responseHeaders = new HeaderGroup();
104 this.responseHeaders.setHeaders(responseHeaders);
105 this.resource = resource;
106 this.variantMap = variantMap != null ? new HashMap<>(variantMap) : null;
107 this.date = parseDate();
108 }
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125 public HttpCacheEntry(final Date requestDate, final Date responseDate, final int status,
126 final Header[] responseHeaders, final Resource resource) {
127 this(requestDate, responseDate, status, responseHeaders, resource, new HashMap<String,String>());
128 }
129
130
131
132
133
134 private Date parseDate() {
135 return DateUtils.parseDate(this, HttpHeaders.DATE);
136 }
137
138
139
140
141 public int getStatus() {
142 return this.status;
143 }
144
145
146
147
148
149
150 public Date getRequestDate() {
151 return requestDate;
152 }
153
154
155
156
157
158 public Date getResponseDate() {
159 return responseDate;
160 }
161
162
163
164
165 @Override
166 public Header[] getHeaders() {
167 final HeaderGroup filteredHeaders = new HeaderGroup();
168 for (final Iterator<Header> iterator = responseHeaders.headerIterator(); iterator.hasNext();) {
169 final Header header = iterator.next();
170 if (!REQUEST_METHOD_HEADER_NAME.equals(header.getName())) {
171 filteredHeaders.addHeader(header);
172 }
173 }
174 return filteredHeaders.getHeaders();
175 }
176
177
178
179
180
181 @Override
182 public Header getFirstHeader(final String name) {
183 if (REQUEST_METHOD_HEADER_NAME.equalsIgnoreCase(name)) {
184 return null;
185 }
186 return responseHeaders.getFirstHeader(name);
187 }
188
189
190
191
192 @Override
193 public Header getLastHeader(final String name) {
194 return responseHeaders.getLastHeader(name);
195 }
196
197
198
199
200
201 @Override
202 public Header[] getHeaders(final String name) {
203 if (REQUEST_METHOD_HEADER_NAME.equalsIgnoreCase(name)) {
204 return new Header[0];
205 }
206 return responseHeaders.getHeaders(name);
207 }
208
209
210
211
212 @Override
213 public boolean containsHeader(final String name) {
214 return responseHeaders.containsHeader(name);
215 }
216
217
218
219
220 @Override
221 public int countHeaders(final String name) {
222 return responseHeaders.countHeaders(name);
223 }
224
225
226
227
228 @Override
229 public Header getHeader(final String name) throws ProtocolException {
230 return responseHeaders.getHeader(name);
231 }
232
233
234
235
236 @Override
237 public Iterator<Header> headerIterator() {
238 return responseHeaders.headerIterator();
239 }
240
241
242
243
244 @Override
245 public Iterator<Header> headerIterator(final String name) {
246 return responseHeaders.headerIterator(name);
247 }
248
249
250
251
252
253
254
255 public Date getDate() {
256 return date;
257 }
258
259
260
261
262 public Resource getResource() {
263 return this.resource;
264 }
265
266
267
268
269
270
271
272 public boolean hasVariants() {
273 return getFirstHeader(HeaderConstants.VARY) != null;
274 }
275
276
277
278
279
280
281
282
283
284
285 public Map<String, String> getVariantMap() {
286 return Collections.unmodifiableMap(variantMap);
287 }
288
289
290
291
292
293
294
295 public String getRequestMethod() {
296 final Header requestMethodHeader = responseHeaders.getFirstHeader(REQUEST_METHOD_HEADER_NAME);
297 if (requestMethodHeader != null) {
298 return requestMethodHeader.getValue();
299 }
300 return HeaderConstants.GET_METHOD;
301 }
302
303
304
305
306
307 @Override
308 public String toString() {
309 return "[request date=" + this.requestDate + "; response date=" + this.responseDate
310 + "; status=" + this.status + "]";
311 }
312
313 }