Improve YAML-based configuration of Tomcat compression

Tomcat uses the strings “on” and “off” to enable and disable
compression. YAML interprets on as true and off as false, leaving
ServerProperties.Tomcat.compression configured with “true” and “false”
respectively. One solution is to use “on” rather than on and “off”
rather than off in the YAML file but users may not realise that they
need to do so.

This commit updates the connector customiser that configures compression
to map “true” to “on” and “false” to “off”.

Closes gh-2737
pull/2764/head
Andy Wilkinson 10 years ago
parent 527850ae55
commit c3571d416a

@ -483,10 +483,20 @@ public class ServerProperties implements EmbeddedServletContainerCustomizer, Ord
if (handler instanceof AbstractHttp11Protocol) { if (handler instanceof AbstractHttp11Protocol) {
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
AbstractHttp11Protocol protocol = (AbstractHttp11Protocol) handler; AbstractHttp11Protocol protocol = (AbstractHttp11Protocol) handler;
protocol.setCompression(Tomcat.this.compression); protocol.setCompression(coerceCompression(Tomcat.this.compression));
protocol.setCompressableMimeTypes(Tomcat.this.compressableMimeTypes); protocol.setCompressableMimeTypes(Tomcat.this.compressableMimeTypes);
} }
} }
private String coerceCompression(String compression) {
if (Boolean.toString(true).equals(compression)) {
return "on";
}
else if (Boolean.toString(false).equals(compression)) {
return "off";
}
return compression;
}
}); });
if (this.accessLogEnabled) { if (this.accessLogEnabled) {

@ -31,6 +31,8 @@ import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletCont
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer; import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.core.IsInstanceOf.instanceOf; import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
@ -197,9 +199,26 @@ public class ServerPropertiesTests {
@Test @Test
public void customTomcatCompression() throws Exception { public void customTomcatCompression() throws Exception {
assertThat("on", is(equalTo(configureCompression("on"))));
}
@Test
public void disableTomcatCompressionWithYaml() throws Exception {
// YAML interprets "off" as false, check that it's mapped back to off
assertThat("off", is(equalTo(configureCompression("false"))));
}
@Test
public void enableTomcatCompressionWithYaml() throws Exception {
// YAML interprets "on" as true, check that it's mapped back to on
assertThat("on", is(equalTo(configureCompression("true"))));
}
@Test
public void customTomcatCompressableMimeTypes() throws Exception {
Map<String, String> map = new HashMap<String, String>(); Map<String, String> map = new HashMap<String, String>();
map.put("server.port", "0"); map.put("server.port", "0");
map.put("server.tomcat.compression", "on"); map.put("server.tomcat.compressableMimeTypes", "application/foo");
bindProperties(map); bindProperties(map);
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
@ -211,18 +230,23 @@ public class ServerPropertiesTests {
try { try {
AbstractHttp11Protocol<?> protocol = (AbstractHttp11Protocol<?>) container AbstractHttp11Protocol<?> protocol = (AbstractHttp11Protocol<?>) container
.getTomcat().getConnector().getProtocolHandler(); .getTomcat().getConnector().getProtocolHandler();
assertEquals("on", protocol.getCompression()); assertEquals("application/foo", protocol.getCompressableMimeTypes());
} }
finally { finally {
container.stop(); container.stop();
} }
} }
@Test private void bindProperties(Map<String, String> map) {
public void customTomcatCompressableMimeTypes() throws Exception { new RelaxedDataBinder(this.properties, "server").bind(new MutablePropertyValues(
map));
}
private String configureCompression(String compression) {
Map<String, String> map = new HashMap<String, String>(); Map<String, String> map = new HashMap<String, String>();
map.put("server.port", "0"); map.put("server.port", "0");
map.put("server.tomcat.compressableMimeTypes", "application/foo"); // YAML interprets "on" as true
map.put("server.tomcat.compression", compression);
bindProperties(map); bindProperties(map);
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
@ -234,16 +258,11 @@ public class ServerPropertiesTests {
try { try {
AbstractHttp11Protocol<?> protocol = (AbstractHttp11Protocol<?>) container AbstractHttp11Protocol<?> protocol = (AbstractHttp11Protocol<?>) container
.getTomcat().getConnector().getProtocolHandler(); .getTomcat().getConnector().getProtocolHandler();
assertEquals("application/foo", protocol.getCompressableMimeTypes()); return protocol.getCompression();
} }
finally { finally {
container.stop(); container.stop();
} }
} }
private void bindProperties(Map<String, String> map) {
new RelaxedDataBinder(this.properties, "server").bind(new MutablePropertyValues(
map));
}
} }

Loading…
Cancel
Save