26
26
import java .util .function .Supplier ;
27
27
28
28
import javax .net .ssl .HttpsURLConnection ;
29
+ import javax .net .ssl .SSLContext ;
29
30
import javax .net .ssl .SSLSocketFactory ;
30
31
import javax .net .ssl .TrustManager ;
31
32
import javax .net .ssl .X509TrustManager ;
38
39
import org .apache .hc .client5 .http .ssl .DefaultHostnameVerifier ;
39
40
import org .apache .hc .client5 .http .ssl .SSLConnectionSocketFactory ;
40
41
import org .apache .hc .core5 .http .io .SocketConfig ;
42
+ import org .eclipse .jetty .client .dynamic .HttpClientTransportDynamic ;
43
+ import org .eclipse .jetty .io .ClientConnector ;
44
+ import org .eclipse .jetty .util .ssl .SslContextFactory ;
41
45
42
46
import org .springframework .boot .context .properties .PropertyMapper ;
43
47
import org .springframework .boot .ssl .SslBundle ;
44
48
import org .springframework .boot .ssl .SslOptions ;
45
49
import org .springframework .http .client .AbstractClientHttpRequestFactoryWrapper ;
46
50
import org .springframework .http .client .ClientHttpRequestFactory ;
47
51
import org .springframework .http .client .HttpComponentsClientHttpRequestFactory ;
52
+ import org .springframework .http .client .JettyClientHttpRequestFactory ;
48
53
import org .springframework .http .client .OkHttp3ClientHttpRequestFactory ;
49
54
import org .springframework .http .client .SimpleClientHttpRequestFactory ;
50
55
import org .springframework .util .Assert ;
@@ -70,6 +75,10 @@ public final class ClientHttpRequestFactories {
70
75
71
76
private static final boolean OKHTTP_CLIENT_PRESENT = ClassUtils .isPresent (OKHTTP_CLIENT_CLASS , null );
72
77
78
+ static final String JETTY_CLIENT_CLASS = "org.eclipse.jetty.client.HttpClient" ;
79
+
80
+ private static final boolean JETTY_CLIENT_PRESENT = ClassUtils .isPresent (JETTY_CLIENT_CLASS , null );
81
+
73
82
private ClientHttpRequestFactories () {
74
83
}
75
84
@@ -87,6 +96,9 @@ public static ClientHttpRequestFactory get(ClientHttpRequestFactorySettings sett
87
96
if (OKHTTP_CLIENT_PRESENT ) {
88
97
return OkHttp .get (settings );
89
98
}
99
+ if (JETTY_CLIENT_PRESENT ) {
100
+ return Jetty .get (settings );
101
+ }
90
102
return Simple .get (settings );
91
103
}
92
104
@@ -111,6 +123,9 @@ public static <T extends ClientHttpRequestFactory> T get(Class<T> requestFactory
111
123
if (requestFactoryType == OkHttp3ClientHttpRequestFactory .class ) {
112
124
return (T ) OkHttp .get (settings );
113
125
}
126
+ if (requestFactoryType == JettyClientHttpRequestFactory .class ) {
127
+ return (T ) Jetty .get (settings );
128
+ }
114
129
if (requestFactoryType == SimpleClientHttpRequestFactory .class ) {
115
130
return (T ) Simple .get (settings );
116
131
}
@@ -210,6 +225,37 @@ private static OkHttp3ClientHttpRequestFactory createRequestFactory(SslBundle ss
210
225
211
226
}
212
227
228
+ /**
229
+ * Support for {@link JettyClientHttpRequestFactory}.
230
+ */
231
+ static class Jetty {
232
+
233
+ static JettyClientHttpRequestFactory get (ClientHttpRequestFactorySettings settings ) {
234
+ JettyClientHttpRequestFactory requestFactory = createRequestFactory (settings .sslBundle ());
235
+ PropertyMapper map = PropertyMapper .get ().alwaysApplyingWhenNonNull ();
236
+ map .from (settings ::connectTimeout ).asInt (Duration ::toMillis ).to (requestFactory ::setConnectTimeout );
237
+ map .from (settings ::readTimeout ).asInt (Duration ::toMillis ).to (requestFactory ::setReadTimeout );
238
+ return requestFactory ;
239
+ }
240
+
241
+ private static JettyClientHttpRequestFactory createRequestFactory (SslBundle sslBundle ) {
242
+ if (sslBundle != null ) {
243
+ SSLContext sslContext = sslBundle .createSslContext ();
244
+
245
+ SslContextFactory .Client sslContextFactory = new SslContextFactory .Client ();
246
+ sslContextFactory .setSslContext (sslContext );
247
+
248
+ ClientConnector connector = new ClientConnector ();
249
+ connector .setSslContextFactory (sslContextFactory );
250
+ org .eclipse .jetty .client .HttpClient httpClient =
251
+ new org .eclipse .jetty .client .HttpClient (new HttpClientTransportDynamic (connector ));
252
+ return new JettyClientHttpRequestFactory (httpClient );
253
+ }
254
+ return new JettyClientHttpRequestFactory ();
255
+ }
256
+
257
+ }
258
+
213
259
/**
214
260
* Support for {@link SimpleClientHttpRequestFactory}.
215
261
*/
0 commit comments