diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java index 4b9a98f598b..20eea271ccb 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java @@ -362,12 +362,18 @@ public class ServerProperties this.maxHttpHeaderSize = maxHttpHeaderSize; } + @Deprecated + @DeprecatedConfigurationProperty(reason = "Use dedicated property for each container.") public int getMaxHttpPostSize() { return this.maxHttpPostSize; } + @Deprecated public void setMaxHttpPostSize(int maxHttpPostSize) { this.maxHttpPostSize = maxHttpPostSize; + this.jetty.setMaxHttpPostSize(maxHttpPostSize); + this.tomcat.setMaxHttpPostSize(maxHttpPostSize); + this.undertow.setMaxHttpPostSize(maxHttpPostSize); } protected final boolean getOrDeduceUseForwardHeaders() { @@ -645,6 +651,11 @@ public class ServerProperties */ private int minSpareThreads = 0; // Minimum spare threads in protocol handler + /** + * Maximum size in bytes of the HTTP post content. + */ + private int maxHttpPostSize = 0; // bytes + /** * Maximum size in bytes of the HTTP message header. */ @@ -697,6 +708,14 @@ public class ServerProperties this.minSpareThreads = minSpareThreads; } + public int getMaxHttpPostSize() { + return this.maxHttpPostSize; + } + + public void setMaxHttpPostSize(int maxHttpPostSize) { + this.maxHttpPostSize = maxHttpPostSize; + } + public Accesslog getAccesslog() { return this.accesslog; } @@ -815,8 +834,8 @@ public class ServerProperties if (maxHttpHeaderSize > 0) { customizeMaxHttpHeaderSize(factory, maxHttpHeaderSize); } - if (serverProperties.getMaxHttpPostSize() > 0) { - customizeMaxHttpPostSize(factory, serverProperties.getMaxHttpPostSize()); + if (this.maxHttpPostSize > 0) { + customizeMaxHttpPostSize(factory, this.maxHttpPostSize); } if (this.accesslog.enabled) { customizeAccessLog(factory); @@ -1116,6 +1135,11 @@ public class ServerProperties public static class Jetty { + /** + * Maximum size in bytes of the HTTP post or put content. + */ + private int maxHttpPostSize = 0; // bytes + /** * Number of acceptor threads to use. */ @@ -1126,6 +1150,14 @@ public class ServerProperties */ private Integer selectors; + public int getMaxHttpPostSize() { + return this.maxHttpPostSize; + } + + public void setMaxHttpPostSize(int maxHttpPostSize) { + this.maxHttpPostSize = maxHttpPostSize; + } + public Integer getAcceptors() { return this.acceptors; } @@ -1155,8 +1187,8 @@ public class ServerProperties customizeMaxHttpHeaderSize(factory, serverProperties.getMaxHttpHeaderSize()); } - if (serverProperties.getMaxHttpPostSize() > 0) { - customizeMaxHttpPostSize(factory, serverProperties.getMaxHttpPostSize()); + if (this.maxHttpPostSize > 0) { + customizeMaxHttpPostSize(factory, this.maxHttpPostSize); } if (serverProperties.getConnectionTimeout() != null) { @@ -1266,6 +1298,11 @@ public class ServerProperties public static class Undertow { + /** + * Maximum size in bytes of the HTTP post content. + */ + private long maxHttpPostSize = 0; // bytes + /** * Size of each buffer in bytes. */ @@ -1294,6 +1331,14 @@ public class ServerProperties private final Accesslog accesslog = new Accesslog(); + public long getMaxHttpPostSize() { + return this.maxHttpPostSize; + } + + public void setMaxHttpPostSize(long maxHttpPostSize) { + this.maxHttpPostSize = maxHttpPostSize; + } + public Integer getBufferSize() { return this.bufferSize; } @@ -1366,8 +1411,8 @@ public class ServerProperties customizeMaxHttpHeaderSize(factory, serverProperties.getMaxHttpHeaderSize()); } - if (serverProperties.getMaxHttpPostSize() > 0) { - customizeMaxHttpPostSize(factory, serverProperties.getMaxHttpPostSize()); + if (this.maxHttpPostSize > 0) { + customizeMaxHttpPostSize(factory, this.maxHttpPostSize); } if (serverProperties.getConnectionTimeout() != null) { @@ -1404,13 +1449,13 @@ public class ServerProperties private void customizeMaxHttpPostSize( UndertowEmbeddedServletContainerFactory factory, - final int maxHttpPostSize) { + final long maxHttpPostSize) { factory.addBuilderCustomizers(new UndertowBuilderCustomizer() { @Override public void customize(Builder builder) { builder.setServerOption(UndertowOptions.MAX_ENTITY_SIZE, - (long) maxHttpPostSize); + maxHttpPostSize); } }); diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/ServerPropertiesTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/ServerPropertiesTests.java index c0a33f9f2fe..0753f83632a 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/ServerPropertiesTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/ServerPropertiesTests.java @@ -310,7 +310,9 @@ public class ServerPropertiesTests { Map map = new HashMap(); map.put("server.maxHttpPostSize", "9999"); bindProperties(map); - assertThat(this.properties.getMaxHttpPostSize()).isEqualTo(9999); + assertThat(this.properties.getJetty().getMaxHttpPostSize()).isEqualTo(9999); + assertThat(this.properties.getTomcat().getMaxHttpPostSize()).isEqualTo(9999); + assertThat(this.properties.getUndertow().getMaxHttpPostSize()).isEqualTo(9999); } @Test @@ -476,6 +478,35 @@ public class ServerPropertiesTests { .getProtocolHandler()).getMaxConnections()).isEqualTo(5); } + @Test + public void customTomcatMaxHttpPostSize() { + Map map = new HashMap(); + map.put("server.tomcat.max-http-post-size", "10000"); + bindProperties(map); + + TomcatEmbeddedServletContainerFactory container = new TomcatEmbeddedServletContainerFactory(); + this.properties.customize(container); + TomcatEmbeddedServletContainer embeddedContainer = (TomcatEmbeddedServletContainer) container + .getEmbeddedServletContainer(); + assertThat(embeddedContainer.getTomcat().getConnector().getMaxPostSize()) + .isEqualTo(10000); + } + + @Test + @Deprecated + public void customTomcatMaxHttpPostSizeWithDeprecatedProperty() { + Map map = new HashMap(); + map.put("server.max-http-post-size", "2000"); + bindProperties(map); + + TomcatEmbeddedServletContainerFactory container = new TomcatEmbeddedServletContainerFactory(); + this.properties.customize(container); + TomcatEmbeddedServletContainer embeddedContainer = (TomcatEmbeddedServletContainer) container + .getEmbeddedServletContainer(); + assertThat(embeddedContainer.getTomcat().getConnector().getMaxPostSize()) + .isEqualTo(2000); + } + @Test public void customizeUndertowAccessLog() { Map map = new HashMap(); diff --git a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc index 562f9fc913d..45bbdb3ef72 100644 --- a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -153,11 +153,11 @@ content into your application; rather pick only the properties that you need. server.context-path= # Context path of the application. server.display-name=application # Display name of the application. server.max-http-header-size=0 # Maximum size in bytes of the HTTP message header. - server.max-http-post-size=0 # Maximum size in bytes of the HTTP post content. server.error.include-stacktrace=never # When to include a "stacktrace" attribute. server.error.path=/error # Path of the error controller. server.error.whitelabel.enabled=true # Enable the default error page displayed in browsers in case of a server error. server.jetty.acceptors= # Number of acceptor threads to use. + server.jetty.max-http-post-size=0 # Maximum size in bytes of the HTTP post or put content. server.jetty.selectors= # Number of selector threads to use. server.jsp-servlet.class-name=org.apache.jasper.servlet.JspServlet # The class name of the JSP servlet. server.jsp-servlet.init-parameters.*= # Init parameters used to configure the JSP servlet @@ -212,6 +212,7 @@ content into your application; rather pick only the properties that you need. 172\\.2[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}|\\ 172\\.3[0-1]{1}\\.\\d{1,3}\\.\\d{1,3} # regular expression matching trusted IP addresses. server.tomcat.max-connections= # Maximum number of connections that the server will accept and process at any given time. + server.tomcat.max-http-post-size=0 # Maximum size in bytes of the HTTP post content. server.tomcat.max-threads=0 # Maximum amount of worker threads. server.tomcat.min-spare-threads=0 # Minimum amount of worker threads. server.tomcat.port-header=X-Forwarded-Port # Name of the HTTP header used to override the original port value. @@ -230,6 +231,7 @@ content into your application; rather pick only the properties that you need. server.undertow.buffers-per-region= # Number of buffer per region. server.undertow.direct-buffers= # Allocate buffers outside the Java heap. server.undertow.io-threads= # Number of I/O threads to create for the worker. + server.undertow.max-http-post-size=0 # Maximum size in bytes of the HTTP post content. server.undertow.worker-threads= # Number of worker threads. # FREEMARKER ({sc-spring-boot-autoconfigure}/freemarker/FreeMarkerAutoConfiguration.{sc-ext}[FreeMarkerAutoConfiguration])