1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit.util;
16
17 import java.util.regex.Matcher;
18 import java.util.regex.Pattern;
19
20 import org.apache.commons.lang3.StringUtils;
21 import org.htmlunit.HttpHeader;
22 import org.htmlunit.WebResponse;
23
24
25
26
27
28 public final class HeaderUtils {
29
30 private static final String CACHE_CONTROL_PRIVATE = "private";
31 private static final String CACHE_CONTROL_PUBLIC = "public";
32 private static final String CACHE_CONTROL_NO_STORE = "no-store";
33 private static final String CACHE_CONTROL_NO_CACHE = "no-cache";
34 private static final String CACHE_CONTROL_MAX_AGE = "max-age";
35 private static final String CACHE_CONTROL_S_MAXAGE = "s-maxage";
36 private static final Pattern MAX_AGE_HEADER_PATTERN = Pattern.compile("^.*max-age=(\\d+).*$");
37 private static final Pattern S_MAXAGE_HEADER_PATTERN = Pattern.compile("^.*s-maxage=(\\d+).*$");
38
39 private HeaderUtils() {
40
41 }
42
43
44
45
46
47 public static boolean containsPrivate(final WebResponse response) {
48 return containsCacheControlValue(response, CACHE_CONTROL_PRIVATE);
49 }
50
51
52
53
54
55 public static boolean containsPublic(final WebResponse response) {
56 return containsCacheControlValue(response, CACHE_CONTROL_PUBLIC);
57 }
58
59
60
61
62
63 public static boolean containsNoStore(final WebResponse response) {
64 return containsCacheControlValue(response, CACHE_CONTROL_NO_STORE);
65 }
66
67
68
69
70
71 public static boolean containsNoCache(final WebResponse response) {
72 return containsCacheControlValue(response, CACHE_CONTROL_NO_CACHE);
73 }
74
75
76
77
78
79 public static boolean containsETag(final WebResponse response) {
80 return response.getResponseHeaderValue(HttpHeader.ETAG) != null;
81 }
82
83
84
85
86
87 public static boolean containsLastModified(final WebResponse response) {
88 return response.getResponseHeaderValue(HttpHeader.LAST_MODIFIED) != null;
89 }
90
91
92
93
94
95 public static boolean containsSMaxage(final WebResponse response) {
96 return containsCacheControlValue(response, CACHE_CONTROL_S_MAXAGE);
97 }
98
99
100
101
102
103 public static boolean containsMaxAge(final WebResponse response) {
104 return containsCacheControlValue(response, CACHE_CONTROL_MAX_AGE);
105 }
106
107
108
109
110
111 public static boolean containsMaxAgeOrSMaxage(final WebResponse response) {
112 final String cacheControl = response.getResponseHeaderValue(HttpHeader.CACHE_CONTROL);
113 if (StringUtils.contains(cacheControl, CACHE_CONTROL_MAX_AGE)) {
114 return true;
115 }
116 return StringUtils.contains(cacheControl, CACHE_CONTROL_S_MAXAGE);
117 }
118
119
120
121
122
123 public static long sMaxage(final WebResponse response) {
124 if (containsCacheControlValue(response, CACHE_CONTROL_S_MAXAGE)) {
125 return directiveValue(response, S_MAXAGE_HEADER_PATTERN);
126 }
127 return 0;
128 }
129
130
131
132
133
134 public static long maxAge(final WebResponse response) {
135 if (containsCacheControlValue(response, CACHE_CONTROL_MAX_AGE)) {
136 return directiveValue(response, MAX_AGE_HEADER_PATTERN);
137 }
138
139 return 0;
140 }
141
142 private static long directiveValue(final WebResponse response, final Pattern pattern) {
143 final String value = response.getResponseHeaderValue(HttpHeader.CACHE_CONTROL);
144 if (value != null) {
145 final Matcher matcher = pattern.matcher(value);
146 if (matcher.matches()) {
147 return Long.parseLong(matcher.group(1));
148 }
149 }
150
151 return 0;
152 }
153
154 private static boolean containsCacheControlValue(final WebResponse response, final String value) {
155 final String cacheControl = response.getResponseHeaderValue(HttpHeader.CACHE_CONTROL);
156 return StringUtils.contains(cacheControl, value);
157 }
158 }