diff --git a/scm-core/src/main/java/sonia/scm/filter/GZipResponseFilter.java b/scm-core/src/main/java/sonia/scm/filter/GZipResponseFilter.java index 92dd033af0..ef0ec8a5ef 100644 --- a/scm-core/src/main/java/sonia/scm/filter/GZipResponseFilter.java +++ b/scm-core/src/main/java/sonia/scm/filter/GZipResponseFilter.java @@ -3,9 +3,11 @@ package sonia.scm.filter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.inject.Inject; +import javax.inject.Provider; +import javax.servlet.http.HttpServletRequest; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.ext.Provider; import javax.ws.rs.ext.WriterInterceptor; import javax.ws.rs.ext.WriterInterceptorContext; import java.io.IOException; @@ -13,14 +15,21 @@ import java.io.OutputStream; import java.util.Locale; import java.util.zip.GZIPOutputStream; -@Provider +@javax.ws.rs.ext.Provider public class GZipResponseFilter implements WriterInterceptor { private static final Logger LOG = LoggerFactory.getLogger(GZipResponseFilter.class); + private final Provider requestProvider; + + @Inject + public GZipResponseFilter(Provider requestProvider) { + this.requestProvider = requestProvider; + } + @Override public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException { - if (isGZipSupported(context)) { + if (isGZipSupported()) { LOG.trace("compress output with gzip"); encodeWithGZip(context); } else { @@ -43,8 +52,8 @@ public class GZipResponseFilter implements WriterInterceptor { } } - private boolean isGZipSupported(WriterInterceptorContext context) { - Object encoding = context.getHeaders().getFirst(HttpHeaders.ACCEPT_ENCODING); + private boolean isGZipSupported() { + Object encoding = requestProvider.get().getHeader(HttpHeaders.ACCEPT_ENCODING); return encoding != null && encoding.toString().toLowerCase(Locale.ENGLISH).contains("gzip"); } } diff --git a/scm-core/src/test/java/sonia/scm/filter/GZipResponseFilterTest.java b/scm-core/src/test/java/sonia/scm/filter/GZipResponseFilterTest.java index b0a704c765..c3648fd4b8 100644 --- a/scm-core/src/test/java/sonia/scm/filter/GZipResponseFilterTest.java +++ b/scm-core/src/test/java/sonia/scm/filter/GZipResponseFilterTest.java @@ -1,5 +1,6 @@ package sonia.scm.filter; +import com.google.inject.util.Providers; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -7,6 +8,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.WriterInterceptorContext; @@ -20,22 +22,25 @@ import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) class GZipResponseFilterTest { + @Mock + private HttpServletRequest request; + @Mock private WriterInterceptorContext context; @Mock private MultivaluedMap headers; - private final GZipResponseFilter filter = new GZipResponseFilter(); + private GZipResponseFilter filter; @BeforeEach - void setUpContext() { - when(context.getHeaders()).thenReturn(headers); + void setupObjectUnderTest() { + filter = new GZipResponseFilter(Providers.of(request)); } @Test void shouldSkipGZipCompression() throws IOException { - when(headers.getFirst(HttpHeaders.ACCEPT_ENCODING)).thenReturn("deflate, br"); + when(request.getHeader(HttpHeaders.ACCEPT_ENCODING)).thenReturn("deflate, br"); filter.aroundWriteTo(context); @@ -60,7 +65,8 @@ class GZipResponseFilterTest { @BeforeEach void setUpContext() { - when(headers.getFirst(HttpHeaders.ACCEPT_ENCODING)).thenReturn("gzip, deflate, br"); + when(request.getHeader(HttpHeaders.ACCEPT_ENCODING)).thenReturn("gzip, deflate, br"); + when(context.getHeaders()).thenReturn(headers); when(context.getOutputStream()).thenReturn(new ByteArrayOutputStream()); }