Configure Jetty to compress responses to requests other than GET
Closes gh-8184
This commit is contained in:
parent
6df1be3f1a
commit
bc4603925e
|
|
@ -32,6 +32,7 @@ import javax.servlet.ServletException;
|
|||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.eclipse.jetty.http.HttpMethod;
|
||||
import org.eclipse.jetty.http.HttpVersion;
|
||||
import org.eclipse.jetty.http.MimeTypes;
|
||||
import org.eclipse.jetty.server.AbstractConnector;
|
||||
|
|
@ -229,6 +230,9 @@ public class JettyServletWebServerFactory extends AbstractServletWebServerFactor
|
|||
Compression compression = getCompression();
|
||||
handler.setMinGzipSize(compression.getMinResponseSize());
|
||||
handler.setIncludedMimeTypes(compression.getMimeTypes());
|
||||
for (HttpMethod httpMethod : HttpMethod.values()) {
|
||||
handler.addIncludedMethods(httpMethod.name());
|
||||
}
|
||||
if (compression.getExcludedUserAgents() != null) {
|
||||
handler.setExcludedAgentPatterns(compression.getExcludedUserAgents());
|
||||
}
|
||||
|
|
@ -581,8 +585,8 @@ public class JettyServletWebServerFactory extends AbstractServletWebServerFactor
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns a mutable collection of Jetty {@link JettyServerCustomizer}s that will be applied
|
||||
* to the {@link Server} before the it is created.
|
||||
* Returns a mutable collection of Jetty {@link JettyServerCustomizer}s that will be
|
||||
* applied to the {@link Server} before the it is created.
|
||||
* @return the {@link JettyServerCustomizer}s
|
||||
*/
|
||||
public Collection<JettyServerCustomizer> getServerCustomizers() {
|
||||
|
|
|
|||
|
|
@ -16,18 +16,12 @@
|
|||
|
||||
package org.springframework.boot.web.embedded.jetty;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.Arrays;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServlet;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.apache.jasper.servlet.JspServlet;
|
||||
import org.eclipse.jetty.server.Handler;
|
||||
import org.eclipse.jetty.server.Server;
|
||||
|
|
@ -43,13 +37,10 @@ import org.eclipse.jetty.webapp.WebAppContext;
|
|||
import org.junit.Test;
|
||||
import org.mockito.InOrder;
|
||||
|
||||
import org.springframework.boot.web.server.Compression;
|
||||
import org.springframework.boot.web.server.PortInUseException;
|
||||
import org.springframework.boot.web.server.Ssl;
|
||||
import org.springframework.boot.web.servlet.ServletRegistrationBean;
|
||||
import org.springframework.boot.web.servlet.server.AbstractServletWebServerFactory;
|
||||
import org.springframework.boot.web.servlet.server.AbstractServletWebServerFactoryTests;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.hamcrest.CoreMatchers.isA;
|
||||
|
|
@ -296,38 +287,6 @@ public class JettyServletWebServerFactoryTests
|
|||
factory.getWebServer().start();
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("serial")
|
||||
// Workaround for Jetty issue - https://bugs.eclipse.org/bugs/show_bug.cgi?id=470646
|
||||
protected String setUpFactoryForCompression(final int contentSize, String[] mimeTypes,
|
||||
String[] excludedUserAgents) throws Exception {
|
||||
char[] chars = new char[contentSize];
|
||||
Arrays.fill(chars, 'F');
|
||||
final String testContent = new String(chars);
|
||||
AbstractServletWebServerFactory factory = getFactory();
|
||||
Compression compression = new Compression();
|
||||
compression.setEnabled(true);
|
||||
if (mimeTypes != null) {
|
||||
compression.setMimeTypes(mimeTypes);
|
||||
}
|
||||
if (excludedUserAgents != null) {
|
||||
compression.setExcludedUserAgents(excludedUserAgents);
|
||||
}
|
||||
factory.setCompression(compression);
|
||||
this.webServer = factory
|
||||
.getWebServer(new ServletRegistrationBean<HttpServlet>(new HttpServlet() {
|
||||
@Override
|
||||
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
|
||||
throws ServletException, IOException {
|
||||
resp.setContentLength(contentSize);
|
||||
resp.setHeader(HttpHeaders.CONTENT_TYPE, "text/plain");
|
||||
resp.getWriter().print(testContent);
|
||||
}
|
||||
}, "/test.txt"));
|
||||
this.webServer.start();
|
||||
return testContent;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected JspServlet getJspServlet() throws Exception {
|
||||
WebAppContext context = (WebAppContext) ((JettyWebServer) this.webServer)
|
||||
|
|
|
|||
|
|
@ -58,7 +58,9 @@ import javax.servlet.ServletContext;
|
|||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
import javax.servlet.http.HttpServlet;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.servlet.http.HttpSession;
|
||||
|
||||
import org.apache.http.client.HttpClient;
|
||||
|
|
@ -775,10 +777,15 @@ public abstract class AbstractServletWebServerFactoryTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void compression() throws Exception {
|
||||
public void compressionOfResposeToGetRequest() throws Exception {
|
||||
assertThat(doTestCompression(10000, null, null)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void compressionOfResposeToPostRequest() throws Exception {
|
||||
assertThat(doTestCompression(10000, null, null, HttpMethod.POST)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void noCompressionForSmallResponse() throws Exception {
|
||||
assertThat(doTestCompression(100, null, null)).isFalse();
|
||||
|
|
@ -991,12 +998,18 @@ public abstract class AbstractServletWebServerFactoryTests {
|
|||
|
||||
private boolean doTestCompression(int contentSize, String[] mimeTypes,
|
||||
String[] excludedUserAgents) throws Exception {
|
||||
return doTestCompression(contentSize, mimeTypes, excludedUserAgents,
|
||||
HttpMethod.GET);
|
||||
}
|
||||
|
||||
private boolean doTestCompression(int contentSize, String[] mimeTypes,
|
||||
String[] excludedUserAgents, HttpMethod method) throws Exception {
|
||||
String testContent = setUpFactoryForCompression(contentSize, mimeTypes,
|
||||
excludedUserAgents);
|
||||
TestGzipInputStreamFactory inputStreamFactory = new TestGzipInputStreamFactory();
|
||||
Map<String, InputStreamFactory> contentDecoderMap = Collections
|
||||
.singletonMap("gzip", (InputStreamFactory) inputStreamFactory);
|
||||
String response = getResponse(getLocalUrl("/test.txt"),
|
||||
String response = getResponse(getLocalUrl("/test.txt"), method,
|
||||
new HttpComponentsClientHttpRequestFactory(
|
||||
HttpClientBuilder.create().setUserAgent("testUserAgent")
|
||||
.setContentDecoderRegistry(contentDecoderMap).build()));
|
||||
|
|
@ -1004,15 +1017,12 @@ public abstract class AbstractServletWebServerFactoryTests {
|
|||
return inputStreamFactory.wasCompressionUsed();
|
||||
}
|
||||
|
||||
protected String setUpFactoryForCompression(int contentSize, String[] mimeTypes,
|
||||
private String setUpFactoryForCompression(int contentSize, String[] mimeTypes,
|
||||
String[] excludedUserAgents) throws Exception {
|
||||
char[] chars = new char[contentSize];
|
||||
Arrays.fill(chars, 'F');
|
||||
String testContent = new String(chars);
|
||||
AbstractServletWebServerFactory factory = getFactory();
|
||||
FileCopyUtils.copy(testContent,
|
||||
new FileWriter(this.temporaryFolder.newFile("test.txt")));
|
||||
factory.setDocumentRoot(this.temporaryFolder.getRoot());
|
||||
Compression compression = new Compression();
|
||||
compression.setEnabled(true);
|
||||
if (mimeTypes != null) {
|
||||
|
|
@ -1022,6 +1032,20 @@ public abstract class AbstractServletWebServerFactoryTests {
|
|||
compression.setExcludedUserAgents(excludedUserAgents);
|
||||
}
|
||||
factory.setCompression(compression);
|
||||
factory.addInitializers(
|
||||
new ServletRegistrationBean<HttpServlet>(new HttpServlet() {
|
||||
|
||||
@Override
|
||||
protected void service(HttpServletRequest req,
|
||||
HttpServletResponse resp)
|
||||
throws ServletException, IOException {
|
||||
resp.setContentType("text/plain");
|
||||
resp.setContentLength(testContent.length());
|
||||
resp.getWriter().write(testContent);
|
||||
resp.getWriter().flush();
|
||||
}
|
||||
|
||||
}, "/test.txt"));
|
||||
this.webServer = factory.getWebServer();
|
||||
this.webServer.start();
|
||||
return testContent;
|
||||
|
|
|
|||
Loading…
Reference in New Issue