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