Skip to content

Commit 4fcaa87

Browse files
committed
Merge pull request #14986 from bturner
* pr/14986: Polish "Restore max-http-header-size default value support" Restore max-http-header-size default value support
2 parents 807743b + 1451c0c commit 4fcaa87

File tree

6 files changed

+107
-5
lines changed

6 files changed

+107
-5
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public void customize(ConfigurableJettyWebServerFactory factory) {
7575
propertyMapper.from(jettyProperties::getSelectors).whenNonNull()
7676
.to(factory::setSelectors);
7777
propertyMapper.from(properties::getMaxHttpHeaderSize).whenNonNull()
78-
.asInt(DataSize::toBytes)
78+
.asInt(DataSize::toBytes).when(this::isPositive)
7979
.to((maxHttpHeaderSize) -> customizeMaxHttpHeaderSize(factory,
8080
maxHttpHeaderSize));
8181
propertyMapper.from(jettyProperties::getMaxHttpPostSize).asInt(DataSize::toBytes)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public void customize(ConfigurableTomcatWebServerFactory factory) {
8686
propertyMapper.from(tomcatProperties::getMinSpareThreads).when(this::isPositive)
8787
.to((minSpareThreads) -> customizeMinThreads(factory, minSpareThreads));
8888
propertyMapper.from(this::determineMaxHttpHeaderSize).whenNonNull()
89-
.asInt(DataSize::toBytes)
89+
.asInt(DataSize::toBytes).when(this::isPositive)
9090
.to((maxHttpHeaderSize) -> customizeMaxHttpHeaderSize(factory,
9191
maxHttpHeaderSize));
9292
propertyMapper.from(tomcatProperties::getMaxSwallowSize).whenNonNull()

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public void customize(ConfigurableUndertowWebServerFactory factory) {
8686
propertyMapper.from(this::getOrDeduceUseForwardHeaders)
8787
.to(factory::setUseForwardHeaders);
8888
propertyMapper.from(properties::getMaxHttpHeaderSize).whenNonNull()
89-
.asInt(DataSize::toBytes)
89+
.asInt(DataSize::toBytes).when(this::isPositive)
9090
.to((maxHttpHeaderSize) -> customizeMaxHttpHeaderSize(factory,
9191
maxHttpHeaderSize));
9292
propertyMapper.from(undertowProperties::getMaxHttpPostSize)

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

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import java.io.File;
2020
import java.io.IOException;
21+
import java.util.ArrayList;
22+
import java.util.List;
2123
import java.util.Locale;
2224
import java.util.TimeZone;
2325

@@ -38,6 +40,7 @@
3840
import org.springframework.boot.web.embedded.jetty.JettyWebServer;
3941
import org.springframework.mock.env.MockEnvironment;
4042
import org.springframework.test.context.support.TestPropertySourceUtils;
43+
import org.springframework.test.util.ReflectionTestUtils;
4144

4245
import static org.assertj.core.api.Assertions.assertThat;
4346
import static org.mockito.Mockito.mock;
@@ -147,15 +150,40 @@ public void setUseForwardHeaders() {
147150
public void customizeMaxHttpHeaderSize() {
148151
bind("server.max-http-header-size=2048");
149152
JettyWebServer server = customizeAndGetServer();
150-
for (Connector connector : server.getServer().getConnectors()) {
153+
List<Integer> requestHeaderSizes = getRequestHeaderSizes(server);
154+
assertThat(requestHeaderSizes).containsOnly(2048);
155+
}
156+
157+
@Test
158+
public void customMaxHttpHeaderSizeIgnoredIfNegative() {
159+
bind("server.max-http-header-size=-1");
160+
JettyWebServer server = customizeAndGetServer();
161+
List<Integer> requestHeaderSizes = getRequestHeaderSizes(server);
162+
assertThat(requestHeaderSizes).containsOnly(8192);
163+
}
164+
165+
@Test
166+
public void customMaxHttpHeaderSizeIgnoredIfZero() {
167+
bind("server.max-http-header-size=0");
168+
JettyWebServer server = customizeAndGetServer();
169+
List<Integer> requestHeaderSizes = getRequestHeaderSizes(server);
170+
assertThat(requestHeaderSizes).containsOnly(8192);
171+
}
172+
173+
private List<Integer> getRequestHeaderSizes(JettyWebServer server) {
174+
List<Integer> requestHeaderSizes = new ArrayList<>();
175+
Connector[] connectors = (Connector[]) ReflectionTestUtils.getField(server,
176+
"connectors");
177+
for (Connector connector : connectors) {
151178
connector.getConnectionFactories().stream()
152179
.filter((factory) -> factory instanceof ConnectionFactory)
153180
.forEach((cf) -> {
154181
ConnectionFactory factory = (ConnectionFactory) cf;
155182
HttpConfiguration configuration = factory.getHttpConfiguration();
156-
assertThat(configuration.getRequestHeaderSize()).isEqualTo(2048);
183+
requestHeaderSizes.add(configuration.getRequestHeaderSize());
157184
});
158185
}
186+
return requestHeaderSizes;
159187
}
160188

161189
private void bind(String... inlinedProperties) {

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,22 @@ public void customMaxHttpHeaderSize() {
129129
.isEqualTo(DataSize.ofKilobytes(1).toBytes()));
130130
}
131131

132+
@Test
133+
public void customMaxHttpHeaderSizeIgnoredIfNegative() {
134+
bind("server.max-http-header-size=-1");
135+
customizeAndRunServer((server) -> assertThat(((AbstractHttp11Protocol<?>) server
136+
.getTomcat().getConnector().getProtocolHandler()).getMaxHttpHeaderSize())
137+
.isEqualTo(DataSize.ofKilobytes(8).toBytes()));
138+
}
139+
140+
@Test
141+
public void customMaxHttpHeaderSizeIgnoredIfZero() {
142+
bind("server.max-http-header-size=0");
143+
customizeAndRunServer((server) -> assertThat(((AbstractHttp11Protocol<?>) server
144+
.getTomcat().getConnector().getProtocolHandler()).getMaxHttpHeaderSize())
145+
.isEqualTo(DataSize.ofKilobytes(8).toBytes()));
146+
}
147+
132148
@Test
133149
@Deprecated
134150
public void customMaxHttpHeaderSizeWithDeprecatedProperty() {

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

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,28 @@
1717
package org.springframework.boot.autoconfigure.web.embedded;
1818

1919
import java.io.File;
20+
import java.util.Arrays;
2021

22+
import io.undertow.Undertow;
23+
import io.undertow.Undertow.Builder;
24+
import io.undertow.UndertowOptions;
2125
import org.junit.Before;
2226
import org.junit.Test;
27+
import org.xnio.OptionMap;
2328

2429
import org.springframework.boot.autoconfigure.web.ServerProperties;
2530
import org.springframework.boot.context.properties.bind.Bindable;
2631
import org.springframework.boot.context.properties.bind.Binder;
2732
import org.springframework.boot.context.properties.source.ConfigurationPropertySources;
2833
import org.springframework.boot.web.embedded.undertow.ConfigurableUndertowWebServerFactory;
34+
import org.springframework.boot.web.embedded.undertow.UndertowBuilderCustomizer;
2935
import org.springframework.mock.env.MockEnvironment;
3036
import org.springframework.test.context.support.TestPropertySourceUtils;
37+
import org.springframework.test.util.ReflectionTestUtils;
3138

39+
import static org.assertj.core.api.Assertions.assertThat;
40+
import static org.mockito.ArgumentMatchers.any;
41+
import static org.mockito.BDDMockito.willAnswer;
3242
import static org.mockito.Mockito.mock;
3343
import static org.mockito.Mockito.verify;
3444

@@ -100,6 +110,54 @@ public void setUseForwardHeaders() {
100110
verify(factory).setUseForwardHeaders(true);
101111
}
102112

113+
@Test
114+
public void customizeMaxHttpHeaderSize() {
115+
bind("server.max-http-header-size=2048");
116+
Builder builder = Undertow.builder();
117+
ConfigurableUndertowWebServerFactory factory = mockFactory(builder);
118+
this.customizer.customize(factory);
119+
OptionMap map = ((OptionMap.Builder) ReflectionTestUtils.getField(builder,
120+
"serverOptions")).getMap();
121+
assertThat(map.get(UndertowOptions.MAX_HEADER_SIZE).intValue()).isEqualTo(2048);
122+
}
123+
124+
@Test
125+
public void customMaxHttpHeaderSizeIgnoredIfNegative() {
126+
bind("server.max-http-header-size=-1");
127+
Builder builder = Undertow.builder();
128+
ConfigurableUndertowWebServerFactory factory = mockFactory(builder);
129+
this.customizer.customize(factory);
130+
OptionMap map = ((OptionMap.Builder) ReflectionTestUtils.getField(builder,
131+
"serverOptions")).getMap();
132+
assertThat(map.contains(UndertowOptions.MAX_HEADER_SIZE)).isFalse();
133+
}
134+
135+
@Test
136+
public void customMaxHttpHeaderSizeIgnoredIfZero() {
137+
bind("server.max-http-header-size=0");
138+
Builder builder = Undertow.builder();
139+
ConfigurableUndertowWebServerFactory factory = mockFactory(builder);
140+
this.customizer.customize(factory);
141+
OptionMap map = ((OptionMap.Builder) ReflectionTestUtils.getField(builder,
142+
"serverOptions")).getMap();
143+
assertThat(map.contains(UndertowOptions.MAX_HEADER_SIZE)).isFalse();
144+
}
145+
146+
private ConfigurableUndertowWebServerFactory mockFactory(Builder builder) {
147+
ConfigurableUndertowWebServerFactory factory = mock(
148+
ConfigurableUndertowWebServerFactory.class);
149+
willAnswer((invocation) -> {
150+
Object argument = invocation.getArgument(0);
151+
Arrays.stream((argument instanceof UndertowBuilderCustomizer)
152+
? new UndertowBuilderCustomizer[] {
153+
(UndertowBuilderCustomizer) argument }
154+
: (UndertowBuilderCustomizer[]) argument)
155+
.forEach((customizer) -> customizer.customize(builder));
156+
return null;
157+
}).given(factory).addBuilderCustomizers(any());
158+
return factory;
159+
}
160+
103161
private void bind(String... inlinedProperties) {
104162
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.environment,
105163
inlinedProperties);

0 commit comments

Comments
 (0)