View Javadoc
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   * @author Kai Moritz
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   // The dummy-variants are used to distinguish the result from the old state
104   // in cases, where nothing has changed...
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 }