diff --git a/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/DevToolsIntegrationTests.java b/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/DevToolsIntegrationTests.java index 24c2f9434a..c440eba655 100644 --- a/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/DevToolsIntegrationTests.java +++ b/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/DevToolsIntegrationTests.java @@ -17,9 +17,11 @@ package org.springframework.boot.devtools.tests; import java.io.File; +import java.util.concurrent.TimeUnit; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.impl.client.StandardHttpRequestRetryHandler; +import org.apache.hc.client5.http.impl.DefaultHttpRequestRetryStrategy; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.util.TimeValue; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -37,9 +39,10 @@ import static org.assertj.core.api.Assertions.assertThat; */ class DevToolsIntegrationTests extends AbstractDevToolsIntegrationTests { - private final TestRestTemplate template = new TestRestTemplate( - new RestTemplateBuilder().requestFactory(() -> new HttpComponentsClientHttpRequestFactory( - HttpClients.custom().setRetryHandler(new StandardHttpRequestRetryHandler(10, false)).build()))); + private final TestRestTemplate template = new TestRestTemplate(new RestTemplateBuilder() + .requestFactory(() -> new HttpComponentsClientHttpRequestFactory(HttpClients.custom() + .setRetryStrategy(new DefaultHttpRequestRetryStrategy(10, TimeValue.of(1, TimeUnit.SECONDS))) + .build()))); @ParameterizedTest(name = "{0}") @MethodSource("parameters") diff --git a/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/io/restclient/resttemplate/customization/MyRestTemplateCustomizer.java b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/io/restclient/resttemplate/customization/MyRestTemplateCustomizer.java index 9ce9f9e458..a8fb69dc31 100644 --- a/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/io/restclient/resttemplate/customization/MyRestTemplateCustomizer.java +++ b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/io/restclient/resttemplate/customization/MyRestTemplateCustomizer.java @@ -16,14 +16,13 @@ package org.springframework.boot.docs.io.restclient.resttemplate.customization; -import org.apache.http.HttpException; -import org.apache.http.HttpHost; -import org.apache.http.HttpRequest; -import org.apache.http.client.HttpClient; -import org.apache.http.conn.routing.HttpRoutePlanner; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.conn.DefaultProxyRoutePlanner; -import org.apache.http.protocol.HttpContext; +import org.apache.hc.client5.http.classic.HttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.client5.http.impl.routing.DefaultProxyRoutePlanner; +import org.apache.hc.client5.http.routing.HttpRoutePlanner; +import org.apache.hc.core5.http.HttpException; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.protocol.HttpContext; import org.springframework.boot.web.client.RestTemplateCustomizer; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; @@ -45,11 +44,11 @@ public class MyRestTemplateCustomizer implements RestTemplateCustomizer { } @Override - public HttpHost determineProxy(HttpHost target, HttpRequest request, HttpContext context) throws HttpException { + protected HttpHost determineProxy(HttpHost target, HttpContext context) throws HttpException { if (target.getHostName().equals("192.168.0.5")) { return null; } - return super.determineProxy(target, request, context); + return super.determineProxy(target, context); } } diff --git a/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/io/restclient/resttemplate/customization/MyRestTemplateCustomizer.kt b/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/io/restclient/resttemplate/customization/MyRestTemplateCustomizer.kt index 5a658919c0..314bae4755 100644 --- a/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/io/restclient/resttemplate/customization/MyRestTemplateCustomizer.kt +++ b/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/io/restclient/resttemplate/customization/MyRestTemplateCustomizer.kt @@ -16,14 +16,13 @@ package org.springframework.boot.docs.io.restclient.resttemplate.customization -import org.apache.http.HttpException -import org.apache.http.HttpHost -import org.apache.http.HttpRequest -import org.apache.http.client.HttpClient -import org.apache.http.conn.routing.HttpRoutePlanner -import org.apache.http.impl.client.HttpClientBuilder -import org.apache.http.impl.conn.DefaultProxyRoutePlanner -import org.apache.http.protocol.HttpContext +import org.apache.hc.client5.http.classic.HttpClient +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder +import org.apache.hc.client5.http.impl.routing.DefaultProxyRoutePlanner +import org.apache.hc.client5.http.routing.HttpRoutePlanner +import org.apache.hc.core5.http.HttpException +import org.apache.hc.core5.http.HttpHost +import org.apache.hc.core5.http.protocol.HttpContext import org.springframework.boot.web.client.RestTemplateCustomizer import org.springframework.http.client.HttpComponentsClientHttpRequestFactory import org.springframework.web.client.RestTemplate @@ -39,11 +38,11 @@ class MyRestTemplateCustomizer : RestTemplateCustomizer { internal class CustomRoutePlanner(proxy: HttpHost?) : DefaultProxyRoutePlanner(proxy) { @Throws(HttpException::class) - public override fun determineProxy(target: HttpHost, request: HttpRequest, context: HttpContext): HttpHost? { + public override fun determineProxy(target: HttpHost, context: HttpContext): HttpHost? { if (target.hostName == "192.168.0.5") { return null } - return super.determineProxy(target, request, context) + return super.determineProxy(target, context) } } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactoryTests.java index c199c6936b..676829d9f0 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactoryTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactoryTests.java @@ -33,11 +33,11 @@ import java.util.concurrent.atomic.AtomicReference; import jakarta.servlet.ServletContextEvent; import jakarta.servlet.ServletContextListener; import jakarta.servlet.ServletRegistration.Dynamic; -import org.apache.http.Header; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.conn.HttpHostConnectException; -import org.apache.http.impl.client.HttpClients; +import org.apache.hc.client5.http.HttpHostConnectException; +import org.apache.hc.client5.http.classic.HttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpResponse; import org.apache.jasper.servlet.JspServlet; import org.awaitility.Awaitility; import org.eclipse.jetty.server.Connector; @@ -319,7 +319,7 @@ class JettyServletWebServerFactoryTests extends AbstractServletWebServerFactoryT blockingServlet.admitOne(); Object response = request.get(); assertThat(response).isInstanceOf(HttpResponse.class); - assertThat(((HttpResponse) response).getStatusLine().getStatusCode()).isEqualTo(200); + assertThat(((HttpResponse) response).getCode()).isEqualTo(200); assertThat(((HttpResponse) response).getFirstHeader("Connection")).isNull(); this.webServer.shutDownGracefully((result) -> { }); @@ -328,7 +328,7 @@ class JettyServletWebServerFactoryTests extends AbstractServletWebServerFactoryT blockingServlet.admitOne(); response = request.get(); assertThat(response).isInstanceOf(HttpResponse.class); - assertThat(((HttpResponse) response).getStatusLine().getStatusCode()).isEqualTo(200); + assertThat(((HttpResponse) response).getCode()).isEqualTo(200); assertThat(((HttpResponse) response).getFirstHeader("Connection")).isNotNull().extracting(Header::getValue) .isEqualTo("close"); this.webServer.stop(); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactoryTests.java index ab5a319cf9..457113569b 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactoryTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactoryTests.java @@ -57,11 +57,11 @@ import org.apache.catalina.util.CharsetMapper; import org.apache.catalina.valves.RemoteIpValve; import org.apache.coyote.ProtocolHandler; import org.apache.coyote.http11.AbstractHttp11Protocol; -import org.apache.http.HttpResponse; -import org.apache.http.NoHttpResponseException; -import org.apache.http.client.HttpClient; -import org.apache.http.conn.HttpHostConnectException; -import org.apache.http.impl.client.HttpClients; +import org.apache.hc.client5.http.HttpHostConnectException; +import org.apache.hc.client5.http.classic.HttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.http.HttpResponse; +import org.apache.hc.core5.http.NoHttpResponseException; import org.apache.jasper.servlet.JspServlet; import org.apache.tomcat.JarScanFilter; import org.apache.tomcat.JarScanType; diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactoryTests.java index 0460d41e73..79fdc081da 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactoryTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactoryTests.java @@ -36,7 +36,7 @@ import io.undertow.Undertow.Builder; import io.undertow.servlet.api.DeploymentInfo; import io.undertow.servlet.api.ServletContainer; import jakarta.servlet.ServletRegistration.Dynamic; -import org.apache.http.HttpResponse; +import org.apache.hc.core5.http.HttpResponse; import org.apache.jasper.servlet.JspServlet; import org.awaitility.Awaitility; import org.junit.jupiter.api.AfterEach; @@ -207,8 +207,7 @@ class UndertowServletWebServerFactoryTests extends AbstractServletWebServerFacto assertThat(request.get()).isInstanceOf(HttpResponse.class); Object rejectedResult = initiateGetRequest(port, "/").get(); assertThat(rejectedResult).isInstanceOf(HttpResponse.class); - assertThat(((HttpResponse) rejectedResult).getStatusLine().getStatusCode()) - .isEqualTo(HttpStatus.SERVICE_UNAVAILABLE.value()); + assertThat(((HttpResponse) rejectedResult).getCode()).isEqualTo(HttpStatus.SERVICE_UNAVAILABLE.value()); this.webServer.stop(); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java index 832663f6e8..bdfeefa691 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java @@ -37,10 +37,10 @@ import java.security.cert.X509Certificate; import java.time.Duration; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.Date; import java.util.EnumSet; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -51,6 +51,7 @@ import java.util.concurrent.Callable; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; import java.util.concurrent.RunnableFuture; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Supplier; @@ -78,20 +79,23 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import org.apache.catalina.webresources.TomcatURLStreamHandlerFactory; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.entity.InputStreamFactory; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.protocol.HttpClientContext; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.impl.client.StandardHttpRequestRetryHandler; -import org.apache.http.protocol.HttpContext; -import org.apache.http.ssl.SSLContextBuilder; -import org.apache.http.ssl.TrustStrategy; +import org.apache.hc.client5.http.classic.HttpClient; +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.entity.InputStreamFactory; +import org.apache.hc.client5.http.impl.DefaultHttpRequestRetryStrategy; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; +import org.apache.hc.client5.http.protocol.HttpClientContext; +import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory; +import org.apache.hc.client5.http.ssl.TrustSelfSignedStrategy; +import org.apache.hc.core5.http.HttpResponse; +import org.apache.hc.core5.http.io.HttpClientResponseHandler; +import org.apache.hc.core5.http.protocol.HttpContext; +import org.apache.hc.core5.ssl.SSLContextBuilder; +import org.apache.hc.core5.ssl.TrustStrategy; +import org.apache.hc.core5.util.TimeValue; import org.apache.jasper.EmbeddedServletOptions; import org.apache.jasper.servlet.JspServlet; import org.assertj.core.api.ThrowableAssert.ThrowingCallable; @@ -178,23 +182,7 @@ public abstract class AbstractServletWebServerFactoryTests { private final HttpClientContext httpClientContext = HttpClientContext.create(); private final Supplier httpClientBuilder = () -> HttpClients.custom() - .setRetryHandler(new StandardHttpRequestRetryHandler(10, false) { - - @Override - public boolean retryRequest(IOException exception, int executionCount, HttpContext context) { - boolean retry = super.retryRequest(exception, executionCount, context); - if (retry) { - try { - Thread.sleep(200); - } - catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - } - } - return retry; - } - - }); + .setRetryStrategy(new DefaultHttpRequestRetryStrategy(10, TimeValue.of(200, TimeUnit.MILLISECONDS))); @AfterEach void tearDown() { @@ -446,8 +434,7 @@ public abstract class AbstractServletWebServerFactoryTests { this.webServer.start(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build()); - HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); - HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); + HttpComponentsClientHttpRequestFactory requestFactory = createHttpComponentsRequestFactory(socketFactory); assertThatExceptionOfType(SSLException.class) .isThrownBy(() -> getResponse(getLocalUrl("https", "/hello"), requestFactory)); } @@ -460,8 +447,7 @@ public abstract class AbstractServletWebServerFactoryTests { this.webServer.start(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build()); - HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); - HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); + HttpComponentsClientHttpRequestFactory requestFactory = createHttpComponentsRequestFactory(socketFactory); assertThat(getResponse(getLocalUrl("https", "/hello"), requestFactory)).contains("scheme=https"); } @@ -476,8 +462,9 @@ public abstract class AbstractServletWebServerFactoryTests { this.webServer.start(); TrustStrategy trustStrategy = new SerialNumberValidatingTrustSelfSignedStrategy("3a3aaec8"); SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, trustStrategy).build(); - HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(new SSLConnectionSocketFactory(sslContext)) - .build(); + PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create() + .setSSLSocketFactory(new SSLConnectionSocketFactory(sslContext)).build(); + HttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).build(); String response = getResponse(getLocalUrl("https", "/hello"), new HttpComponentsClientHttpRequestFactory(httpClient)); assertThat(response).contains("scheme=https"); @@ -506,7 +493,9 @@ public abstract class AbstractServletWebServerFactoryTests { this.webServer.start(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build()); - HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); + PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create() + .setSSLSocketFactory(socketFactory).build(); + HttpClient httpClient = this.httpClientBuilder.get().setConnectionManager(connectionManager).build(); ClientHttpResponse response = getClientResponse(getLocalUrl("https", "/hello"), HttpMethod.GET, new HttpComponentsClientHttpRequestFactory(httpClient)); assertThat(response.getHeaders().get("Server")).isNullOrEmpty(); @@ -521,8 +510,9 @@ public abstract class AbstractServletWebServerFactoryTests { this.webServer.start(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build()); - HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory) - .setRetryHandler(new DefaultHttpRequestRetryHandler(10, false)).build(); + PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create() + .setSSLSocketFactory(socketFactory).build(); + HttpClient httpClient = this.httpClientBuilder.get().setConnectionManager(connectionManager).build(); ClientHttpResponse response = getClientResponse(getLocalUrl("https", "/hello"), HttpMethod.GET, new HttpComponentsClientHttpRequestFactory(httpClient)); assertThat(response.getHeaders().get("Server")).containsExactly("MyServer"); @@ -536,8 +526,7 @@ public abstract class AbstractServletWebServerFactoryTests { this.webServer.start(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build()); - HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); - HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); + HttpComponentsClientHttpRequestFactory requestFactory = createHttpComponentsRequestFactory(socketFactory); assertThat(getResponse(getLocalUrl("https", "/test.txt"), requestFactory)).isEqualTo("test"); } @@ -553,8 +542,7 @@ public abstract class AbstractServletWebServerFactoryTests { SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()) .loadKeyMaterial(keyStore, "secret".toCharArray()).build()); - HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); - HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); + HttpComponentsClientHttpRequestFactory requestFactory = createHttpComponentsRequestFactory(socketFactory); assertThat(getResponse(getLocalUrl("https", "/test.txt"), requestFactory)).isEqualTo("test"); } @@ -570,8 +558,7 @@ public abstract class AbstractServletWebServerFactoryTests { SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()) .loadKeyMaterial(keyStore, "secret".toCharArray()).build()); - HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); - HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); + HttpComponentsClientHttpRequestFactory requestFactory = createHttpComponentsRequestFactory(socketFactory); assertThat(getResponse(getLocalUrl("https", "/test.txt"), requestFactory)).isEqualTo("test"); } @@ -588,8 +575,7 @@ public abstract class AbstractServletWebServerFactoryTests { SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()) .loadKeyMaterial(keyStore, "password".toCharArray()).build()); - HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); - HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); + HttpComponentsClientHttpRequestFactory requestFactory = createHttpComponentsRequestFactory(socketFactory); assertThat(getResponse(getLocalUrl("https", "/test.txt"), requestFactory)).isEqualTo("test"); } @@ -602,8 +588,7 @@ public abstract class AbstractServletWebServerFactoryTests { this.webServer.start(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build()); - HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); - HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); + HttpComponentsClientHttpRequestFactory requestFactory = createHttpComponentsRequestFactory(socketFactory); String localUrl = getLocalUrl("https", "/test.txt"); assertThatIOException().isThrownBy(() -> getResponse(localUrl, requestFactory)); } @@ -621,8 +606,7 @@ public abstract class AbstractServletWebServerFactoryTests { SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()) .loadKeyMaterial(keyStore, "password".toCharArray()).build()); - HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); - HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); + HttpComponentsClientHttpRequestFactory requestFactory = createHttpComponentsRequestFactory(socketFactory); assertThat(getResponse(getLocalUrl("https", "/test.txt"), requestFactory)).isEqualTo("test"); } @@ -635,8 +619,7 @@ public abstract class AbstractServletWebServerFactoryTests { this.webServer.start(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build()); - HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); - HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); + HttpComponentsClientHttpRequestFactory requestFactory = createHttpComponentsRequestFactory(socketFactory); assertThat(getResponse(getLocalUrl("https", "/test.txt"), requestFactory)).isEqualTo("test"); } @@ -659,8 +642,7 @@ public abstract class AbstractServletWebServerFactoryTests { SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()) .loadKeyMaterial(keyStore, "password".toCharArray()).build()); - HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); - HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); + HttpComponentsClientHttpRequestFactory requestFactory = createHttpComponentsRequestFactory(socketFactory); assertThat(getResponse(getLocalUrl("https", "/test.txt"), requestFactory)).isEqualTo("test"); then(sslStoreProvider).should(atLeastOnce()).getKeyStore(); then(sslStoreProvider).should(atLeastOnce()).getTrustStore(); @@ -742,11 +724,19 @@ public abstract class AbstractServletWebServerFactoryTests { this.webServer.start(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build()); - HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); - HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); + HttpComponentsClientHttpRequestFactory requestFactory = createHttpComponentsRequestFactory(socketFactory); assertThat(getResponse(getLocalUrl("https", "/hello"), requestFactory)).contains("scheme=https"); } + private HttpComponentsClientHttpRequestFactory createHttpComponentsRequestFactory( + SSLConnectionSocketFactory socketFactory) { + PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create() + .setSSLSocketFactory(socketFactory).build(); + HttpClient httpClient = this.httpClientBuilder.get().setConnectionManager(connectionManager).build(); + HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); + return requestFactory; + } + private String getStoreType(String keyStore) { return keyStore.endsWith(".p12") ? "pkcs12" : null; } @@ -938,7 +928,8 @@ public abstract class AbstractServletWebServerFactoryTests { this.webServer = factory.getWebServer(new ServletRegistrationBean<>(new ExampleServlet(false, true), "/hello")); this.webServer.start(); TestGzipInputStreamFactory inputStreamFactory = new TestGzipInputStreamFactory(); - Map contentDecoderMap = Collections.singletonMap("gzip", inputStreamFactory); + LinkedHashMap contentDecoderMap = new LinkedHashMap<>(); + contentDecoderMap.put("gzip", inputStreamFactory); getResponse(getLocalUrl("/hello"), new HttpComponentsClientHttpRequestFactory( this.httpClientBuilder.get().setContentDecoderRegistry(contentDecoderMap).build())); assertThat(inputStreamFactory.wasCompressionUsed()).isTrue(); @@ -1267,9 +1258,11 @@ public abstract class AbstractServletWebServerFactoryTests { protected Future initiateGetRequest(HttpClient httpClient, int port, String path) { RunnableFuture getRequest = new FutureTask<>(() -> { try { - HttpResponse response = httpClient.execute(new HttpGet("http://localhost:" + port + path)); - response.getEntity().getContent().close(); - return response; + return httpClient.execute(new HttpGet("http://localhost:" + port + path), + (HttpClientResponseHandler) (response) -> { + response.getEntity().getContent().close(); + return response; + }); } catch (Exception ex) { return ex; @@ -1306,7 +1299,8 @@ public abstract class AbstractServletWebServerFactoryTests { HttpMethod method) throws Exception { String testContent = setUpFactoryForCompression(contentSize, mimeTypes, excludedUserAgents); TestGzipInputStreamFactory inputStreamFactory = new TestGzipInputStreamFactory(); - Map contentDecoderMap = Collections.singletonMap("gzip", inputStreamFactory); + LinkedHashMap contentDecoderMap = new LinkedHashMap<>(); + contentDecoderMap.put("gzip", inputStreamFactory); String response = getResponse(getLocalUrl("/test.txt"), method, new HttpComponentsClientHttpRequestFactory(HttpClientBuilder.create().setUserAgent("testUserAgent") .setContentDecoderRegistry(contentDecoderMap).build())); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/webservices/client/HttpWebServiceMessageSenderBuilderOkHttp3IntegrationTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/webservices/client/HttpWebServiceMessageSenderBuilderOkHttp3IntegrationTests.java index ca0714134b..1036366712 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/webservices/client/HttpWebServiceMessageSenderBuilderOkHttp3IntegrationTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/webservices/client/HttpWebServiceMessageSenderBuilderOkHttp3IntegrationTests.java @@ -36,7 +36,7 @@ import static org.assertj.core.api.Assertions.assertThat; * * @author Stephane Nicoll */ -@ClassPathExclusions("httpclient-*.jar") +@ClassPathExclusions("httpclient5-*.jar") class HttpWebServiceMessageSenderBuilderOkHttp3IntegrationTests { private final HttpWebServiceMessageSenderBuilder builder = new HttpWebServiceMessageSenderBuilder(); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/webservices/client/HttpWebServiceMessageSenderBuilderSimpleIntegrationTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/webservices/client/HttpWebServiceMessageSenderBuilderSimpleIntegrationTests.java index d65082cfba..11813f57b2 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/webservices/client/HttpWebServiceMessageSenderBuilderSimpleIntegrationTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/webservices/client/HttpWebServiceMessageSenderBuilderSimpleIntegrationTests.java @@ -34,7 +34,7 @@ import static org.assertj.core.api.Assertions.assertThat; * * @author Stephane Nicoll */ -@ClassPathExclusions({ "httpclient-*.jar", "okhttp*.jar" }) +@ClassPathExclusions({ "httpclient5-*.jar", "okhttp*.jar" }) class HttpWebServiceMessageSenderBuilderSimpleIntegrationTests { private final HttpWebServiceMessageSenderBuilder builder = new HttpWebServiceMessageSenderBuilder(); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/webservices/client/HttpWebServiceMessageSenderBuilderTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/webservices/client/HttpWebServiceMessageSenderBuilderTests.java index 8a625255f9..f4de70a23c 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/webservices/client/HttpWebServiceMessageSenderBuilderTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/webservices/client/HttpWebServiceMessageSenderBuilderTests.java @@ -18,13 +18,11 @@ package org.springframework.boot.webservices.client; import java.time.Duration; -import org.apache.http.client.config.RequestConfig; import org.junit.jupiter.api.Test; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.client.SimpleClientHttpRequestFactory; -import org.springframework.test.util.ReflectionTestUtils; import org.springframework.ws.transport.WebServiceMessageSender; import org.springframework.ws.transport.http.ClientHttpRequestMessageSender; @@ -59,14 +57,10 @@ class HttpWebServiceMessageSenderBuilderTests { @Test void buildUsesHttpComponentsByDefault() { - ClientHttpRequestMessageSender messageSender = build(new HttpWebServiceMessageSenderBuilder() - .setConnectTimeout(Duration.ofSeconds(5)).setReadTimeout(Duration.ofSeconds(2))); + ClientHttpRequestMessageSender messageSender = build( + new HttpWebServiceMessageSenderBuilder().setConnectTimeout(Duration.ofSeconds(5))); ClientHttpRequestFactory requestFactory = messageSender.getRequestFactory(); assertThat(requestFactory).isInstanceOf(HttpComponentsClientHttpRequestFactory.class); - RequestConfig requestConfig = (RequestConfig) ReflectionTestUtils.getField(requestFactory, "requestConfig"); - assertThat(requestConfig).isNotNull(); - assertThat(requestConfig.getConnectTimeout()).isEqualTo(5000); - assertThat(requestConfig.getSocketTimeout()).isEqualTo(2000); } private ClientHttpRequestMessageSender build(HttpWebServiceMessageSenderBuilder builder) { diff --git a/spring-boot-system-tests/spring-boot-deployment-tests/src/systemTest/java/org/springframework/boot/deployment/AbstractDeploymentTests.java b/spring-boot-system-tests/spring-boot-deployment-tests/src/systemTest/java/org/springframework/boot/deployment/AbstractDeploymentTests.java index fa79709ba5..b02a6d26b4 100644 --- a/spring-boot-system-tests/spring-boot-deployment-tests/src/systemTest/java/org/springframework/boot/deployment/AbstractDeploymentTests.java +++ b/spring-boot-system-tests/spring-boot-deployment-tests/src/systemTest/java/org/springframework/boot/deployment/AbstractDeploymentTests.java @@ -18,10 +18,12 @@ package org.springframework.boot.deployment; import java.io.File; import java.time.Duration; +import java.util.concurrent.TimeUnit; import java.util.function.Consumer; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.impl.client.StandardHttpRequestRetryHandler; +import org.apache.hc.client5.http.impl.DefaultHttpRequestRetryStrategy; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.util.TimeValue; import org.awaitility.Awaitility; import org.awaitility.core.ConditionTimeoutException; import org.junit.jupiter.api.Test; @@ -96,7 +98,9 @@ abstract class AbstractDeploymentTests { .rootUri("http://" + this.container.getHost() + ":" + this.container.getMappedPort(this.port) + "/spring-boot") .requestFactory(() -> new HttpComponentsClientHttpRequestFactory(HttpClients.custom() - .setRetryHandler(new StandardHttpRequestRetryHandler(10, false)).build()))); + .setRetryStrategy( + new DefaultHttpRequestRetryStrategy(10, TimeValue.of(1, TimeUnit.SECONDS))) + .build()))); try { Awaitility.await().atMost(Duration.ofMinutes(10)).until(() -> { try { diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/intTest/java/org/springframework/boot/context/embedded/EmbeddedServerContainerInvocationContextProvider.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/intTest/java/org/springframework/boot/context/embedded/EmbeddedServerContainerInvocationContextProvider.java index 5b779de775..87aedcb18d 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/intTest/java/org/springframework/boot/context/embedded/EmbeddedServerContainerInvocationContextProvider.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/intTest/java/org/springframework/boot/context/embedded/EmbeddedServerContainerInvocationContextProvider.java @@ -28,10 +28,12 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.concurrent.TimeUnit; import java.util.stream.Stream; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.impl.client.StandardHttpRequestRetryHandler; +import org.apache.hc.client5.http.impl.DefaultHttpRequestRetryStrategy; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.util.TimeValue; import org.junit.jupiter.api.extension.AfterAllCallback; import org.junit.jupiter.api.extension.Extension; import org.junit.jupiter.api.extension.ExtensionContext; @@ -178,8 +180,9 @@ class EmbeddedServerContainerInvocationContextProvider @Override public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) { - RestTemplate rest = new RestTemplate(new HttpComponentsClientHttpRequestFactory( - HttpClients.custom().setRetryHandler(new StandardHttpRequestRetryHandler(10, false)).build())); + RestTemplate rest = new RestTemplate(new HttpComponentsClientHttpRequestFactory(HttpClients.custom() + .setRetryStrategy(new DefaultHttpRequestRetryStrategy(10, TimeValue.of(1, TimeUnit.SECONDS))) + .build())); rest.setErrorHandler(new ResponseErrorHandler() { @Override