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.impl.cache;
28
29 import java.net.URI;
30
31 import org.apache.hc.client5.http.cache.HeaderConstants;
32 import org.apache.hc.client5.http.cache.HttpCacheEntry;
33 import org.apache.hc.client5.http.utils.DateUtils;
34 import org.apache.hc.client5.http.utils.URIUtils;
35 import org.apache.hc.core5.http.Header;
36 import org.apache.hc.core5.http.HttpHeaders;
37 import org.apache.hc.core5.http.HttpRequest;
38 import org.apache.hc.core5.http.HttpResponse;
39
40 class CacheInvalidatorBase {
41
42 static boolean shouldInvalidateHeadCacheEntry(final HttpRequest req, final HttpCacheEntry parentCacheEntry) {
43 return requestIsGet(req) && isAHeadCacheEntry(parentCacheEntry);
44 }
45
46 static boolean requestIsGet(final HttpRequest req) {
47 return req.getMethod().equals((HeaderConstants.GET_METHOD));
48 }
49
50 static boolean isAHeadCacheEntry(final HttpCacheEntry parentCacheEntry) {
51 return parentCacheEntry != null && parentCacheEntry.getRequestMethod().equals(HeaderConstants.HEAD_METHOD);
52 }
53
54 static boolean isSameHost(final URI requestURI, final URI targetURI) {
55 return targetURI.isAbsolute() && targetURI.getAuthority().equalsIgnoreCase(requestURI.getAuthority());
56 }
57
58 static boolean requestShouldNotBeCached(final HttpRequest req) {
59 final String method = req.getMethod();
60 return notGetOrHeadRequest(method);
61 }
62
63 static boolean notGetOrHeadRequest(final String method) {
64 return !(HeaderConstants.GET_METHOD.equals(method) || HeaderConstants.HEAD_METHOD.equals(method));
65 }
66
67 private static URI getLocationURI(final URI requestUri, final HttpResponse response, final String headerName) {
68 final Header h = response.getFirstHeader(headerName);
69 if (h == null) {
70 return null;
71 }
72 final URI locationUri = HttpCacheSupport.normalizeQuetly(h.getValue());
73 if (locationUri == null) {
74 return requestUri;
75 }
76 if (locationUri.isAbsolute()) {
77 return locationUri;
78 } else {
79 return URIUtils.resolve(requestUri, locationUri);
80 }
81 }
82
83 static URI getContentLocationURI(final URI requestUri, final HttpResponse response) {
84 return getLocationURI(requestUri, response, HttpHeaders.CONTENT_LOCATION);
85 }
86
87 static URI getLocationURI(final URI requestUri, final HttpResponse response) {
88 return getLocationURI(requestUri, response, HttpHeaders.LOCATION);
89 }
90
91 static boolean responseAndEntryEtagsDiffer(final HttpResponse response,
92 final HttpCacheEntry entry) {
93 final Header entryEtag = entry.getFirstHeader(HeaderConstants.ETAG);
94 final Header responseEtag = response.getFirstHeader(HeaderConstants.ETAG);
95 if (entryEtag == null || responseEtag == null) {
96 return false;
97 }
98 return (!entryEtag.getValue().equals(responseEtag.getValue()));
99 }
100
101 static boolean responseDateOlderThanEntryDate(final HttpResponse response, final HttpCacheEntry entry) {
102 return DateUtils.isBefore(response, entry, HttpHeaders.DATE);
103 }
104
105 }