Apply server.tomcat.keep-alive-timeout to HTTP/2
Closes gh-30267
This commit is contained in:
parent
2b75ea5fb8
commit
1669062231
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2012-2021 the original author or authors.
|
* Copyright 2012-2022 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -26,7 +26,9 @@ import org.apache.catalina.valves.ErrorReportValve;
|
||||||
import org.apache.catalina.valves.RemoteIpValve;
|
import org.apache.catalina.valves.RemoteIpValve;
|
||||||
import org.apache.coyote.AbstractProtocol;
|
import org.apache.coyote.AbstractProtocol;
|
||||||
import org.apache.coyote.ProtocolHandler;
|
import org.apache.coyote.ProtocolHandler;
|
||||||
|
import org.apache.coyote.UpgradeProtocol;
|
||||||
import org.apache.coyote.http11.AbstractHttp11Protocol;
|
import org.apache.coyote.http11.AbstractHttp11Protocol;
|
||||||
|
import org.apache.coyote.http2.Http2Protocol;
|
||||||
|
|
||||||
import org.springframework.boot.autoconfigure.web.ErrorProperties;
|
import org.springframework.boot.autoconfigure.web.ErrorProperties;
|
||||||
import org.springframework.boot.autoconfigure.web.ErrorProperties.IncludeAttribute;
|
import org.springframework.boot.autoconfigure.web.ErrorProperties.IncludeAttribute;
|
||||||
|
|
@ -147,6 +149,11 @@ public class TomcatWebServerFactoryCustomizer
|
||||||
private void customizeKeepAliveTimeout(ConfigurableTomcatWebServerFactory factory, Duration keepAliveTimeout) {
|
private void customizeKeepAliveTimeout(ConfigurableTomcatWebServerFactory factory, Duration keepAliveTimeout) {
|
||||||
factory.addConnectorCustomizers((connector) -> {
|
factory.addConnectorCustomizers((connector) -> {
|
||||||
ProtocolHandler handler = connector.getProtocolHandler();
|
ProtocolHandler handler = connector.getProtocolHandler();
|
||||||
|
for (UpgradeProtocol upgradeProtocol : handler.findUpgradeProtocols()) {
|
||||||
|
if (upgradeProtocol instanceof Http2Protocol) {
|
||||||
|
((Http2Protocol) upgradeProtocol).setKeepAliveTimeout(keepAliveTimeout.toMillis());
|
||||||
|
}
|
||||||
|
}
|
||||||
if (handler instanceof AbstractProtocol) {
|
if (handler instanceof AbstractProtocol) {
|
||||||
AbstractProtocol<?> protocol = (AbstractProtocol<?>) handler;
|
AbstractProtocol<?> protocol = (AbstractProtocol<?>) handler;
|
||||||
protocol.setKeepAliveTimeout((int) keepAliveTimeout.toMillis());
|
protocol.setKeepAliveTimeout((int) keepAliveTimeout.toMillis());
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2012-2021 the original author or authors.
|
* Copyright 2012-2022 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -28,6 +28,7 @@ import org.apache.catalina.valves.RemoteIpValve;
|
||||||
import org.apache.coyote.AbstractProtocol;
|
import org.apache.coyote.AbstractProtocol;
|
||||||
import org.apache.coyote.ajp.AbstractAjpProtocol;
|
import org.apache.coyote.ajp.AbstractAjpProtocol;
|
||||||
import org.apache.coyote.http11.AbstractHttp11Protocol;
|
import org.apache.coyote.http11.AbstractHttp11Protocol;
|
||||||
|
import org.apache.coyote.http2.Http2Protocol;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
|
@ -106,6 +107,22 @@ class TomcatWebServerFactoryCustomizerTests {
|
||||||
.isEqualTo(30));
|
.isEqualTo(30));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void defaultKeepAliveTimeoutWithHttp2() {
|
||||||
|
bind("server.http2.enabled=true");
|
||||||
|
customizeAndRunServer((server) -> assertThat(
|
||||||
|
((Http2Protocol) server.getTomcat().getConnector().findUpgradeProtocols()[0]).getKeepAliveTimeout())
|
||||||
|
.isEqualTo(20000L));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void customKeepAliveTimeoutWithHttp2() {
|
||||||
|
bind("server.tomcat.keep-alive-timeout=30s", "server.http2.enabled=true");
|
||||||
|
customizeAndRunServer((server) -> assertThat(
|
||||||
|
((Http2Protocol) server.getTomcat().getConnector().findUpgradeProtocols()[0]).getKeepAliveTimeout())
|
||||||
|
.isEqualTo(30000L));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void customMaxKeepAliveRequests() {
|
void customMaxKeepAliveRequests() {
|
||||||
bind("server.tomcat.max-keep-alive-requests=-1");
|
bind("server.tomcat.max-keep-alive-requests=-1");
|
||||||
|
|
@ -514,6 +531,7 @@ class TomcatWebServerFactoryCustomizerTests {
|
||||||
|
|
||||||
private TomcatServletWebServerFactory customizeAndGetFactory() {
|
private TomcatServletWebServerFactory customizeAndGetFactory() {
|
||||||
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(0);
|
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(0);
|
||||||
|
factory.setHttp2(this.serverProperties.getHttp2());
|
||||||
this.customizer.customize(factory);
|
this.customizer.customize(factory);
|
||||||
return factory;
|
return factory;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue