@@ -150,14 +150,18 @@ public static ClientHttpRequestFactory create(ClientOptions options, SslConfigur
150150 return new SimpleClientHttpRequestFactory ();
151151 }
152152
153- private static SSLContext getSSLContext (SslConfiguration sslConfiguration , TrustManager [] trustManagers )
153+ private static SSLContext getSSLContext (SslConfiguration sslConfiguration )
154154 throws GeneralSecurityException , IOException {
155155
156- KeyConfiguration keyConfiguration = sslConfiguration .getKeyConfiguration ();
157- KeyManager [] keyManagers = sslConfiguration .getKeyStoreConfiguration ().isPresent ()
158- ? createKeyManagerFactory (sslConfiguration .getKeyStoreConfiguration (), keyConfiguration )
159- .getKeyManagers ()
160- : null ;
156+ return getSSLContext (sslConfiguration .getKeyStoreConfiguration (), sslConfiguration .getKeyConfiguration (),
157+ getTrustManagers (sslConfiguration ));
158+ }
159+
160+ static SSLContext getSSLContext (KeyStoreConfiguration keyStoreConfiguration , KeyConfiguration keyConfiguration ,
161+ @ Nullable TrustManager [] trustManagers ) throws GeneralSecurityException , IOException {
162+
163+ KeyManager [] keyManagers = keyStoreConfiguration .isPresent ()
164+ ? createKeyManagerFactory (keyStoreConfiguration , keyConfiguration ).getKeyManagers () : null ;
161165
162166 SSLContext sslContext = SSLContext .getInstance ("TLS" );
163167 sslContext .init (keyManagers , trustManagers , null );
@@ -166,7 +170,7 @@ private static SSLContext getSSLContext(SslConfiguration sslConfiguration, Trust
166170 }
167171
168172 @ Nullable
169- private static TrustManager [] getTrustManagers (SslConfiguration sslConfiguration )
173+ static TrustManager [] getTrustManagers (SslConfiguration sslConfiguration )
170174 throws GeneralSecurityException , IOException {
171175
172176 return sslConfiguration .getTrustStoreConfiguration ().isPresent ()
@@ -282,13 +286,30 @@ static boolean hasSslConfiguration(SslConfiguration sslConfiguration) {
282286 }
283287
284288 /**
285- * {@link ClientHttpRequestFactory} for Apache Http Components.
289+ * Utilities to create a {@link ClientHttpRequestFactory} for Apache Http Components.
286290 *
287291 * @author Mark Paluch
288292 */
289- static class HttpComponents {
293+ public static class HttpComponents {
294+
295+ /**
296+ * Create a {@link ClientHttpRequestFactory} using Apache Http Components.
297+ * @param options must not be {@literal null}
298+ * @param sslConfiguration must not be {@literal null}
299+ * @return a new and configured {@link HttpComponentsClientHttpRequestFactory}
300+ * instance.
301+ * @throws GeneralSecurityException
302+ * @throws IOException
303+ */
304+ public static HttpComponentsClientHttpRequestFactory usingHttpComponents (ClientOptions options ,
305+ SslConfiguration sslConfiguration ) throws GeneralSecurityException , IOException {
306+
307+ HttpClientBuilder httpClientBuilder = getHttpClientBuilder (options , sslConfiguration );
290308
291- static ClientHttpRequestFactory usingHttpComponents (ClientOptions options , SslConfiguration sslConfiguration )
309+ return new HttpComponentsClientHttpRequestFactory (httpClientBuilder .build ());
310+ }
311+
312+ public static HttpClientBuilder getHttpClientBuilder (ClientOptions options , SslConfiguration sslConfiguration )
292313 throws GeneralSecurityException , IOException {
293314
294315 HttpClientBuilder httpClientBuilder = HttpClients .custom ();
@@ -298,7 +319,7 @@ static ClientHttpRequestFactory usingHttpComponents(ClientOptions options, SslCo
298319
299320 if (hasSslConfiguration (sslConfiguration )) {
300321
301- SSLContext sslContext = getSSLContext (sslConfiguration , getTrustManagers ( sslConfiguration ) );
322+ SSLContext sslContext = getSSLContext (sslConfiguration );
302323
303324 String [] enabledProtocols = null ;
304325
@@ -330,19 +351,36 @@ static ClientHttpRequestFactory usingHttpComponents(ClientOptions options, SslCo
330351 // Support redirects
331352 httpClientBuilder .setRedirectStrategy (new LaxRedirectStrategy ());
332353
333- return new HttpComponentsClientHttpRequestFactory ( httpClientBuilder . build ()) ;
354+ return httpClientBuilder ;
334355 }
335356
336357 }
337358
338359 /**
339- * {@link ClientHttpRequestFactory} for the {@link okhttp3.OkHttpClient}.
360+ * Utilities to create a {@link ClientHttpRequestFactory} for the
361+ * {@link okhttp3.OkHttpClient}.
340362 *
341363 * @author Mark Paluch
342364 */
343- static class OkHttp3 {
365+ public static class OkHttp3 {
344366
345- static ClientHttpRequestFactory usingOkHttp3 (ClientOptions options , SslConfiguration sslConfiguration )
367+ /**
368+ * Create a {@link ClientHttpRequestFactory} using {@link okhttp3.OkHttpClient}.
369+ * @param options must not be {@literal null}
370+ * @param sslConfiguration must not be {@literal null}
371+ * @return a new and configured {@link OkHttp3ClientHttpRequestFactory} instance.
372+ * @throws GeneralSecurityException
373+ * @throws IOException
374+ */
375+ public static OkHttp3ClientHttpRequestFactory usingOkHttp3 (ClientOptions options ,
376+ SslConfiguration sslConfiguration ) throws GeneralSecurityException , IOException {
377+
378+ Builder builder = getBuilder (options , sslConfiguration );
379+
380+ return new OkHttp3ClientHttpRequestFactory (builder .build ());
381+ }
382+
383+ public static Builder getBuilder (ClientOptions options , SslConfiguration sslConfiguration )
346384 throws GeneralSecurityException , IOException {
347385
348386 Builder builder = new Builder ();
@@ -353,13 +391,14 @@ static ClientHttpRequestFactory usingOkHttp3(ClientOptions options, SslConfigura
353391
354392 TrustManager [] trustManagers = getTrustManagers (sslConfiguration );
355393
356- if (trustManagers .length != 1 || !(trustManagers [0 ] instanceof X509TrustManager )) {
394+ if (trustManagers == null || trustManagers .length != 1
395+ || !(trustManagers [0 ] instanceof X509TrustManager )) {
357396 throw new IllegalStateException (
358397 "Unexpected default trust managers:" + Arrays .toString (trustManagers ));
359398 }
360399
361- X509TrustManager trustManager = ( X509TrustManager ) trustManagers [ 0 ];
362- SSLContext sslContext = getSSLContext ( sslConfiguration , trustManagers );
400+ SSLContext sslContext = getSSLContext ( sslConfiguration . getKeyStoreConfiguration (),
401+ sslConfiguration . getKeyConfiguration () , trustManagers );
363402
364403 ConnectionSpec .Builder sslConnectionSpecBuilder = new ConnectionSpec .Builder (sslConnectionSpec );
365404
@@ -374,15 +413,14 @@ static ClientHttpRequestFactory usingOkHttp3(ClientOptions options, SslConfigura
374413
375414 sslConnectionSpec = sslConnectionSpecBuilder .build ();
376415
377- builder .sslSocketFactory (sslContext .getSocketFactory (), trustManager );
416+ builder .sslSocketFactory (sslContext .getSocketFactory (), ( X509TrustManager ) trustManagers [ 0 ] );
378417 }
379418
380419 builder .connectionSpecs (Arrays .asList (sslConnectionSpec , ConnectionSpec .CLEARTEXT ));
381420
382421 builder .connectTimeout (options .getConnectionTimeout ().toMillis (), TimeUnit .MILLISECONDS )
383422 .readTimeout (options .getReadTimeout ().toMillis (), TimeUnit .MILLISECONDS );
384-
385- return new OkHttp3ClientHttpRequestFactory (builder .build ());
423+ return builder ;
386424 }
387425
388426 }
0 commit comments