Merge pull request #542 from snicoll/gh-540

* gh-540:
  Support Tomcat uri encoding (with UTF-8 default)
pull/575/head
Phillip Webb 11 years ago
commit 489e97361c

@ -43,6 +43,7 @@ import org.springframework.util.StringUtils;
* {@link EmbeddedServletContainerCustomizerBeanPostProcessor} is active. * {@link EmbeddedServletContainerCustomizerBeanPostProcessor} is active.
* *
* @author Dave Syer * @author Dave Syer
* @author Stephane Nicoll
*/ */
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = false) @ConfigurationProperties(prefix = "server", ignoreUnknownFields = false)
public class ServerProperties implements EmbeddedServletContainerCustomizer { public class ServerProperties implements EmbeddedServletContainerCustomizer {
@ -144,6 +145,8 @@ public class ServerProperties implements EmbeddedServletContainerCustomizer {
private int maxThreads = 0; // Number of threads in protocol handler private int maxThreads = 0; // Number of threads in protocol handler
private String uriEncoding;
public int getMaxThreads() { public int getMaxThreads() {
return this.maxThreads; return this.maxThreads;
} }
@ -200,6 +203,14 @@ public class ServerProperties implements EmbeddedServletContainerCustomizer {
this.remoteIpHeader = remoteIpHeader; this.remoteIpHeader = remoteIpHeader;
} }
public String getUriEncoding() {
return this.uriEncoding;
}
public void setUriEncoding(String uriEncoding) {
this.uriEncoding = uriEncoding;
}
void customizeTomcat(TomcatEmbeddedServletContainerFactory factory) { void customizeTomcat(TomcatEmbeddedServletContainerFactory factory) {
if (getBasedir() != null) { if (getBasedir() != null) {
factory.setBaseDirectory(getBasedir()); factory.setBaseDirectory(getBasedir());
@ -247,6 +258,9 @@ public class ServerProperties implements EmbeddedServletContainerCustomizer {
valve.setSuffix(".log"); valve.setSuffix(".log");
factory.addContextValves(valve); factory.addContextValves(valve);
} }
if (getUriEncoding() != null) {
factory.setUriEncoding(getUriEncoding());
}
} }
} }

@ -36,6 +36,7 @@ import static org.mockito.Mockito.verify;
* Tests for {@link ServerProperties}. * Tests for {@link ServerProperties}.
* *
* @author Dave Syer * @author Dave Syer
* @author Stephane Nicoll
*/ */
public class ServerPropertiesTests { public class ServerPropertiesTests {
@ -87,4 +88,13 @@ public class ServerPropertiesTests {
verify(factory).setPort(8080); verify(factory).setPort(8080);
} }
@Test
public void testCustomizeUriEncoding() throws Exception {
Map<String, String> map = new HashMap<String, String>();
map.put("server.tomcat.uriEncoding", "US-ASCII");
new RelaxedDataBinder(this.properties, "server").bind(new MutablePropertyValues(
map));
assertEquals("US-ASCII", this.properties.getTomcat().getUriEncoding());
}
} }

@ -61,6 +61,7 @@ server.tomcat.remote-ip-header=x-forwarded-for
server.tomcat.basedir=/tmp # base dir (usually not needed, defaults to tmp) server.tomcat.basedir=/tmp # base dir (usually not needed, defaults to tmp)
server.tomcat.background-processor-delay=30; # in seconds server.tomcat.background-processor-delay=30; # in seconds
server.tomcat.max-threads = 0 # number of threads in protocol handler server.tomcat.max-threads = 0 # number of threads in protocol handler
server.tomcat.uri-encoding = UTF-8 # character encoding to use for URL decoding
# SPRING MVC ({sc-spring-boot-autoconfigure}/web/HttpMapperProperties.{sc-ext}[HttpMapperProperties]) # SPRING MVC ({sc-spring-boot-autoconfigure}/web/HttpMapperProperties.{sc-ext}[HttpMapperProperties])
http.mappers.json-pretty-print=false # pretty print JSON http.mappers.json-pretty-print=false # pretty print JSON

@ -66,6 +66,7 @@ import org.springframework.util.StreamUtils;
* @author Phillip Webb * @author Phillip Webb
* @author Dave Syer * @author Dave Syer
* @author Brock Mills * @author Brock Mills
* @author Stephane Nicoll
* @see #setPort(int) * @see #setPort(int)
* @see #setContextLifecycleListeners(Collection) * @see #setContextLifecycleListeners(Collection)
* @see TomcatEmbeddedServletContainer * @see TomcatEmbeddedServletContainer
@ -93,6 +94,8 @@ public class TomcatEmbeddedServletContainerFactory extends
private String tldSkip; private String tldSkip;
private String uriEncoding = "UTF-8";
/** /**
* Create a new {@link TomcatEmbeddedServletContainerFactory} instance. * Create a new {@link TomcatEmbeddedServletContainerFactory} instance.
*/ */
@ -206,6 +209,10 @@ public class TomcatEmbeddedServletContainerFactory extends
.setAddress(getAddress()); .setAddress(getAddress());
} }
} }
if (getUriEncoding() != null) {
connector.setURIEncoding(getUriEncoding());
}
// If ApplicationContext is slow to start we want Tomcat not to bind to the socket // If ApplicationContext is slow to start we want Tomcat not to bind to the socket
// prematurely... // prematurely...
connector.setProperty("bindOnInit", "false"); connector.setProperty("bindOnInit", "false");
@ -455,10 +462,28 @@ public class TomcatEmbeddedServletContainerFactory extends
return this.additionalTomcatConnectors; return this.additionalTomcatConnectors;
} }
/**
* Set the character encoding to use for URL decoding. If not specified 'UTF-8' will
* be used.
* @param uriEncoding the uri encoding to set
*/
public void setUriEncoding(String uriEncoding) {
this.uriEncoding = uriEncoding;
}
/**
* Returns the character encoding to use for URL decoding.
*/
public String getUriEncoding() {
return this.uriEncoding;
}
private static class TomcatErrorPage { private static class TomcatErrorPage {
private final String location; private final String location;
private final String exceptionType; private final String exceptionType;
private final int errorCode; private final int errorCode;
private final Object nativePage; private final Object nativePage;

@ -44,6 +44,7 @@ import static org.mockito.Mockito.verify;
* *
* @author Phillip Webb * @author Phillip Webb
* @author Dave Syer * @author Dave Syer
* @author Stephane Nicoll
*/ */
public class TomcatEmbeddedServletContainerFactoryTests extends public class TomcatEmbeddedServletContainerFactoryTests extends
AbstractEmbeddedServletContainerFactoryTests { AbstractEmbeddedServletContainerFactoryTests {
@ -190,11 +191,30 @@ public class TomcatEmbeddedServletContainerFactoryTests extends
factory.addConnectorCustomizers((TomcatConnectorCustomizer[]) null); factory.addConnectorCustomizers((TomcatConnectorCustomizer[]) null);
} }
@Test
public void uriEncoding() throws Exception {
TomcatEmbeddedServletContainerFactory factory = getFactory();
factory.setUriEncoding("US-ASCII");
Tomcat tomcat = getTomcat(factory);
assertEquals("US-ASCII", tomcat.getConnector().getURIEncoding());
}
@Test
public void defaultUriEncoding() throws Exception {
TomcatEmbeddedServletContainerFactory factory = getFactory();
Tomcat tomcat = getTomcat(factory);
assertEquals("UTF-8", tomcat.getConnector().getURIEncoding());
}
private void assertTimeout(TomcatEmbeddedServletContainerFactory factory, int expected) { private void assertTimeout(TomcatEmbeddedServletContainerFactory factory, int expected) {
this.container = factory.getEmbeddedServletContainer(); Tomcat tomcat = getTomcat(factory);
Tomcat tomcat = ((TomcatEmbeddedServletContainer) this.container).getTomcat();
Context context = (Context) tomcat.getHost().findChildren()[0]; Context context = (Context) tomcat.getHost().findChildren()[0];
assertThat(context.getSessionTimeout(), equalTo(expected)); assertThat(context.getSessionTimeout(), equalTo(expected));
} }
private Tomcat getTomcat(TomcatEmbeddedServletContainerFactory factory) {
this.container = factory.getEmbeddedServletContainer();
return ((TomcatEmbeddedServletContainer) this.container).getTomcat();
}
} }

Loading…
Cancel
Save