From 26c42b358263de2b36a22fa2aa330dd59bee86a0 Mon Sep 17 00:00:00 2001 From: Mark Fulton Date: Fri, 3 Apr 2015 13:34:19 -0600 Subject: [PATCH] GZIPContentEncodingFilter: Object header values Response.header(String, Object) supports non-String header values so GZIPContentEncodingFilter should too. Otherwise Response builders may get a ClassCastException when attempting to use non-String response header values. --- .../filter/GZIPContentEncodingFilter.java | 2 +- .../filter/GZIPContentEncodingFilterTest.java | 67 +++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 jersey-server/src/test/java/com/sun/jersey/server/api/container/filter/GZIPContentEncodingFilterTest.java diff --git a/jersey-server/src/main/java/com/sun/jersey/api/container/filter/GZIPContentEncodingFilter.java b/jersey-server/src/main/java/com/sun/jersey/api/container/filter/GZIPContentEncodingFilter.java index 7df871ae2..fef8ae37e 100644 --- a/jersey-server/src/main/java/com/sun/jersey/api/container/filter/GZIPContentEncodingFilter.java +++ b/jersey-server/src/main/java/com/sun/jersey/api/container/filter/GZIPContentEncodingFilter.java @@ -146,7 +146,7 @@ public ContainerResponse filter(ContainerRequest request, ContainerResponse resp response.getHttpHeaders().add(HttpHeaders.VARY, HttpHeaders.ACCEPT_ENCODING); // add vary header String acceptEncoding = request.getRequestHeaders().getFirst(HttpHeaders.ACCEPT_ENCODING); - String contentEncoding = (String) response.getHttpHeaders().getFirst(HttpHeaders.CONTENT_ENCODING); + Object contentEncoding = response.getHttpHeaders().getFirst(HttpHeaders.CONTENT_ENCODING); if (acceptEncoding != null && contentEncoding == null && acceptEncoding.contains("gzip")) { // Check EntityTag header diff --git a/jersey-server/src/test/java/com/sun/jersey/server/api/container/filter/GZIPContentEncodingFilterTest.java b/jersey-server/src/test/java/com/sun/jersey/server/api/container/filter/GZIPContentEncodingFilterTest.java new file mode 100644 index 000000000..bc797ad1d --- /dev/null +++ b/jersey-server/src/test/java/com/sun/jersey/server/api/container/filter/GZIPContentEncodingFilterTest.java @@ -0,0 +1,67 @@ +package com.sun.jersey.server.api.container.filter; + +import com.sun.jersey.api.container.filter.GZIPContentEncodingFilter; +import com.sun.jersey.core.header.InBoundHeaders; +import com.sun.jersey.server.impl.application.WebApplicationImpl; +import com.sun.jersey.spi.container.ContainerRequest; +import com.sun.jersey.spi.container.ContainerResponse; +import com.sun.jersey.spi.container.ContainerResponseWriter; +import org.junit.Test; + +import javax.ws.rs.core.HttpHeaders; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.util.Locale; + +/** + * @author Mark Fulton + */ +public class GZIPContentEncodingFilterTest { + @Test + public void containerResponseFilterSupportsObjectResponseHeaderValues() { + WebApplicationImpl webApplication = new WebApplicationImpl(); + String method = "PUT"; + URI baseUri = URI.create("base/uri"); + URI requestUri = URI.create("request/uri"); + InBoundHeaders headers = new InBoundHeaders(); + headers.add(HttpHeaders.ACCEPT_ENCODING, "gzip"); + ByteArrayInputStream entity = new ByteArrayInputStream("entity".getBytes(StandardCharsets.UTF_8)); + ContainerRequest request = new ContainerRequest(webApplication, method, baseUri, requestUri, headers, entity); + ContainerResponse response = new ContainerResponse(webApplication, request, createResponseWriter()); + response.getHttpHeaders().putSingle(HttpHeaders.CONTENT_ENCODING, ContentEncoding.GZIP); + new GZIPContentEncodingFilter().filter(request, response); + } + + private ContainerResponseWriter createResponseWriter() { + return new ContainerResponseWriter() { + @Override + public OutputStream writeStatusAndHeaders(long contentLength, ContainerResponse response) + throws IOException { + return new ByteArrayOutputStream(); + } + + @Override + public void finish() throws IOException { + } + }; + } + + /** + * @author Mark Fulton + */ + private enum ContentEncoding { + GZIP, + COMPRESS, + DEFLATE, + IDENTITY; + + @Override + public String toString() { + return super.toString().toLowerCase(Locale.ENGLISH); + } + } +}