From 991fc51b946b8fc273b82c073c6da24f726e9fc0 Mon Sep 17 00:00:00 2001 From: Vladyslav Aleksakhin Date: Wed, 10 Jun 2015 16:28:17 +0200 Subject: [PATCH] Don't add "Vary: Accept-Encoding" header to the response if it's already exist --- .../filter/GZIPContentEncodingFilter.java | 5 +- .../filter/GZIPContentEncodingFilterTest.java | 70 +++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 jersey-server/src/test/java/com/sun/jersey/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..2c120397f 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 @@ -143,7 +143,10 @@ public void finish() throws IOException { } public ContainerResponse filter(ContainerRequest request, ContainerResponse response) { - response.getHttpHeaders().add(HttpHeaders.VARY, HttpHeaders.ACCEPT_ENCODING); // add vary header + + if (!response.getHttpHeaders().containsKey(HttpHeaders.VARY) || response.getHttpHeaders().containsKey(HttpHeaders.VARY) && !response.getHttpHeaders().get(HttpHeaders.VARY).contains(HttpHeaders.ACCEPT_ENCODING)) { + 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); diff --git a/jersey-server/src/test/java/com/sun/jersey/api/container/filter/GZIPContentEncodingFilterTest.java b/jersey-server/src/test/java/com/sun/jersey/api/container/filter/GZIPContentEncodingFilterTest.java new file mode 100644 index 000000000..6368f7c12 --- /dev/null +++ b/jersey-server/src/test/java/com/sun/jersey/api/container/filter/GZIPContentEncodingFilterTest.java @@ -0,0 +1,70 @@ +package com.sun.jersey.api.container.filter; + +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.Assert; +import org.junit.Test; + +import javax.ws.rs.core.HttpHeaders; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.net.URI; +import java.net.URISyntaxException; + +/** + * Created by vadyalex (at gmail). + */ +public class GZIPContentEncodingFilterTest { + + @Test + public void preventAddingMultipleVaryAcceptEncodingHeaders() throws URISyntaxException { + final WebApplicationImpl webApplication = new WebApplicationImpl(); + + final ContainerRequest request = new ContainerRequest( + new WebApplicationImpl(), + "GET", + new URI("base/uri"), + new URI("request/uri"), + new InBoundHeaders(), + null + ); + + final ContainerResponse response = new ContainerResponse( + webApplication, + request, + createContainerResponseWriter() + ); + + Assert.assertTrue(response.getHttpHeaders().isEmpty()); + + final GZIPContentEncodingFilter filter = new GZIPContentEncodingFilter(); + + filter.filter(request, response); + filter.filter(request, response); + filter.filter(request, response); + + Assert.assertNotNull(response.getHttpHeaders()); + Assert.assertTrue(response.getHttpHeaders().containsKey(HttpHeaders.VARY)); + Assert.assertEquals(1, response.getHttpHeaders().get(HttpHeaders.VARY).size()); + } + + private ContainerResponseWriter createContainerResponseWriter() { + return new ContainerResponseWriter() { + @Override + public OutputStream writeStatusAndHeaders(long contentLength, ContainerResponse response) throws IOException { + return new ByteArrayOutputStream(); + } + + @Override + public void finish() throws IOException { + + } + }; + } + + +}