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