Merge branch '3.1.x'

This commit is contained in:
Andy Wilkinson 2023-06-21 19:06:32 +01:00
commit 7f5351c7b0
2 changed files with 24 additions and 5 deletions

View File

@ -241,6 +241,7 @@ public final class ClientHttpRequestFactories {
@Override
protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
super.prepareConnection(connection, httpMethod);
if (this.sslBundle != null && connection instanceof HttpsURLConnection secureConnection) {
SSLSocketFactory socketFactory = this.sslBundle.createSslContext().getSocketFactory();
secureConnection.setSSLSocketFactory(socketFactory);

View File

@ -16,13 +16,20 @@
package org.springframework.boot.web.client;
import java.io.IOException;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import javax.net.ssl.SSLHandshakeException;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.springframework.boot.ssl.SslBundle;
import org.springframework.boot.ssl.SslBundleKey;
@ -94,8 +101,9 @@ abstract class AbstractClientHttpRequestFactoriesTests<T extends ClientHttpReque
assertThat(readTimeout((T) requestFactory)).isEqualTo(Duration.ofSeconds(120).toMillis());
}
@Test
void connectWithSslBundle() throws Exception {
@ParameterizedTest
@CsvSource({ "GET", "POST" })
void connectWithSslBundle(String httpMethod) throws Exception {
TomcatServletWebServerFactory webServerFactory = new TomcatServletWebServerFactory(0);
Ssl ssl = new Ssl();
ssl.setClientAuth(ClientAuth.NEED);
@ -103,7 +111,8 @@ abstract class AbstractClientHttpRequestFactoriesTests<T extends ClientHttpReque
ssl.setKeyStore("classpath:test.jks");
ssl.setTrustStore("classpath:test.jks");
webServerFactory.setSsl(ssl);
WebServer webServer = webServerFactory.getWebServer();
WebServer webServer = webServerFactory
.getWebServer((context) -> context.addServlet("test", TestServlet.class).addMapping("/"));
try {
webServer.start();
int port = webServer.getPort();
@ -118,9 +127,9 @@ abstract class AbstractClientHttpRequestFactoriesTests<T extends ClientHttpReque
SslBundle sslBundle = SslBundle.of(stores, SslBundleKey.of("password"));
ClientHttpRequestFactory secureRequestFactory = ClientHttpRequestFactories
.get(ClientHttpRequestFactorySettings.DEFAULTS.withSslBundle(sslBundle));
ClientHttpRequest secureRequest = secureRequestFactory.createRequest(uri, HttpMethod.GET);
ClientHttpRequest secureRequest = secureRequestFactory.createRequest(uri, HttpMethod.valueOf(httpMethod));
String secureResponse = StreamUtils.copyToString(secureRequest.execute().getBody(), StandardCharsets.UTF_8);
assertThat(secureResponse).contains("HTTP Status 404 Not Found");
assertThat(secureResponse).contains("Received " + httpMethod + " request to /");
}
finally {
webServer.stop();
@ -131,4 +140,13 @@ abstract class AbstractClientHttpRequestFactoriesTests<T extends ClientHttpReque
protected abstract long readTimeout(T requestFactory);
public static class TestServlet extends HttpServlet {
@Override
public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
res.getWriter().println("Received " + req.getMethod() + " request to " + req.getRequestURI());
}
}
}