From 75aea05a8a3d24beff1eb7fe1e243c8bc2e2eb96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Thu, 4 Oct 2018 09:30:51 +0200 Subject: [PATCH] Add jax rs response filter for gzip compression --- .../sonia/scm/filter/GZipResponseFilter.java | 23 +++++++++++++++++++ .../src/main/java/sonia/scm/util/WebUtil.java | 8 ++++++- 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 scm-core/src/main/java/sonia/scm/filter/GZipResponseFilter.java diff --git a/scm-core/src/main/java/sonia/scm/filter/GZipResponseFilter.java b/scm-core/src/main/java/sonia/scm/filter/GZipResponseFilter.java new file mode 100644 index 0000000000..8a84446151 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/filter/GZipResponseFilter.java @@ -0,0 +1,23 @@ +package sonia.scm.filter; + +import lombok.extern.slf4j.Slf4j; +import sonia.scm.util.WebUtil; + +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerResponseContext; +import javax.ws.rs.container.ContainerResponseFilter; +import javax.ws.rs.ext.Provider; +import java.io.IOException; +import java.util.zip.GZIPOutputStream; + +@Provider +@Slf4j +public class GZipResponseFilter implements ContainerResponseFilter { + public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { + if (WebUtil.isGzipSupported(requestContext::getHeaderString)) { + log.trace("compress output with gzip"); + GZIPOutputStream wrappedResponse = new GZIPOutputStream(responseContext.getEntityStream()); + responseContext.setEntityStream(wrappedResponse); + } + } +} diff --git a/scm-core/src/main/java/sonia/scm/util/WebUtil.java b/scm-core/src/main/java/sonia/scm/util/WebUtil.java index 2fc0876668..a9337b0598 100644 --- a/scm-core/src/main/java/sonia/scm/util/WebUtil.java +++ b/scm-core/src/main/java/sonia/scm/util/WebUtil.java @@ -49,6 +49,7 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.TimeZone; +import java.util.function.Function; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -266,7 +267,12 @@ public final class WebUtil */ public static boolean isGzipSupported(HttpServletRequest request) { - String enc = request.getHeader(HEADER_ACCEPTENCODING); + return isGzipSupported(request::getHeader); + } + + public static boolean isGzipSupported(Function headerResolver) + { + String enc = headerResolver.apply(HEADER_ACCEPTENCODING); return (enc != null) && enc.contains("gzip"); }