1 package de.juplo.httpresources;
2
3
4 import java.io.ByteArrayInputStream;
5 import java.io.ByteArrayOutputStream;
6 import java.io.IOException;
7 import java.net.URISyntaxException;
8 import java.net.URL;
9 import java.nio.charset.Charset;
10 import java.nio.file.Files;
11 import java.nio.file.Paths;
12 import java.util.Date;
13 import java.util.Scanner;
14 import java.util.stream.Collectors;
15 import java.util.zip.GZIPOutputStream;
16 import org.apache.http.Header;
17 import org.apache.http.HttpEntity;
18 import org.apache.http.HttpStatus;
19 import org.apache.http.ProtocolVersion;
20 import org.apache.http.StatusLine;
21 import org.apache.http.client.utils.DateUtils;
22 import org.apache.http.entity.ByteArrayEntity;
23 import org.apache.http.entity.StringEntity;
24 import org.apache.http.message.BasicHeader;
25 import org.apache.http.message.BasicStatusLine;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28 import org.springframework.core.io.Resource;
29 import org.springframework.http.HttpHeaders;
30 import org.springframework.http.MediaType;
31
32
33
34
35
36 public class TestUtil
37 {
38 private final static Logger LOG =
39 LoggerFactory.getLogger(TestUtil.class);
40
41 final static long MAX_AGE = 600l;
42 final static int MIN_TTL = 666000;
43
44 final static String STR_THEN = "Sat, 29 Oct 1994 19:43:31 GMT";
45 final static String STR_EXPIRED = "Mon, 14 Nov 1994 22:22:22 GMT";
46 final static String STR_SEND = "Tue, 15 Nov 1994 12:45:25 GMT";
47 final static String STR_NOW = "Tue, 15 Nov 1994 12:45:26 GMT";
48 final static String STR_INBETWEEN = "Thu, 17 Nov 1994 12:45:26 GMT";
49 final static String STR_FEATURE = "Thu, 01 Dec 1994 16:00:00 GMT";
50
51 final static Charset UTF8;
52
53 final static String STR_CONTENT = "hellö wörld!";
54 final static byte[] CONTENT;
55 final static byte[] CONTENT_GZIPPED;
56 final static String STR_CONTENT_MODIFIED = "Hellö again...";
57 final static byte[] CONTENT_MODIFIED;
58 final static String STR_CONTENT_TYPE_HTML = "text/html;charset=UTF-8";
59 final static String STR_CONTENT_TYPE_CSS = "text/css";
60 final static String STR_CONTENT_ENCODING = "gzip";
61 final static String STR_ETAG = "F345AB884";
62 final static String STR_ETAG_MODIFIED = "NewNewNew";
63 final static String STR_NO_CACHE = "no-cache";
64 final static String STR_NO_CACHE_QUALIFIED = "max-age=" + MAX_AGE + ", no-cache=\"Cookie\"";
65 final static String STR_MAX_AGE = "public, max-age=" + MAX_AGE;
66 final static String STR_MAX_AGE_0 = "public, max-age=0";
67 final static String STR_PRIVATE = "private, no-store";
68 final static String STR_REVALIDATE = STR_MAX_AGE + ", must-revalidate";
69
70 final static HttpEntity BODY;
71 final static HttpEntity BODY_GZIPPED;
72 final static HttpEntity BODY_MODIFIED;
73 final static ProtocolVersion PROTOCOL = new ProtocolVersion("HTTP", 1, 1);
74 final static StatusLine OK = new BasicStatusLine(PROTOCOL, HttpStatus.SC_OK, "OK");
75 final static StatusLine NOT_MODIFIED = new BasicStatusLine(PROTOCOL, HttpStatus.SC_NOT_MODIFIED, "NOT MODIFIED");
76 final static StatusLine NOT_FOUND = new BasicStatusLine(PROTOCOL, HttpStatus.SC_NOT_FOUND, "NOT FOUND");
77 final static StatusLine SERVER_ERROR = new BasicStatusLine(PROTOCOL, HttpStatus.SC_INTERNAL_SERVER_ERROR, "INTERNAL SERVER ERROR");
78 final static Date THEN, EXPIRED, SEND, NOW, INBETWEEN, FEATURE;
79 final static long LONG_THEN, LONG_EXPIRED, LONG_SEND, LONG_NOW, LONG_INBETWEEN, LONG_FEATURE;
80
81 final static MediaType MIME_TYPE_CONTENT_TYPE_HTML = MediaType.valueOf(STR_CONTENT_TYPE_HTML);
82
83 final static Header CONTENT_TYPE_HTML = new BasicHeader(HttpHeaders.CONTENT_TYPE, STR_CONTENT_TYPE_HTML);
84 final static Header CONTENT_TYPE_CSS = new BasicHeader(HttpHeaders.CONTENT_TYPE, STR_CONTENT_TYPE_CSS);
85 final static Header CONTENT_ENCODING = new BasicHeader(HttpHeaders.CONTENT_ENCODING, STR_CONTENT_ENCODING);
86 final static Header DATE = new BasicHeader(HttpHeaders.DATE, STR_SEND);
87 final static Header DATE_MODIFIED = new BasicHeader(HttpHeaders.DATE, STR_NOW);
88 final static Header LAST_MODIFIED = new BasicHeader(HttpHeaders.LAST_MODIFIED, STR_THEN);
89 final static Header LAST_MODIFIED_MODIFIED = new BasicHeader(HttpHeaders.LAST_MODIFIED, STR_INBETWEEN);
90 final static Header ETAG = new BasicHeader(HttpHeaders.ETAG, STR_ETAG);
91 final static Header ETAG_MODIFIED = new BasicHeader(HttpHeaders.ETAG, STR_ETAG_MODIFIED);
92 final static Header EXPIRES_VALID = new BasicHeader(HttpHeaders.EXPIRES, STR_FEATURE);
93 final static Header EXPIRES_INVALID = new BasicHeader(HttpHeaders.EXPIRES, "0");
94 final static Header CACHE_CONTROL_NO_CACHE = new BasicHeader(HttpHeaders.CACHE_CONTROL, STR_NO_CACHE);
95 final static Header CACHE_CONTROL_NO_CACHE_QUALIFIED = new BasicHeader(HttpHeaders.CACHE_CONTROL, STR_NO_CACHE_QUALIFIED);
96 final static Header CACHE_CONTROL_MAX_AGE = new BasicHeader(HttpHeaders.CACHE_CONTROL, STR_MAX_AGE);
97 final static Header CACHE_CONTROL_MAX_AGE_0 = new BasicHeader(HttpHeaders.CACHE_CONTROL, STR_MAX_AGE_0);
98 final static Header CACHE_CONTROL_PRIVATE = new BasicHeader(HttpHeaders.CACHE_CONTROL, STR_PRIVATE);
99 final static Header CACHE_CONTROL_REVALIDATE = new BasicHeader(HttpHeaders.CACHE_CONTROL, STR_REVALIDATE);
100
101 final static HttpHeaders HEADERS_CONTENT_TYPE_HTML;
102
103
104
105 final static HttpData DATA_NOT_EXPIRED;
106 final static HttpData DATA_NOT_EXPIRED_DUMMY;
107 final static HttpData DATA_NOT_EXPIRED_REVALIDATION_REQUIRED;
108 final static HttpData DATA_EXPIRED;
109 final static HttpData DATA_EXPIRED_DUMMY;
110 final static HttpData DATA_UPDATED;
111 final static HttpData DATA_NOT_FOUND;
112
113
114 static
115 {
116 try
117 {
118 UTF8 = Charset.forName("UTF-8");
119
120 BODY = new StringEntity(STR_CONTENT, UTF8);
121 BODY_MODIFIED = new StringEntity(STR_CONTENT_MODIFIED, UTF8);
122
123 CONTENT = STR_CONTENT.getBytes(UTF8);
124 CONTENT_GZIPPED = TestUtil.gzip(CONTENT);
125 BODY_GZIPPED = new ByteArrayEntity(CONTENT_GZIPPED);
126 CONTENT_MODIFIED = STR_CONTENT_MODIFIED.getBytes(UTF8);
127 }
128 catch (IOException e)
129 {
130 throw new RuntimeException(e);
131 }
132
133 THEN = DateUtils.parseDate(STR_THEN);
134 EXPIRED = DateUtils.parseDate(STR_EXPIRED);
135 SEND = DateUtils.parseDate(STR_SEND);
136 NOW = DateUtils.parseDate(STR_NOW);
137 INBETWEEN = DateUtils.parseDate(STR_INBETWEEN);
138 FEATURE = DateUtils.parseDate(STR_FEATURE);
139
140 LONG_THEN = THEN.getTime();
141 LONG_EXPIRED = EXPIRED.getTime();
142 LONG_SEND = SEND.getTime();
143 LONG_NOW = NOW.getTime();
144 LONG_INBETWEEN = INBETWEEN.getTime();
145 LONG_FEATURE = FEATURE.getTime();
146
147
148 HEADERS_CONTENT_TYPE_HTML = new HttpHeaders();
149 HEADERS_CONTENT_TYPE_HTML.setContentType(MIME_TYPE_CONTENT_TYPE_HTML);
150
151 DATA_NOT_EXPIRED_REVALIDATION_REQUIRED =
152 new HttpData(
153 STR_CONTENT.getBytes(),
154 HEADERS_CONTENT_TYPE_HTML,
155 true,
156 LONG_THEN,
157 LONG_NOW + MAX_AGE * 1000 - 2000,
158 STR_ETAG);
159
160 DATA_NOT_EXPIRED =
161 new HttpData(
162 STR_CONTENT.getBytes(),
163 HEADERS_CONTENT_TYPE_HTML,
164 false,
165 LONG_THEN,
166 LONG_NOW + MAX_AGE * 1000 - 2000,
167 STR_ETAG);
168
169 DATA_NOT_EXPIRED_DUMMY =
170 new HttpData(
171 STR_CONTENT.getBytes(),
172 HEADERS_CONTENT_TYPE_HTML,
173 false,
174 LONG_THEN,
175 LONG_NOW + MAX_AGE * 1000 - 2000,
176 STR_ETAG);
177
178 DATA_EXPIRED =
179 new HttpData(
180 STR_CONTENT.getBytes(),
181 HEADERS_CONTENT_TYPE_HTML,
182 false,
183 LONG_THEN,
184 LONG_EXPIRED,
185 STR_ETAG);
186
187 DATA_EXPIRED_DUMMY =
188 new HttpData(
189 STR_CONTENT.getBytes(),
190 HEADERS_CONTENT_TYPE_HTML,
191 false,
192 LONG_THEN,
193 LONG_EXPIRED,
194 STR_ETAG);
195
196 DATA_UPDATED =
197 new HttpData(
198 STR_CONTENT_MODIFIED.getBytes(),
199 HEADERS_CONTENT_TYPE_HTML,
200 false,
201 LONG_INBETWEEN,
202 LONG_NOW + MAX_AGE * 1000,
203 STR_ETAG_MODIFIED);
204
205 DATA_NOT_FOUND =
206 new HttpData(
207 null,
208 new HttpHeaders(),
209 false,
210 0,
211 LONG_NOW - 2000,
212 null);
213 }
214
215
216 static byte[] gzip(byte[] input) throws IOException
217 {
218 try (ByteArrayInputStream bais = new ByteArrayInputStream(input))
219 {
220 ByteArrayOutputStream baos = new ByteArrayOutputStream();
221 GZIPOutputStream gzos = new GZIPOutputStream(baos);
222 byte[] data = new byte[1024];
223 int read;
224 while ((read = bais.read(data)) > -1)
225 gzos.write(data, 0, read);
226 gzos.close();
227 baos.close();
228 return baos.toByteArray();
229 }
230 }
231
232
233 static StringEntity body(String resource) throws URISyntaxException, IOException
234 {
235 return new StringEntity(read(resource));
236 }
237
238 static String read(String resource) throws URISyntaxException, IOException
239 {
240 URL url = TestUtil.class.getResource(resource);
241 if (url == null)
242 throw new IllegalArgumentException("Cannot find " + resource);
243 return Files.readAllLines(Paths.get(url.toURI())).stream().collect(Collectors.joining("\n"));
244 }
245
246 static String read(Resource resource) throws URISyntaxException, IOException
247 {
248 Scanner s = new Scanner(resource.getInputStream()).useDelimiter("\\A");
249 return s.hasNext() ? s.next() : "";
250 }
251 }