aboutsummaryrefslogtreecommitdiff
path: root/core/src/test/java/fi/iki/elonen/integration/GZipIntegrationTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/test/java/fi/iki/elonen/integration/GZipIntegrationTest.java')
-rw-r--r--core/src/test/java/fi/iki/elonen/integration/GZipIntegrationTest.java168
1 files changed, 168 insertions, 0 deletions
diff --git a/core/src/test/java/fi/iki/elonen/integration/GZipIntegrationTest.java b/core/src/test/java/fi/iki/elonen/integration/GZipIntegrationTest.java
new file mode 100644
index 0000000..a278406
--- /dev/null
+++ b/core/src/test/java/fi/iki/elonen/integration/GZipIntegrationTest.java
@@ -0,0 +1,168 @@
+package fi.iki.elonen.integration;
+
+/*
+ * #%L
+ * NanoHttpd-Core
+ * %%
+ * Copyright (C) 2012 - 2015 nanohttpd
+ * %%
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the nanohttpd nor the names of its contributors
+ * may be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * #L%
+ */
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.http.Header;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.DecompressingHttpClient;
+import org.apache.http.util.EntityUtils;
+import org.junit.Test;
+
+import fi.iki.elonen.NanoHTTPD;
+
+public class GZipIntegrationTest extends IntegrationTestBase<GZipIntegrationTest.TestServer> {
+
+ public static class TestServer extends NanoHTTPD {
+
+ public Response response;
+
+ public TestServer() {
+ super(8192);
+ }
+
+ @Override
+ public Response serve(IHTTPSession session) {
+ return response;
+ }
+
+ @Override
+ protected boolean useGzipWhenAccepted(Response r) {
+ return true;
+ }
+ }
+
+ @Override
+ public TestServer createTestServer() {
+ return new TestServer();
+ }
+
+ @Test
+ public void contentEncodingShouldBeAddedToFixedLengthResponses() throws IOException {
+ testServer.response = NanoHTTPD.newFixedLengthResponse("This is a test");
+ HttpGet request = new HttpGet("http://localhost:8192/");
+ request.addHeader("Accept-encoding", "gzip");
+ HttpResponse response = httpclient.execute(request);
+ Header contentEncoding = response.getFirstHeader("content-encoding");
+ assertNotNull("Content-Encoding should be set", contentEncoding);
+ assertEquals("gzip", contentEncoding.getValue());
+ }
+
+ @Test
+ public void contentEncodingShouldBeAddedToChunkedResponses() throws IOException {
+ InputStream data = new ByteArrayInputStream("This is a test".getBytes("UTF-8"));
+ testServer.response = NanoHTTPD.newChunkedResponse(NanoHTTPD.Response.Status.OK, "text/plain", data);
+ HttpGet request = new HttpGet("http://localhost:8192/");
+ request.addHeader("Accept-encoding", "gzip");
+ HttpResponse response = httpclient.execute(request);
+ Header contentEncoding = response.getFirstHeader("content-encoding");
+ assertNotNull("Content-Encoding should be set", contentEncoding);
+ assertEquals("gzip", contentEncoding.getValue());
+ }
+
+ @Test
+ public void shouldFindCorrectAcceptEncodingAmongMany() throws IOException {
+ testServer.response = NanoHTTPD.newFixedLengthResponse("This is a test");
+ HttpGet request = new HttpGet("http://localhost:8192/");
+ request.addHeader("Accept-encoding", "deflate,gzip");
+ HttpResponse response = httpclient.execute(request);
+ Header contentEncoding = response.getFirstHeader("content-encoding");
+ assertNotNull("Content-Encoding should be set", contentEncoding);
+ assertEquals("gzip", contentEncoding.getValue());
+ }
+
+ @Test
+ public void contentLengthShouldBeRemovedFromZippedResponses() throws IOException {
+ testServer.response = NanoHTTPD.newFixedLengthResponse("This is a test");
+ HttpGet request = new HttpGet("http://localhost:8192/");
+ request.addHeader("Accept-encoding", "gzip");
+ HttpResponse response = httpclient.execute(request);
+ Header contentLength = response.getFirstHeader("content-length");
+ assertNull("Content-Length should not be set when gzipping response", contentLength);
+ }
+
+ @Test
+ public void fixedLengthContentIsEncodedProperly() throws IOException {
+ testServer.response = NanoHTTPD.newFixedLengthResponse("This is a test");
+ HttpGet request = new HttpGet("http://localhost:8192/");
+ request.addHeader("Accept-encoding", "gzip");
+ HttpResponse response = new DecompressingHttpClient(httpclient).execute(request);
+ assertEquals("This is a test", EntityUtils.toString(response.getEntity()));
+ }
+
+ @Test
+ public void chunkedContentIsEncodedProperly() throws IOException {
+ InputStream data = new ByteArrayInputStream("This is a test".getBytes("UTF-8"));
+ testServer.response = NanoHTTPD.newChunkedResponse(NanoHTTPD.Response.Status.OK, "text/plain", data);
+ HttpGet request = new HttpGet("http://localhost:8192/");
+ request.addHeader("Accept-encoding", "gzip");
+ HttpResponse response = new DecompressingHttpClient(httpclient).execute(request);
+ assertEquals("This is a test", EntityUtils.toString(response.getEntity()));
+ }
+
+ @Test
+ public void noGzipWithoutAcceptEncoding() throws IOException {
+ testServer.response = NanoHTTPD.newFixedLengthResponse("This is a test");
+ HttpGet request = new HttpGet("http://localhost:8192/");
+ HttpResponse response = httpclient.execute(request);
+ Header contentEncoding = response.getFirstHeader("content-encoding");
+ assertThat(contentEncoding, is(nullValue()));
+ assertEquals("This is a test", EntityUtils.toString(response.getEntity()));
+ }
+
+ @Test
+ public void contentShouldNotBeGzippedIfContentLengthIsAddedManually() throws IOException {
+ testServer.response = NanoHTTPD.newFixedLengthResponse("This is a test");
+ testServer.response.addHeader("Content-Length", "" + ("This is a test".getBytes("UTF-8").length));
+ HttpGet request = new HttpGet("http://localhost:8192/");
+ request.addHeader("Accept-encoding", "gzip");
+ HttpResponse response = httpclient.execute(request);
+ Header contentEncoding = response.getFirstHeader("content-encoding");
+ assertNull("Content-Encoding should not be set when manually setting content-length", contentEncoding);
+ assertEquals("This is a test", EntityUtils.toString(response.getEntity()));
+
+ }
+
+}