Skip to content

Commit 6e885c4

Browse files
qingbozhangphilwebb
authored andcommitted
Add support for 'server.jetty.max-form-key' property
Add a new 'server.jetty.max-form-key' property that can be used to configure Jetty's Handler.setMaxFormKeys(...). See gh-42448
1 parent 90f375e commit 6e885c4

File tree

4 files changed

+54
-9
lines changed

4 files changed

+54
-9
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,6 +1148,11 @@ public static class Jetty {
11481148
*/
11491149
private DataSize maxHttpFormPostSize = DataSize.ofBytes(200000);
11501150

1151+
/**
1152+
* Maximum number of form keys.
1153+
*/
1154+
private int maxFormKeys = 1000;
1155+
11511156
/**
11521157
* Time that the connection can be idle before it is closed.
11531158
*/
@@ -1180,6 +1185,14 @@ public void setMaxHttpFormPostSize(DataSize maxHttpFormPostSize) {
11801185
this.maxHttpFormPostSize = maxHttpFormPostSize;
11811186
}
11821187

1188+
public int getMaxFormKeys() {
1189+
return this.maxFormKeys;
1190+
}
1191+
1192+
public void setMaxFormKeys(int maxFormKeys) {
1193+
this.maxFormKeys = maxFormKeys;
1194+
}
1195+
11831196
public Duration getConnectionIdleTimeout() {
11841197
return this.connectionIdleTimeout;
11851198
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/embedded/JettyWebServerFactoryCustomizer.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.time.Duration;
2020
import java.util.Arrays;
2121
import java.util.List;
22+
import java.util.function.Consumer;
2223

2324
import org.eclipse.jetty.ee10.servlet.ServletContextHandler;
2425
import org.eclipse.jetty.server.AbstractConnector;
@@ -93,7 +94,11 @@ public void customize(ConfigurableJettyWebServerFactory factory) {
9394
map.from(properties::getMaxHttpFormPostSize)
9495
.asInt(DataSize::toBytes)
9596
.when(this::isPositive)
96-
.to((maxHttpFormPostSize) -> customizeMaxHttpFormPostSize(factory, maxHttpFormPostSize));
97+
.to((maxHttpFormPostSize) -> customizeServletContextHandler(factory, contextHandler -> contextHandler.setMaxFormContentSize(maxHttpFormPostSize)));
98+
map.from(properties::getMaxFormKeys)
99+
.when(this::isPositive)
100+
.to((maxFormKeys) -> customizeServletContextHandler(factory, contextHandler -> contextHandler.setMaxFormKeys(maxFormKeys)));
101+
97102
map.from(properties::getConnectionIdleTimeout).to((idleTimeout) -> customizeIdleTimeout(factory, idleTimeout));
98103
map.from(properties::getAccesslog)
99104
.when(ServerProperties.Jetty.Accesslog::isEnabled)
@@ -122,29 +127,29 @@ private void customizeIdleTimeout(ConfigurableJettyWebServerFactory factory, Dur
122127
});
123128
}
124129

125-
private void customizeMaxHttpFormPostSize(ConfigurableJettyWebServerFactory factory, int maxHttpFormPostSize) {
130+
private void customizeServletContextHandler(ConfigurableJettyWebServerFactory factory, Consumer<ServletContextHandler> customFunc) {
126131
factory.addServerCustomizers(new JettyServerCustomizer() {
127132

128133
@Override
129134
public void customize(Server server) {
130-
setHandlerMaxHttpFormPostSize(server.getHandlers());
135+
acceptCustomizeServletContextHandler(server.getHandlers());
131136
}
132137

133-
private void setHandlerMaxHttpFormPostSize(List<Handler> handlers) {
138+
private void acceptCustomizeServletContextHandler(List<Handler> handlers) {
134139
for (Handler handler : handlers) {
135-
setHandlerMaxHttpFormPostSize(handler);
140+
acceptCustomizeServletContextHandler(handler);
136141
}
137142
}
138143

139-
private void setHandlerMaxHttpFormPostSize(Handler handler) {
144+
private void acceptCustomizeServletContextHandler(Handler handler) {
140145
if (handler instanceof ServletContextHandler contextHandler) {
141-
contextHandler.setMaxFormContentSize(maxHttpFormPostSize);
146+
customFunc.accept(contextHandler);
142147
}
143148
else if (handler instanceof Handler.Wrapper wrapper) {
144-
setHandlerMaxHttpFormPostSize(wrapper.getHandler());
149+
acceptCustomizeServletContextHandler(wrapper.getHandler());
145150
}
146151
else if (handler instanceof Handler.Collection collection) {
147-
setHandlerMaxHttpFormPostSize(collection.getHandlers());
152+
acceptCustomizeServletContextHandler(collection.getHandlers());
148153
}
149154
}
150155

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/ServerPropertiesTests.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,15 @@ void jettyMaxHttpFormPostSizeMatchesDefault() {
465465
.isEqualTo(((ServletContextHandler) server.getHandler()).getMaxFormContentSize());
466466
}
467467

468+
@Test
469+
void jettyMaxFormKeysMatchesDefault() {
470+
JettyServletWebServerFactory jettyFactory = new JettyServletWebServerFactory(0);
471+
JettyWebServer jetty = (JettyWebServer) jettyFactory.getWebServer();
472+
Server server = jetty.getServer();
473+
assertThat(this.properties.getJetty().getMaxFormKeys())
474+
.isEqualTo(((ServletContextHandler) server.getHandler()).getMaxFormKeys());
475+
}
476+
468477
@Test
469478
void undertowMaxHttpPostSizeMatchesDefault() {
470479
assertThat(this.properties.getUndertow().getMaxHttpPostSize().toBytes())

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/embedded/JettyWebServerFactoryCustomizerTests.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.concurrent.SynchronousQueue;
2727
import java.util.function.Function;
2828

29+
import org.eclipse.jetty.ee10.servlet.ServletContextHandler;
2930
import org.eclipse.jetty.server.AbstractConnector;
3031
import org.eclipse.jetty.server.Connector;
3132
import org.eclipse.jetty.server.CustomRequestLog;
@@ -324,6 +325,23 @@ void customIdleTimeout() {
324325
assertThat(timeouts).containsOnly(60000L);
325326
}
326327

328+
@Test
329+
void customMaxFormKeys() {
330+
bind("server.jetty.max-form-keys=2048");
331+
JettyWebServer server = customizeAndGetServer();
332+
List<Integer> maxFormKeys = getMaxFormKeys(server);
333+
assertThat(maxFormKeys).containsOnly(2048);
334+
}
335+
336+
private List<Integer> getMaxFormKeys(JettyWebServer server) {
337+
server.start();
338+
server.stop();
339+
return server.getServer().getHandlers().stream()
340+
.filter(handler -> handler instanceof ServletContextHandler)
341+
.map(handler -> ((ServletContextHandler) handler).getMaxFormKeys())
342+
.toList();
343+
}
344+
327345
private List<Long> connectorsIdleTimeouts(JettyWebServer server) {
328346
// Start (and directly stop) server to have connectors available
329347
server.start();

0 commit comments

Comments
 (0)