diff --git a/api/src/org/mitre/dsmiley/httpproxy/LabKeyProxyServlet.java b/api/src/org/mitre/dsmiley/httpproxy/LabKeyProxyServlet.java index 9d41c8a5d91..334265e563e 100644 --- a/api/src/org/mitre/dsmiley/httpproxy/LabKeyProxyServlet.java +++ b/api/src/org/mitre/dsmiley/httpproxy/LabKeyProxyServlet.java @@ -1,6 +1,8 @@ package org.mitre.dsmiley.httpproxy; import org.apache.commons.lang3.StringUtils; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpHeaders; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.labkey.api.util.PageFlowUtil; @@ -8,6 +10,7 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.net.HttpCookie; import java.util.Objects; @@ -84,6 +87,23 @@ protected boolean skipXForwardedProto() return true; } + @Override + protected void copyResponseHeader(HttpServletRequest servletRequest, HttpServletResponse servletResponse, Header header) + { + // In Apache HttpClient <5.6.4, these headers were automatically removed after the client transparently + // decompressed the entity. Now we need to remove them manually, or the stale values reach the browser + // alongside the already-decompressed body. + if (doHandleCompression) + { + String headerName = header.getName(); + if (headerName.equalsIgnoreCase(HttpHeaders.CONTENT_ENCODING) || + headerName.equalsIgnoreCase(HttpHeaders.CONTENT_LENGTH) || + headerName.equalsIgnoreCase(HttpHeaders.CONTENT_MD5)) + return; + } + super.copyResponseHeader(servletRequest, servletResponse, header); + } + @Override protected String getCookieNamePrefix(String cName) { diff --git a/api/src/org/mitre/dsmiley/httpproxy/ProxyServlet.java b/api/src/org/mitre/dsmiley/httpproxy/ProxyServlet.java index 996586df030..bb07f96861b 100644 --- a/api/src/org/mitre/dsmiley/httpproxy/ProxyServlet.java +++ b/api/src/org/mitre/dsmiley/httpproxy/ProxyServlet.java @@ -296,10 +296,14 @@ protected CloseableHttpClient createHttpClient() { .setProtocolUpgradeEnabled(allowProtocolUpgrade()) // LKS override .build(); - return HttpClientBuilder.create() - .useSystemProperties() - .setDefaultRequestConfig(config) - .build(); + HttpClientBuilder httpClientBuilder = HttpClientBuilder.create() + .useSystemProperties() + .setDefaultRequestConfig(config); + + if (!doHandleCompression) + httpClientBuilder.disableContentCompression(); + + return httpClientBuilder.build(); } // LKS override