Skip to content

Commit a6b63d2

Browse files
committed
Merge branch '3.0.x' into 3.1.x
Closes gh-37015
2 parents 358717c + d381665 commit a6b63d2

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ public void customize(NettyReactiveWebServerFactory factory) {
6464
map.from(nettyProperties::getIdleTimeout).to((idleTimeout) -> customizeIdleTimeout(factory, idleTimeout));
6565
map.from(nettyProperties::getMaxKeepAliveRequests)
6666
.to((maxKeepAliveRequests) -> customizeMaxKeepAliveRequests(factory, maxKeepAliveRequests));
67+
if (this.serverProperties.getHttp2() != null && this.serverProperties.getHttp2().isEnabled()) {
68+
map.from(this.serverProperties.getMaxHttpRequestHeaderSize())
69+
.whenNonNull()
70+
.to((size) -> customizeHttp2MaxHeaderSize(factory, size.toBytes()));
71+
}
6772
customizeRequestDecoder(factory, map);
6873
}
6974

@@ -122,4 +127,9 @@ private void customizeMaxKeepAliveRequests(NettyReactiveWebServerFactory factory
122127
factory.addServerCustomizers((httpServer) -> httpServer.maxKeepAliveRequests(maxKeepAliveRequests));
123128
}
124129

130+
private void customizeHttp2MaxHeaderSize(NettyReactiveWebServerFactory factory, long size) {
131+
factory.addServerCustomizers(
132+
((httpServer) -> httpServer.http2Settings((settings) -> settings.maxHeaderListSize(size))));
133+
}
134+
125135
}

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

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.mockito.ArgumentCaptor;
2727
import org.mockito.Captor;
2828
import org.mockito.junit.jupiter.MockitoExtension;
29+
import reactor.netty.http.Http2SettingsSpec;
2930
import reactor.netty.http.server.HttpRequestDecoderSpec;
3031
import reactor.netty.http.server.HttpServer;
3132

@@ -126,9 +127,20 @@ void setMaxKeepAliveRequests() {
126127
verifyMaxKeepAliveRequests(factory, 100);
127128
}
128129

130+
@Test
131+
void setHttp2MaxRequestHeaderSize() {
132+
DataSize headerSize = DataSize.ofKilobytes(24);
133+
this.serverProperties.getHttp2().setEnabled(true);
134+
this.serverProperties.setMaxHttpRequestHeaderSize(headerSize);
135+
NettyReactiveWebServerFactory factory = mock(NettyReactiveWebServerFactory.class);
136+
this.customizer.customize(factory);
137+
verifyHttp2MaxHeaderSize(factory, headerSize.toBytes());
138+
}
139+
129140
@Test
130141
void configureHttpRequestDecoder() {
131142
ServerProperties.Netty nettyProperties = this.serverProperties.getNetty();
143+
this.serverProperties.setMaxHttpRequestHeaderSize(DataSize.ofKilobytes(24));
132144
nettyProperties.setValidateHeaders(false);
133145
nettyProperties.setInitialBufferSize(DataSize.ofBytes(512));
134146
nettyProperties.setH2cMaxContentLength(DataSize.ofKilobytes(1));
@@ -137,10 +149,11 @@ void configureHttpRequestDecoder() {
137149
NettyReactiveWebServerFactory factory = mock(NettyReactiveWebServerFactory.class);
138150
this.customizer.customize(factory);
139151
then(factory).should().addServerCustomizers(this.customizerCaptor.capture());
140-
NettyServerCustomizer serverCustomizer = this.customizerCaptor.getValue();
152+
NettyServerCustomizer serverCustomizer = this.customizerCaptor.getAllValues().get(0);
141153
HttpServer httpServer = serverCustomizer.apply(HttpServer.create());
142154
HttpRequestDecoderSpec decoder = httpServer.configuration().decoder();
143155
assertThat(decoder.validateHeaders()).isFalse();
156+
assertThat(decoder.maxHeaderSize()).isEqualTo(this.serverProperties.getMaxHttpRequestHeaderSize().toBytes());
144157
assertThat(decoder.initialBufferSize()).isEqualTo(nettyProperties.getInitialBufferSize().toBytes());
145158
assertThat(decoder.h2cMaxContentLength()).isEqualTo(nettyProperties.getH2cMaxContentLength().toBytes());
146159
assertMaxChunkSize(nettyProperties, decoder);
@@ -189,4 +202,12 @@ private void verifyMaxKeepAliveRequests(NettyReactiveWebServerFactory factory, i
189202
assertThat(maxKeepAliveRequests).isEqualTo(expected);
190203
}
191204

205+
private void verifyHttp2MaxHeaderSize(NettyReactiveWebServerFactory factory, long expected) {
206+
then(factory).should(times(2)).addServerCustomizers(this.customizerCaptor.capture());
207+
NettyServerCustomizer serverCustomizer = this.customizerCaptor.getAllValues().get(0);
208+
HttpServer httpServer = serverCustomizer.apply(HttpServer.create());
209+
Http2SettingsSpec decoder = httpServer.configuration().http2SettingsSpec();
210+
assertThat(decoder.maxHeaderListSize()).isEqualTo(expected);
211+
}
212+
192213
}

0 commit comments

Comments
 (0)