diff --git a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/HubConnection.java b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/HubConnection.java index c20e051eab46..6fe0e3b725bf 100644 --- a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/HubConnection.java +++ b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/HubConnection.java @@ -264,7 +264,13 @@ public Completable start() { Transport transport = customTransport; if (transport == null) { Single tokenProvider = negotiateResponse.getAccessToken() != null ? Single.just(negotiateResponse.getAccessToken()) : accessTokenProvider; - switch (negotiateResponse.getChosenTransport()) { + TransportEnum chosenTransport; + if (this.skipNegotiate) { + chosenTransport = this.transportEnum; + } else { + chosenTransport = negotiateResponse.getChosenTransport(); + } + switch (chosenTransport) { case LONG_POLLING: transport = new LongPollingTransport(localHeaders, httpClient, tokenProvider); break; diff --git a/src/SignalR/clients/java/signalr/test/src/main/java/com/microsoft/signalr/HubConnectionTest.java b/src/SignalR/clients/java/signalr/test/src/main/java/com/microsoft/signalr/HubConnectionTest.java index 6ebd67a2e124..3a1413e0ab11 100644 --- a/src/SignalR/clients/java/signalr/test/src/main/java/com/microsoft/signalr/HubConnectionTest.java +++ b/src/SignalR/clients/java/signalr/test/src/main/java/com/microsoft/signalr/HubConnectionTest.java @@ -2743,6 +2743,37 @@ public void noConnectionIdWhenSkippingNegotiate() { assertNull(hubConnection.getConnectionId()); } + @Test + public void SkippingNegotiateDoesNotNegotiate() { + try (TestLogger logger = new TestLogger(WebSocketTransport.class.getName())) { + AtomicBoolean negotiateCalled = new AtomicBoolean(false); + TestHttpClient client = new TestHttpClient().on("POST", "http://example.com/negotiate?negotiateVersion=1", + (req) -> { + negotiateCalled.set(true); + return Single.just(new HttpResponse(200, "", + TestUtils.stringToByteBuffer("{\"connectionId\":\"bVOiRPG8-6YiJ6d7ZcTOVQ\",\"" + + "availableTransports\":[{\"transport\":\"WebSockets\",\"transferFormats\":[\"Text\",\"Binary\"]}]}"))); + }); + + HubConnection hubConnection = HubConnectionBuilder + .create("http://example") + .withTransport(TransportEnum.WEBSOCKETS) + .shouldSkipNegotiate(true) + .withHttpClient(client) + .build(); + + try { + hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait(); + } catch (Exception e) { + assertEquals("WebSockets isn't supported in testing currently.", e.getMessage()); + } + assertEquals(HubConnectionState.DISCONNECTED, hubConnection.getConnectionState()); + assertFalse(negotiateCalled.get()); + + logger.assertLog("Starting Websocket connection."); + } + } + @Test public void connectionIdIsAvailableAfterStart() { TestHttpClient client = new TestHttpClient().on("POST", "http://example.com/negotiate?negotiateVersion=1",