Apply SslConfigurer in addition to configured mappers

Update `ReactorClientHttpConnectorFactory` to that SSL configuration
is applied in addition to any configured mappers.

Prior to this commit, SSL configuration would prevent configured
mappers from being applied.

See gh-35914
This commit is contained in:
Fernando Cappi 2023-06-15 17:20:02 +01:00 committed by Phillip Webb
parent b770ffc160
commit e6b5322f3e
2 changed files with 15 additions and 8 deletions

View File

@ -55,14 +55,14 @@ class ReactorClientHttpConnectorFactory implements ClientHttpConnectorFactory<Re
@Override
public ReactorClientHttpConnector createClientHttpConnector(SslBundle sslBundle) {
ReactorNettyHttpClientMapper mapper = this.mappers.get()
.reduce((before, after) -> (client) -> after.configure(before.configure(client)))
.orElse((client) -> client);
if (sslBundle != null) {
mapper = new SslConfigurer(sslBundle)::configure;
}
return new ReactorClientHttpConnector(this.reactorResourceFactory, mapper::configure);
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);
}
/**

View File

@ -24,6 +24,10 @@ import org.eclipse.jetty.util.thread.Scheduler;
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 @@ class ClientHttpConnectorFactoryConfigurationTests {
@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();
});
}