27 changed files with 413 additions and 770 deletions
@ -1,53 +0,0 @@
@@ -1,53 +0,0 @@
|
||||
/* |
||||
* Copyright 2012-2015 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.boot.autoconfigure.web; |
||||
|
||||
import org.eclipse.jetty.servlets.GzipFilter; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; |
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; |
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
||||
import org.springframework.boot.context.embedded.FilterRegistrationBean; |
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
|
||||
/** |
||||
* {@link EnableAutoConfiguration Auto-configuration} for {@link GzipFilter}. |
||||
* |
||||
* @author Andy Wilkinson |
||||
* @since 1.2.2 |
||||
*/ |
||||
@Configuration |
||||
@ConditionalOnClass(GzipFilter.class) |
||||
@EnableConfigurationProperties(GzipFilterProperties.class) |
||||
public class GzipFilterAutoConfiguration { |
||||
|
||||
@Autowired |
||||
private GzipFilterProperties properties; |
||||
|
||||
@Bean |
||||
@ConditionalOnProperty(prefix = "spring.http.gzip", name = "enabled", matchIfMissing = true) |
||||
public FilterRegistrationBean gzipFilter() { |
||||
FilterRegistrationBean registration = new FilterRegistrationBean(new GzipFilter()); |
||||
registration.addUrlPatterns("/*"); |
||||
registration.setInitParameters(this.properties.getAsInitParameters()); |
||||
|
||||
return registration; |
||||
} |
||||
|
||||
} |
||||
@ -1,242 +0,0 @@
@@ -1,242 +0,0 @@
|
||||
/* |
||||
* Copyright 2012-2015 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.boot.autoconfigure.web; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
import org.eclipse.jetty.servlets.GzipFilter; |
||||
import org.springframework.boot.context.properties.ConfigurationProperties; |
||||
import org.springframework.http.HttpMethod; |
||||
import org.springframework.util.MimeType; |
||||
import org.springframework.util.StringUtils; |
||||
|
||||
/** |
||||
* Properties for configuring {@link GzipFilter}. |
||||
* |
||||
* @author Andy Wilkinson |
||||
* @author Stephane Nicoll |
||||
* @since 1.2.2 |
||||
*/ |
||||
@ConfigurationProperties(prefix = "spring.http.gzip") |
||||
public class GzipFilterProperties { |
||||
|
||||
private final Map<String, String> initParameters = new HashMap<String, String>(); |
||||
|
||||
/** |
||||
* Size of the output buffer in bytes. |
||||
*/ |
||||
private Integer bufferSize; |
||||
|
||||
/** |
||||
* Minimum content length required for compression to occur. |
||||
*/ |
||||
private Integer minGzipSize; |
||||
|
||||
/** |
||||
* Level used for deflate compression (0-9). |
||||
*/ |
||||
private Integer deflateCompressionLevel; |
||||
|
||||
/** |
||||
* noWrap setting for deflate compression. |
||||
*/ |
||||
private Boolean deflateNoWrap; |
||||
|
||||
/** |
||||
* Comma-separated list of HTTP methods for which compression is enabled. |
||||
*/ |
||||
private List<HttpMethod> methods; |
||||
|
||||
/** |
||||
* Comma-separated list of MIME types which should be compressed. |
||||
*/ |
||||
private List<MimeType> mimeTypes; |
||||
|
||||
/** |
||||
* Comma-separated list of MIME types to exclude from compression. |
||||
*/ |
||||
private List<MimeType> excludedMimeTypes; |
||||
|
||||
/** |
||||
* Comma-separated list of user agents to exclude from compression. String.contains is |
||||
* used to determine a match against the request's User-Agent header. |
||||
*/ |
||||
private String excludedAgents; |
||||
|
||||
/** |
||||
* Comma-separated list of regular expression patterns to control user agents excluded |
||||
* from compression. |
||||
*/ |
||||
private String excludeAgentPatterns; |
||||
|
||||
/** |
||||
* Comma-separated list of paths to exclude from compression. Uses String.startsWith |
||||
* to determine a match against the request's path. |
||||
*/ |
||||
private String excludePaths; |
||||
|
||||
/** |
||||
* Comma-separated list of regular expression patterns to control the paths that are |
||||
* excluded from compression. |
||||
*/ |
||||
private String excludePathPatterns; |
||||
|
||||
/** |
||||
* Vary header sent on responses that may be compressed. |
||||
*/ |
||||
private String vary; |
||||
|
||||
public GzipFilterProperties() { |
||||
this.addInitParameter("checkGzExists", false); |
||||
} |
||||
|
||||
public Integer getBufferSize() { |
||||
return this.bufferSize; |
||||
} |
||||
|
||||
public void setBufferSize(Integer bufferSize) { |
||||
this.addInitParameter("bufferSize", bufferSize); |
||||
this.bufferSize = bufferSize; |
||||
} |
||||
|
||||
public Integer getMinGzipSize() { |
||||
return this.minGzipSize; |
||||
} |
||||
|
||||
public void setMinGzipSize(Integer minGzipSize) { |
||||
this.addInitParameter("minGzipSize", minGzipSize); |
||||
this.minGzipSize = minGzipSize; |
||||
} |
||||
|
||||
public Integer getDeflateCompressionLevel() { |
||||
return this.deflateCompressionLevel; |
||||
} |
||||
|
||||
public void setDeflateCompressionLevel(Integer deflateCompressionLevel) { |
||||
this.addInitParameter("deflateCompressionLevel", deflateCompressionLevel); |
||||
this.deflateCompressionLevel = deflateCompressionLevel; |
||||
} |
||||
|
||||
public Boolean getDeflateNoWrap() { |
||||
return this.deflateNoWrap; |
||||
} |
||||
|
||||
public void setDeflateNoWrap(Boolean deflateNoWrap) { |
||||
this.addInitParameter("deflateNoWrap", deflateNoWrap); |
||||
this.deflateNoWrap = deflateNoWrap; |
||||
} |
||||
|
||||
public List<HttpMethod> getMethods() { |
||||
return this.methods; |
||||
} |
||||
|
||||
public void setMethods(List<HttpMethod> methods) { |
||||
this.addInitParameter("methods", |
||||
StringUtils.collectionToCommaDelimitedString(methods)); |
||||
this.methods = methods; |
||||
} |
||||
|
||||
public List<MimeType> getMimeTypes() { |
||||
return this.mimeTypes; |
||||
} |
||||
|
||||
public void setMimeTypes(List<MimeType> mimeTypes) { |
||||
this.addInitParameter("mimeTypes", |
||||
StringUtils.collectionToCommaDelimitedString(mimeTypes)); |
||||
this.mimeTypes = mimeTypes; |
||||
} |
||||
|
||||
public List<MimeType> getExcludedMimeTypes() { |
||||
return this.excludedMimeTypes; |
||||
} |
||||
|
||||
public void setExcludedMimeTypes(List<MimeType> excludedMimeTypes) { |
||||
this.addInitParameter("excludedMimeTypes", |
||||
StringUtils.collectionToCommaDelimitedString(excludedMimeTypes)); |
||||
this.excludedMimeTypes = excludedMimeTypes; |
||||
} |
||||
|
||||
public String getExcludedAgents() { |
||||
return this.excludedAgents; |
||||
} |
||||
|
||||
public void setExcludedAgents(String excludedAgents) { |
||||
this.addInitParameter("excludedAgents", excludedAgents); |
||||
this.excludedAgents = excludedAgents; |
||||
} |
||||
|
||||
public String getExcludeAgentPatterns() { |
||||
return this.excludeAgentPatterns; |
||||
} |
||||
|
||||
public void setExcludeAgentPatterns(String excludeAgentPatterns) { |
||||
this.addInitParameter("excludeAgentPatterns", excludeAgentPatterns); |
||||
this.excludeAgentPatterns = excludeAgentPatterns; |
||||
} |
||||
|
||||
public String getExcludePaths() { |
||||
return this.excludePaths; |
||||
} |
||||
|
||||
public void setExcludePaths(String excludePaths) { |
||||
this.addInitParameter("excludePaths", excludePaths); |
||||
this.excludePaths = excludePaths; |
||||
} |
||||
|
||||
public String getExcludePathPatterns() { |
||||
return this.excludePathPatterns; |
||||
} |
||||
|
||||
public void setExcludePathPatterns(String excludePathPatterns) { |
||||
this.addInitParameter("excludePathPatterns", excludePathPatterns); |
||||
this.excludePathPatterns = excludePathPatterns; |
||||
} |
||||
|
||||
public String getVary() { |
||||
return this.vary; |
||||
} |
||||
|
||||
public void setVary(String vary) { |
||||
this.addInitParameter("vary", vary); |
||||
this.vary = vary; |
||||
} |
||||
|
||||
Map<String, String> getAsInitParameters() { |
||||
return this.initParameters; |
||||
} |
||||
|
||||
private void addInitParameter(String name, Integer value) { |
||||
if (value != null) { |
||||
this.initParameters.put(name, value.toString()); |
||||
} |
||||
} |
||||
|
||||
private void addInitParameter(String name, Boolean value) { |
||||
if (value != null) { |
||||
this.initParameters.put(name, value.toString()); |
||||
} |
||||
} |
||||
|
||||
private void addInitParameter(String name, String value) { |
||||
if (value != null) { |
||||
this.initParameters.put(name, value.toString()); |
||||
} |
||||
} |
||||
|
||||
} |
||||
@ -1,123 +0,0 @@
@@ -1,123 +0,0 @@
|
||||
/* |
||||
* Copyright 2012-2015 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.boot.autoconfigure.web; |
||||
|
||||
import org.junit.After; |
||||
import org.junit.Test; |
||||
import org.springframework.boot.context.embedded.FilterRegistrationBean; |
||||
import org.springframework.boot.test.EnvironmentTestUtils; |
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext; |
||||
|
||||
import static org.hamcrest.Matchers.contains; |
||||
import static org.hamcrest.Matchers.equalTo; |
||||
import static org.hamcrest.Matchers.is; |
||||
import static org.junit.Assert.assertThat; |
||||
|
||||
/** |
||||
* Tests for {@link GzipFilterAutoConfiguration} |
||||
* |
||||
* @author Andy Wilkinson |
||||
*/ |
||||
public class GzipFilterAutoConfigurationTests { |
||||
|
||||
private AnnotationConfigApplicationContext context; |
||||
|
||||
@After |
||||
public void close() { |
||||
if (this.context != null) { |
||||
this.context.close(); |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
public void filterIsMappedToSlashStar() { |
||||
createAndRefreshContext(); |
||||
FilterRegistrationBean registrationBean = this.context.getBean("gzipFilter", |
||||
FilterRegistrationBean.class); |
||||
assertThat(registrationBean.getUrlPatterns(), contains("/*")); |
||||
} |
||||
|
||||
@Test |
||||
public void byDefaultCheckGzExistsIsTheOnlyInitParameter() { |
||||
createAndRefreshContext(); |
||||
FilterRegistrationBean registrationBean = this.context.getBean("gzipFilter", |
||||
FilterRegistrationBean.class); |
||||
assertThat(registrationBean.getInitParameters().size(), equalTo(1)); |
||||
assertThat(registrationBean.getInitParameters().get("checkGzExists"), |
||||
equalTo("false")); |
||||
} |
||||
|
||||
@Test |
||||
public void customInitParameterConfiguration() { |
||||
createAndRefreshContext("spring.http.gzip.bufferSize:1234", |
||||
"spring.http.gzip.minGzipSize:2345", |
||||
"spring.http.gzip.deflateCompressionLevel:5", |
||||
"spring.http.gzip.deflateNoWrap:false", |
||||
"spring.http.gzip.methods:GET,POST", |
||||
"spring.http.gzip.mimeTypes:application/foo,application/bar", |
||||
"spring.http.gzip.excludedMimeTypes:application/biz", |
||||
"spring.http.gzip.excludedAgents:excluded-agent-1,excluded-agent-2", |
||||
"spring.http.gzip.excludeAgentPatterns:agent-pattern-1,agent-pattern-2", |
||||
"spring.http.gzip.excludePaths:/static/", |
||||
"spring.http.gzip.excludePathPatterns:path-pattern", |
||||
"spring.http.gzip.vary:vary-header-value"); |
||||
FilterRegistrationBean registrationBean = this.context.getBean("gzipFilter", |
||||
FilterRegistrationBean.class); |
||||
assertThat(registrationBean.getInitParameters().size(), equalTo(13)); |
||||
assertThat(registrationBean.getInitParameters().get("checkGzExists"), |
||||
equalTo("false")); |
||||
assertThat(registrationBean.getInitParameters().get("bufferSize"), |
||||
equalTo("1234")); |
||||
assertThat(registrationBean.getInitParameters().get("minGzipSize"), |
||||
equalTo("2345")); |
||||
assertThat(registrationBean.getInitParameters().get("deflateCompressionLevel"), |
||||
equalTo("5")); |
||||
assertThat(registrationBean.getInitParameters().get("deflateNoWrap"), |
||||
equalTo("false")); |
||||
assertThat(registrationBean.getInitParameters().get("methods"), |
||||
equalTo("GET,POST")); |
||||
assertThat(registrationBean.getInitParameters().get("mimeTypes"), |
||||
equalTo("application/foo,application/bar")); |
||||
assertThat(registrationBean.getInitParameters().get("excludedMimeTypes"), |
||||
equalTo("application/biz")); |
||||
assertThat(registrationBean.getInitParameters().get("excludedAgents"), |
||||
equalTo("excluded-agent-1,excluded-agent-2")); |
||||
assertThat(registrationBean.getInitParameters().get("excludeAgentPatterns"), |
||||
equalTo("agent-pattern-1,agent-pattern-2")); |
||||
assertThat(registrationBean.getInitParameters().get("excludePaths"), |
||||
equalTo("/static/")); |
||||
assertThat(registrationBean.getInitParameters().get("excludePathPatterns"), |
||||
equalTo("path-pattern")); |
||||
assertThat(registrationBean.getInitParameters().get("vary"), |
||||
equalTo("vary-header-value")); |
||||
} |
||||
|
||||
@Test |
||||
public void filterCanBeDisabled() { |
||||
createAndRefreshContext("spring.http.gzip.enabled:false"); |
||||
assertThat(this.context.getBeanNamesForType(FilterRegistrationBean.class).length, |
||||
is(equalTo(0))); |
||||
} |
||||
|
||||
private void createAndRefreshContext(String... pairs) { |
||||
this.context = new AnnotationConfigApplicationContext(); |
||||
EnvironmentTestUtils.addEnvironment(this.context, pairs); |
||||
this.context.register(GzipFilterAutoConfiguration.class); |
||||
this.context.refresh(); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,2 @@
@@ -0,0 +1,2 @@
|
||||
server.compression.enabled: true |
||||
server.compression.min-response-size: 1 |
||||
@ -0,0 +1,2 @@
@@ -0,0 +1,2 @@
|
||||
server.compression.enabled: true |
||||
server.compression.min-response-size: 1 |
||||
@ -0,0 +1,2 @@
@@ -0,0 +1,2 @@
|
||||
server.compression.enabled: true |
||||
server.compression.min-response-size: 1 |
||||
@ -1,3 +1,5 @@
@@ -1,3 +1,5 @@
|
||||
server.undertow.access-log-enabled=true |
||||
server.undertow.access-log-dir=target/logs |
||||
server.undertow.access-log-pattern=combined |
||||
server.undertow.access-log-pattern=combined |
||||
server.compression.enabled=true |
||||
server.compression.min-response-size=1 |
||||
@ -0,0 +1,68 @@
@@ -0,0 +1,68 @@
|
||||
/* |
||||
* Copyright 2012-2015 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.boot.context.embedded; |
||||
|
||||
/** |
||||
* Simple container-independent abstraction for compression configuration. |
||||
* |
||||
* @author Ivan Sopov |
||||
* @author Andy Wilkinson |
||||
* @since 1.3.0 |
||||
*/ |
||||
public class Compression { |
||||
|
||||
/** |
||||
* If response compression is enabled. |
||||
*/ |
||||
private boolean enabled = false; |
||||
|
||||
/** |
||||
* Comma-separated list of MIME types that should be compressed. |
||||
*/ |
||||
private String[] mimeTypes = new String[] { "text/html", "text/xml", "text/plain", |
||||
"text/css" }; |
||||
|
||||
/** |
||||
* Minimum response size that is required for compression to be performed |
||||
*/ |
||||
private int minResponseSize = 2048; |
||||
|
||||
public boolean getEnabled() { |
||||
return this.enabled; |
||||
} |
||||
|
||||
public void setEnabled(boolean enabled) { |
||||
this.enabled = enabled; |
||||
} |
||||
|
||||
public String[] getMimeTypes() { |
||||
return this.mimeTypes; |
||||
} |
||||
|
||||
public void setMimeTypes(String[] mimeTypes) { |
||||
this.mimeTypes = mimeTypes; |
||||
} |
||||
|
||||
public int getMinResponseSize() { |
||||
return this.minResponseSize; |
||||
} |
||||
|
||||
public void setMinResponseSize(int minSize) { |
||||
this.minResponseSize = minSize; |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue