From c18571c820f31d89b93ad06abd3f822f11ed3e4a Mon Sep 17 00:00:00 2001 From: Brennan Date: Mon, 20 Jul 2020 15:53:14 -0700 Subject: [PATCH] [Java] Allow configuration of OkHttpClient.Builder (#23822) * start * comment * remove ctor * unused import * fb * Update src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HttpHubConnectionBuilder.java * remove unused param --- .../microsoft/signalr/DefaultHttpClient.java | 13 +++++++------ .../signalr/HttpHubConnectionBuilder.java | 17 ++++++++++++++++- .../com/microsoft/signalr/HubConnection.java | 6 ++++-- .../signalr/WebSocketTransportTest.java | 7 ------- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/DefaultHttpClient.java b/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/DefaultHttpClient.java index 58a95445c8..8f4f4f0df9 100644 --- a/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/DefaultHttpClient.java +++ b/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/DefaultHttpClient.java @@ -19,14 +19,14 @@ import okhttp3.*; final class DefaultHttpClient extends HttpClient { private OkHttpClient client = null; - public DefaultHttpClient() { - this(0, null); + public DefaultHttpClient(Action1 configureBuilder) { + this(null, configureBuilder); } public DefaultHttpClient cloneWithTimeOut(int timeoutInMilliseconds) { OkHttpClient newClient = client.newBuilder().readTimeout(timeoutInMilliseconds, TimeUnit.MILLISECONDS) .build(); - return new DefaultHttpClient(timeoutInMilliseconds, newClient); + return new DefaultHttpClient(newClient, null); } @Override @@ -36,7 +36,7 @@ final class DefaultHttpClient extends HttpClient { } } - public DefaultHttpClient(int timeoutInMilliseconds, OkHttpClient client) { + public DefaultHttpClient(OkHttpClient client, Action1 configureBuilder) { if (client != null) { this.client = client; } else { @@ -90,9 +90,10 @@ final class DefaultHttpClient extends HttpClient { } }); - if (timeoutInMilliseconds > 0) { - builder.readTimeout(timeoutInMilliseconds, TimeUnit.MILLISECONDS); + if (configureBuilder != null) { + configureBuilder.invoke(builder); } + this.client = builder.build(); } } diff --git a/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HttpHubConnectionBuilder.java b/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HttpHubConnectionBuilder.java index d91e382ed9..e1f38e6888 100644 --- a/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HttpHubConnectionBuilder.java +++ b/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HttpHubConnectionBuilder.java @@ -7,6 +7,7 @@ import java.util.HashMap; import java.util.Map; import io.reactivex.Single; +import okhttp3.OkHttpClient; /** * A builder for configuring {@link HubConnection} instances. @@ -20,6 +21,7 @@ public class HttpHubConnectionBuilder { private long handshakeResponseTimeout = 0; private Map headers; private TransportEnum transportEnum; + private Action1 configureBuilder; HttpHubConnectionBuilder(String url) { this.url = url; @@ -113,12 +115,25 @@ public class HttpHubConnectionBuilder { return this; } + /** + * Sets a method that will be called when constructing the HttpClient to allow customization such as certificate validation, proxies, and cookies. + * By default the client will have a cookie jar added and a read timeout for LongPolling. + * + * @param configureBuilder Callback for configuring the OkHttpClient.Builder. + * @return This instance of the HttpHubConnectionBuilder. + */ + public HttpHubConnectionBuilder setHttpClientBuilderCallback(Action1 configureBuilder) { + this.configureBuilder = configureBuilder; + return this; + } + /** * Builds a new instance of {@link HubConnection}. * * @return A new instance of {@link HubConnection}. */ public HubConnection build() { - return new HubConnection(url, transport, skipNegotiate, httpClient, accessTokenProvider, handshakeResponseTimeout, headers, transportEnum); + return new HubConnection(url, transport, skipNegotiate, httpClient, accessTokenProvider, + handshakeResponseTimeout, headers, transportEnum, configureBuilder); } } diff --git a/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java b/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java index 5c884cfff1..addbd5c2f6 100644 --- a/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java +++ b/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java @@ -20,6 +20,7 @@ import io.reactivex.Completable; import io.reactivex.Observable; import io.reactivex.Single; import io.reactivex.subjects.*; +import okhttp3.OkHttpClient; /** * A connection used to invoke hub methods on a SignalR Server. @@ -126,7 +127,8 @@ public class HubConnection implements AutoCloseable { } HubConnection(String url, Transport transport, boolean skipNegotiate, HttpClient httpClient, - Single accessTokenProvider, long handshakeResponseTimeout, Map headers, TransportEnum transportEnum) { + Single accessTokenProvider, long handshakeResponseTimeout, Map headers, TransportEnum transportEnum, + Action1 configureBuilder) { if (url == null || url.isEmpty()) { throw new IllegalArgumentException("A valid url is required."); } @@ -143,7 +145,7 @@ public class HubConnection implements AutoCloseable { if (httpClient != null) { this.httpClient = httpClient; } else { - this.httpClient = new DefaultHttpClient(); + this.httpClient = new DefaultHttpClient(configureBuilder); } if (transport != null) { diff --git a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/WebSocketTransportTest.java b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/WebSocketTransportTest.java index 5edda35267..4aeec16836 100644 --- a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/WebSocketTransportTest.java +++ b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/WebSocketTransportTest.java @@ -16,13 +16,6 @@ import io.reactivex.Completable; import io.reactivex.Single; class WebSocketTransportTest { - // @Test Skipping until we add functional test support - public void WebSocketThrowsIfItCantConnect() { - Transport transport = new WebSocketTransport(new HashMap<>(), new DefaultHttpClient()); - RuntimeException exception = assertThrows(RuntimeException.class, () -> transport.start("http://url.fake.example").blockingAwait(1, TimeUnit.SECONDS)); - assertEquals("There was an error starting the WebSocket transport.", exception.getMessage()); - } - @Test public void CanPassNullExitCodeToOnClosed() { WebSocketTransport transport = new WebSocketTransport(new HashMap<>(), new WebSocketTestHttpClient());