Skip to content

Commit 336e7de

Browse files
committed
Add with methods to apply pre-packaged customizations
Add `with` methods to `HttpRequestFactoryBuilder` and `ClientHttpConnectorBuilder` that operate in a similar way to the `WebClient.Builder.apply(...)` method. Closes gh-47205
1 parent e9c08b8 commit 336e7de

17 files changed

+181
-0
lines changed

module/spring-boot-http-client/src/main/java/org/springframework/boot/http/client/HttpComponentsClientHttpRequestFactoryBuilder.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.Collection;
2121
import java.util.List;
2222
import java.util.function.Consumer;
23+
import java.util.function.UnaryOperator;
2324

2425
import org.apache.hc.client5.http.classic.HttpClient;
2526
import org.apache.hc.client5.http.config.RequestConfig;
@@ -143,6 +144,18 @@ public HttpComponentsClientHttpRequestFactoryBuilder withDefaultRequestConfigCus
143144
this.httpClientBuilder.withDefaultRequestConfigCustomizer(defaultRequestConfigCustomizer));
144145
}
145146

147+
/**
148+
* Return a new {@link HttpComponentsClientHttpRequestFactoryBuilder} that applies the
149+
* given customizer. This can be useful for applying pre-packaged customizations.
150+
* @param customizer the customizer to apply
151+
* @return a new {@link HttpComponentsClientHttpRequestFactoryBuilder}
152+
* @since 4.0.0
153+
*/
154+
public HttpComponentsClientHttpRequestFactoryBuilder with(
155+
UnaryOperator<HttpComponentsClientHttpRequestFactoryBuilder> customizer) {
156+
return customizer.apply(this);
157+
}
158+
146159
@Override
147160
protected HttpComponentsClientHttpRequestFactory createClientHttpRequestFactory(
148161
ClientHttpRequestFactorySettings settings) {

module/spring-boot-http-client/src/main/java/org/springframework/boot/http/client/JdkClientHttpRequestFactoryBuilder.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.List;
2222
import java.util.concurrent.Executor;
2323
import java.util.function.Consumer;
24+
import java.util.function.UnaryOperator;
2425

2526
import org.jspecify.annotations.Nullable;
2627

@@ -88,6 +89,17 @@ public JdkClientHttpRequestFactoryBuilder withHttpClientCustomizer(
8889
this.httpClientBuilder.withCustomizer(httpClientCustomizer));
8990
}
9091

92+
/**
93+
* Return a new {@link JdkClientHttpRequestFactoryBuilder} that applies the given
94+
* customizer. This can be useful for applying pre-packaged customizations.
95+
* @param customizer the customizer to apply
96+
* @return a new {@link JdkClientHttpRequestFactoryBuilder}
97+
* @since 4.0.0
98+
*/
99+
public JdkClientHttpRequestFactoryBuilder with(UnaryOperator<JdkClientHttpRequestFactoryBuilder> customizer) {
100+
return customizer.apply(this);
101+
}
102+
91103
@Override
92104
protected JdkClientHttpRequestFactory createClientHttpRequestFactory(ClientHttpRequestFactorySettings settings) {
93105
HttpClient httpClient = this.httpClientBuilder.build(asHttpClientSettings(settings.withReadTimeout(null)));

module/spring-boot-http-client/src/main/java/org/springframework/boot/http/client/JettyClientHttpRequestFactoryBuilder.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.Collection;
2121
import java.util.List;
2222
import java.util.function.Consumer;
23+
import java.util.function.UnaryOperator;
2324

2425
import org.eclipse.jetty.client.HttpClient;
2526
import org.eclipse.jetty.client.HttpClientTransport;
@@ -103,6 +104,17 @@ public JettyClientHttpRequestFactoryBuilder withClientConnectorCustomizerCustomi
103104
this.httpClientBuilder.withClientConnectorCustomizerCustomizer(clientConnectorCustomizerCustomizer));
104105
}
105106

107+
/**
108+
* Return a new {@link JettyClientHttpRequestFactoryBuilder} that applies the given
109+
* customizer. This can be useful for applying pre-packaged customizations.
110+
* @param customizer the customizer to apply
111+
* @return a new {@link JettyClientHttpRequestFactoryBuilder}
112+
* @since 4.0.0
113+
*/
114+
public JettyClientHttpRequestFactoryBuilder with(UnaryOperator<JettyClientHttpRequestFactoryBuilder> customizer) {
115+
return customizer.apply(this);
116+
}
117+
106118
@Override
107119
protected JettyClientHttpRequestFactory createClientHttpRequestFactory(ClientHttpRequestFactorySettings settings) {
108120
HttpClient httpClient = this.httpClientBuilder.build(asHttpClientSettings(settings.withTimeouts(null, null)));

module/spring-boot-http-client/src/main/java/org/springframework/boot/http/client/ReactorClientHttpRequestFactoryBuilder.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,18 @@ public ReactorClientHttpRequestFactoryBuilder withHttpClientCustomizer(
107107
this.httpClientBuilder.withHttpClientCustomizer(httpClientCustomizer));
108108
}
109109

110+
/**
111+
* Return a new {@link ReactorClientHttpRequestFactoryBuilder} that applies the given
112+
* customizer. This can be useful for applying pre-packaged customizations.
113+
* @param customizer the customizer to apply
114+
* @return a new {@link ReactorClientHttpRequestFactoryBuilder}
115+
* @since 4.0.0
116+
*/
117+
public ReactorClientHttpRequestFactoryBuilder with(
118+
UnaryOperator<ReactorClientHttpRequestFactoryBuilder> customizer) {
119+
return customizer.apply(this);
120+
}
121+
110122
@Override
111123
protected ReactorClientHttpRequestFactory createClientHttpRequestFactory(
112124
ClientHttpRequestFactorySettings settings) {

module/spring-boot-http-client/src/main/java/org/springframework/boot/http/client/SimpleClientHttpRequestFactoryBuilder.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Collection;
2323
import java.util.List;
2424
import java.util.function.Consumer;
25+
import java.util.function.UnaryOperator;
2526

2627
import javax.net.ssl.HttpsURLConnection;
2728
import javax.net.ssl.SSLSocketFactory;
@@ -64,6 +65,17 @@ public SimpleClientHttpRequestFactoryBuilder withCustomizers(
6465
return new SimpleClientHttpRequestFactoryBuilder(mergedCustomizers(customizers));
6566
}
6667

68+
/**
69+
* Return a new {@link SimpleClientHttpRequestFactoryBuilder} that applies the given
70+
* customizer. This can be useful for applying pre-packaged customizations.
71+
* @param customizer the customizer to apply
72+
* @return a new {@link SimpleClientHttpRequestFactoryBuilder}
73+
* @since 4.0.0
74+
*/
75+
public SimpleClientHttpRequestFactoryBuilder with(UnaryOperator<SimpleClientHttpRequestFactoryBuilder> customizer) {
76+
return customizer.apply(this);
77+
}
78+
6779
@Override
6880
protected SimpleClientHttpRequestFactory createClientHttpRequestFactory(ClientHttpRequestFactorySettings settings) {
6981
SslBundle sslBundle = settings.sslBundle();

module/spring-boot-http-client/src/main/java/org/springframework/boot/http/client/reactive/HttpComponentsClientHttpConnectorBuilder.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.List;
2020
import java.util.function.Consumer;
2121
import java.util.function.Function;
22+
import java.util.function.UnaryOperator;
2223

2324
import org.apache.hc.client5.http.config.ConnectionConfig;
2425
import org.apache.hc.client5.http.config.RequestConfig;
@@ -126,6 +127,18 @@ public HttpComponentsClientHttpConnectorBuilder withDefaultRequestConfigCustomiz
126127
this.httpClientBuilder.withDefaultRequestConfigCustomizer(defaultRequestConfigCustomizer));
127128
}
128129

130+
/**
131+
* Return a new {@link HttpComponentsClientHttpConnectorBuilder} that applies the
132+
* given customizer. This can be useful for applying pre-packaged customizations.
133+
* @param customizer the customizer to apply
134+
* @return a new {@link HttpComponentsClientHttpConnectorBuilder}
135+
* @since 4.0.0
136+
*/
137+
public HttpComponentsClientHttpConnectorBuilder with(
138+
UnaryOperator<HttpComponentsClientHttpConnectorBuilder> customizer) {
139+
return customizer.apply(this);
140+
}
141+
129142
@Override
130143
protected HttpComponentsClientHttpConnector createClientHttpConnector(ClientHttpConnectorSettings settings) {
131144
CloseableHttpAsyncClient client = this.httpClientBuilder.build(asHttpClientSettings(settings));

module/spring-boot-http-client/src/main/java/org/springframework/boot/http/client/reactive/JdkClientHttpConnectorBuilder.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.List;
2222
import java.util.concurrent.Executor;
2323
import java.util.function.Consumer;
24+
import java.util.function.UnaryOperator;
2425

2526
import org.jspecify.annotations.Nullable;
2627

@@ -83,6 +84,17 @@ public JdkClientHttpConnectorBuilder withHttpClientCustomizer(Consumer<HttpClien
8384
this.httpClientBuilder.withCustomizer(httpClientCustomizer));
8485
}
8586

87+
/**
88+
* Return a new {@link JdkClientHttpConnectorBuilder} that applies the given
89+
* customizer. This can be useful for applying pre-packaged customizations.
90+
* @param customizer the customizer to apply
91+
* @return a new {@link JdkClientHttpConnectorBuilder}
92+
* @since 4.0.0
93+
*/
94+
public JdkClientHttpConnectorBuilder with(UnaryOperator<JdkClientHttpConnectorBuilder> customizer) {
95+
return customizer.apply(this);
96+
}
97+
8698
@Override
8799
protected JdkClientHttpConnector createClientHttpConnector(ClientHttpConnectorSettings settings) {
88100
HttpClient httpClient = this.httpClientBuilder.build(asHttpClientSettings(settings.withReadTimeout(null)));

module/spring-boot-http-client/src/main/java/org/springframework/boot/http/client/reactive/JettyClientHttpConnectorBuilder.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.Collection;
2020
import java.util.List;
2121
import java.util.function.Consumer;
22+
import java.util.function.UnaryOperator;
2223

2324
import org.eclipse.jetty.client.HttpClient;
2425
import org.eclipse.jetty.client.HttpClientTransport;
@@ -99,6 +100,17 @@ public JettyClientHttpConnectorBuilder withClientConnectorCustomizerCustomizer(
99100
this.httpClientBuilder.withClientConnectorCustomizerCustomizer(clientConnectorCustomizerCustomizer));
100101
}
101102

103+
/**
104+
* Return a new {@link JettyClientHttpConnectorBuilder} that applies the given
105+
* customizer. This can be useful for applying pre-packaged customizations.
106+
* @param customizer the customizer to apply
107+
* @return a new {@link JettyClientHttpConnectorBuilder}
108+
* @since 4.0.0
109+
*/
110+
public JettyClientHttpConnectorBuilder with(UnaryOperator<JettyClientHttpConnectorBuilder> customizer) {
111+
return customizer.apply(this);
112+
}
113+
102114
@Override
103115
protected JettyClientHttpConnector createClientHttpConnector(ClientHttpConnectorSettings settings) {
104116
HttpClient httpClient = this.httpClientBuilder.build(asHttpClientSettings(settings));

module/spring-boot-http-client/src/main/java/org/springframework/boot/http/client/reactive/ReactorClientHttpConnectorBuilder.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,17 @@ public ReactorClientHttpConnectorBuilder withHttpClientCustomizer(UnaryOperator<
9999
this.httpClientBuilder.withHttpClientCustomizer(httpClientCustomizer));
100100
}
101101

102+
/**
103+
* Return a new {@link ReactorClientHttpConnectorBuilder} that applies the given
104+
* customizer. This can be useful for applying pre-packaged customizations.
105+
* @param customizer the customizer to apply
106+
* @return a new {@link ReactorClientHttpConnectorBuilder}
107+
* @since 4.0.0
108+
*/
109+
public ReactorClientHttpConnectorBuilder with(UnaryOperator<ReactorClientHttpConnectorBuilder> customizer) {
110+
return customizer.apply(this);
111+
}
112+
102113
@Override
103114
protected ReactorClientHttpConnector createClientHttpConnector(ClientHttpConnectorSettings settings) {
104115
HttpClient httpClient = this.httpClientBuilder.build(asHttpClientSettings(settings));

module/spring-boot-http-client/src/test/java/org/springframework/boot/http/client/HttpComponentsClientHttpRequestFactoryBuilderTests.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,15 @@ void withTlsSocketStrategyFactory() {
9292
assertThat(bundles).contains(settings.sslBundle());
9393
}
9494

95+
@Test
96+
void with() {
97+
TestCustomizer<HttpClientBuilder> customizer = new TestCustomizer<>();
98+
ClientHttpRequestFactoryBuilder.httpComponents()
99+
.with((builder) -> builder.withHttpClientCustomizer(customizer))
100+
.build();
101+
customizer.assertCalled();
102+
}
103+
95104
@Override
96105
protected long connectTimeout(HttpComponentsClientHttpRequestFactory requestFactory) {
97106
return (long) ReflectionTestUtils.getField(requestFactory, "connectTimeout");

0 commit comments

Comments
 (0)