27 changed files with 413 additions and 770 deletions
@ -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 @@ |
|||||||
/* |
|
||||||
* 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 @@ |
|||||||
/* |
|
||||||
* 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 @@ |
|||||||
|
server.compression.enabled: true |
||||||
|
server.compression.min-response-size: 1 |
||||||
@ -0,0 +1,2 @@ |
|||||||
|
server.compression.enabled: true |
||||||
|
server.compression.min-response-size: 1 |
||||||
@ -0,0 +1,2 @@ |
|||||||
|
server.compression.enabled: true |
||||||
|
server.compression.min-response-size: 1 |
||||||
@ -1,3 +1,5 @@ |
|||||||
server.undertow.access-log-enabled=true |
server.undertow.access-log-enabled=true |
||||||
server.undertow.access-log-dir=target/logs |
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 @@ |
|||||||
|
/* |
||||||
|
* 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