From 837bd759e140c63b743666164d1d2e8c566bbead Mon Sep 17 00:00:00 2001 From: Fernando Cappi <3818944+fcappi@users.noreply.github.com> Date: Thu, 15 Jun 2023 17:20:02 +0100 Subject: [PATCH 1/2] Apply SslConfigurer on previously configured HttpClient --- .../function/client/ReactorClientHttpConnectorFactory.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ReactorClientHttpConnectorFactory.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ReactorClientHttpConnectorFactory.java index 472614ee999a..24441a09391b 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ReactorClientHttpConnectorFactory.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ReactorClientHttpConnectorFactory.java @@ -59,10 +59,9 @@ public ReactorClientHttpConnector createClientHttpConnector(SslBundle sslBundle) .reduce((before, after) -> (client) -> after.configure(before.configure(client))) .orElse((client) -> client); if (sslBundle != null) { - mapper = new SslConfigurer(sslBundle)::configure; + mapper = (client) -> new SslConfigurer(sslBundle).configure(mapper.configure(client)); } return new ReactorClientHttpConnector(this.reactorResourceFactory, mapper::configure); - } /** From d4d4c75f7452a22e16302775e7d661f361779aba Mon Sep 17 00:00:00 2001 From: Fernando Cappi <3818944+fcappi@users.noreply.github.com> Date: Fri, 16 Jun 2023 17:35:49 +0100 Subject: [PATCH 2/2] Add tests to validate client mapper when using sslBundle --- .../client/ReactorClientHttpConnectorFactory.java | 13 +++++++------ ...lientHttpConnectorFactoryConfigurationTests.java | 9 ++++++++- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ReactorClientHttpConnectorFactory.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ReactorClientHttpConnectorFactory.java index 24441a09391b..256a91d3e5da 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ReactorClientHttpConnectorFactory.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ReactorClientHttpConnectorFactory.java @@ -55,12 +55,13 @@ class ReactorClientHttpConnectorFactory implements ClientHttpConnectorFactory (client) -> after.configure(before.configure(client))) - .orElse((client) -> client); - if (sslBundle != null) { - mapper = (client) -> new SslConfigurer(sslBundle).configure(mapper.configure(client)); - } + final ReactorNettyHttpClientMapper mapper = + Stream.concat( + this.mappers.get(), + Stream.ofNullable(sslBundle != null ? (ReactorNettyHttpClientMapper) new SslConfigurer(sslBundle)::configure : null)) + .reduce((before, after) -> (client) -> after.configure(before.configure(client))) + .orElse((client) -> client); + return new ReactorClientHttpConnector(this.reactorResourceFactory, mapper::configure); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ClientHttpConnectorFactoryConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ClientHttpConnectorFactoryConfigurationTests.java index 234b9d7df04a..4e743f637cd8 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ClientHttpConnectorFactoryConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ClientHttpConnectorFactoryConfigurationTests.java @@ -24,6 +24,10 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.ssl.SslBundle; +import org.springframework.boot.ssl.SslBundleKey; +import org.springframework.boot.ssl.jks.JksSslStoreBundle; +import org.springframework.boot.ssl.jks.JksSslStoreDetails; import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner; import org.springframework.context.annotation.Bean; @@ -80,11 +84,14 @@ private JettyClientHttpConnectorFactory getJettyClientHttpConnectorFactory( @Test void shouldApplyHttpClientMapper() { + JksSslStoreDetails storeDetails = JksSslStoreDetails.forLocation("classpath:test.jks"); + JksSslStoreBundle stores = new JksSslStoreBundle(storeDetails, storeDetails); + SslBundle sslBundle = SslBundle.of(stores, SslBundleKey.of("password")); new ReactiveWebApplicationContextRunner() .withConfiguration(AutoConfigurations.of(ClientHttpConnectorFactoryConfiguration.ReactorNetty.class)) .withUserConfiguration(CustomHttpClientMapper.class) .run((context) -> { - context.getBean(ReactorClientHttpConnectorFactory.class).createClientHttpConnector(); + context.getBean(ReactorClientHttpConnectorFactory.class).createClientHttpConnector(sslBundle); assertThat(CustomHttpClientMapper.called).isTrue(); }); }