Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a configuration property to customize the Tomcat connector's max parameter count #43286

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@
* @author Florian Storz
* @author Michael Weidmann
* @author Lasse Wulff
* @author Yanming Zhou
* @since 1.0.0
*/
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
Expand Down Expand Up @@ -513,13 +514,11 @@ public static class Tomcat {
*/
private DataSize maxHttpResponseHeaderSize = DataSize.ofKilobytes(8);

public DataSize getMaxHttpFormPostSize() {
return this.maxHttpFormPostSize;
}

public void setMaxHttpFormPostSize(DataSize maxHttpFormPostSize) {
this.maxHttpFormPostSize = maxHttpFormPostSize;
}
/**
* Maximum number of parameters (GET plus POST) that will be automatically parsed
* by the container. A value of less than 0 means no limit.
*/
private int maxParameterCount = 10000;
quaff marked this conversation as resolved.
Show resolved Hide resolved

public Accesslog getAccesslog() {
return this.accesslog;
Expand Down Expand Up @@ -669,6 +668,22 @@ public void setMaxHttpResponseHeaderSize(DataSize maxHttpResponseHeaderSize) {
this.maxHttpResponseHeaderSize = maxHttpResponseHeaderSize;
}

public DataSize getMaxHttpFormPostSize() {
return this.maxHttpFormPostSize;
}

public void setMaxHttpFormPostSize(DataSize maxHttpFormPostSize) {
this.maxHttpFormPostSize = maxHttpFormPostSize;
}

public int getMaxParameterCount() {
return this.maxParameterCount;
}

public void setMaxParameterCount(int maxParameterCount) {
this.maxParameterCount = maxParameterCount;
}

/**
* Tomcat access log properties.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
* @author Parviz Rozikov
* @author Florian Storz
* @author Michael Weidmann
* @author Yanming Zhou
* @since 2.0.0
*/
public class TomcatWebServerFactoryCustomizer
Expand Down Expand Up @@ -119,6 +120,8 @@ public void customize(ConfigurableTomcatWebServerFactory factory) {
.asInt(DataSize::toBytes)
.when((maxHttpFormPostSize) -> maxHttpFormPostSize != 0)
.to((maxHttpFormPostSize) -> customizeMaxHttpFormPostSize(factory, maxHttpFormPostSize));
map.from(properties::getMaxParameterCount)
.to((maxParameterCount) -> customizeMaxParameterCount(factory, maxParameterCount));
map.from(properties::getAccesslog)
.when(ServerProperties.Tomcat.Accesslog::isEnabled)
.to((enabled) -> customizeAccessLog(factory));
Expand Down Expand Up @@ -292,6 +295,10 @@ private void customizeMaxHttpFormPostSize(ConfigurableTomcatWebServerFactory fac
factory.addConnectorCustomizers((connector) -> connector.setMaxPostSize(maxHttpFormPostSize));
}

private void customizeMaxParameterCount(ConfigurableTomcatWebServerFactory factory, int maxParameterCount) {
factory.addConnectorCustomizers((connector) -> connector.setMaxParameterCount(maxParameterCount));
}

private void customizeAccessLog(ConfigurableTomcatWebServerFactory factory) {
ServerProperties.Tomcat tomcatProperties = this.serverProperties.getTomcat();
AccessLogValve valve = new AccessLogValve();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
* @author Chris Bono
* @author Parviz Rozikov
* @author Lasse Wulff
* @author Yanming Zhou
*/
@DirtiesUrlFactories
class ServerPropertiesTests {
Expand Down Expand Up @@ -199,7 +200,7 @@ void testCustomizedMimeMapping() {
}

@Test
void testCustomizeUriEncoding() {
void testCustomizeTomcatUriEncoding() {
bind("server.tomcat.uri-encoding", "US-ASCII");
assertThat(this.properties.getTomcat().getUriEncoding()).isEqualTo(StandardCharsets.US_ASCII);
}
Expand Down Expand Up @@ -235,17 +236,23 @@ void testCustomizeTomcatKeepAliveTimeoutWithInfinite() {
}

@Test
void customizeMaxKeepAliveRequests() {
void testCustomizeTomcatMaxKeepAliveRequests() {
bind("server.tomcat.max-keep-alive-requests", "200");
assertThat(this.properties.getTomcat().getMaxKeepAliveRequests()).isEqualTo(200);
}

@Test
void customizeMaxKeepAliveRequestsWithInfinite() {
void testCustomizeTomcatMaxKeepAliveRequestsWithInfinite() {
bind("server.tomcat.max-keep-alive-requests", "-1");
assertThat(this.properties.getTomcat().getMaxKeepAliveRequests()).isEqualTo(-1);
}

@Test
void testCustomizeTomcatMaxParameterCount() {
bind("server.tomcat.max-parameter-count", "100");
assertThat(this.properties.getTomcat().getMaxParameterCount()).isEqualTo(100);
}

@Test
void testCustomizeTomcatMinSpareThreads() {
bind("server.tomcat.threads.min-spare", "10");
Expand Down Expand Up @@ -379,6 +386,12 @@ void tomcatMaxHttpPostSizeMatchesConnectorDefault() {
.isEqualTo(getDefaultConnector().getMaxPostSize());
}

@Test
void tomcatMaxParameterCountMatchesConnectorDefault() {
assertThat(this.properties.getTomcat().getMaxParameterCount())
.isEqualTo(getDefaultConnector().getMaxParameterCount());
}

@Test
void tomcatBackgroundProcessorDelayMatchesEngineDefault() {
assertThat(this.properties.getTomcat().getBackgroundProcessorDelay())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
* @author Victor Mandujano
* @author Parviz Rozikov
* @author Moritz Halbritter
* @author Yanming Zhou
*/
class TomcatWebServerFactoryCustomizerTests {

Expand Down Expand Up @@ -194,6 +195,13 @@ void customMaxHttpRequestHeaderSize() {
.isEqualTo(DataSize.ofMegabytes(10).toBytes()));
}

@Test
void customMaxParameterCount() {
bind("server.tomcat.max-parameter-count=100");
customizeAndRunServer(
(server) -> assertThat(server.getTomcat().getConnector().getMaxParameterCount()).isEqualTo(100));
}

@Test
void customMaxRequestHttpHeaderSizeIgnoredIfNegative() {
bind("server.max-http-request-header-size=-1");
Expand Down