From 1993182f13c70b9754b3403ba364a3458b625878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Sejkora?= Date: Wed, 11 Jun 2025 21:32:54 +0200 Subject: [PATCH] [SignalR] [Java] Fix NPE when closing hub connection during negotiation --- .../com/microsoft/signalr/HubConnection.java | 3 ++- .../microsoft/signalr/HubConnectionTest.java | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) 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 ab7763e6f54c..455a0323b6f9 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 @@ -445,7 +445,8 @@ private Completable stop(String errorMessage) { CompletableSubject subject = CompletableSubject.create(); startTask.onErrorComplete().subscribe(() -> { - Completable stop = connectionState.transport.stop(); + Transport transport = connectionState.transport; + Completable stop = (transport != null) ? transport.stop() : Completable.complete(); stop.subscribe(() -> subject.onComplete(), e -> subject.onError(e)); }); 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 396b58518df3..d68f56ce5d51 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 @@ -2783,6 +2783,26 @@ public void negotiateSentOnStart() { assertEquals("http://example.com/negotiate?negotiateVersion=1", sentRequests.get(0).getUrl()); } + @Test + public void closeWithPendingNegotiate() { + TestHttpClient client = new TestHttpClient() + .on("POST", (req) -> Single.just(new HttpResponse(404, "", TestUtils.emptyByteBuffer)).delay(200, TimeUnit.MILLISECONDS)); + + HubConnection hubConnection = HubConnectionBuilder + .create("http://example.com") + .withHttpClient(client) + .build(); + + Completable start = hubConnection.start(); + assertEquals(HubConnectionState.CONNECTING, hubConnection.getConnectionState()); + hubConnection.stop().timeout(3, TimeUnit.SECONDS).blockingAwait(); + assertEquals(HubConnectionState.DISCONNECTED, hubConnection.getConnectionState()); + + HttpRequestException exception = assertThrows(HttpRequestException.class, () -> start.blockingAwait(10, TimeUnit.SECONDS)); + assertEquals("Unexpected status code returned from negotiate: 404 .", exception.getMessage()); + assertEquals(404, exception.getStatusCode()); + } + @Test public void negotiateThatRedirectsForeverFailsAfter100Tries() { TestHttpClient client = new TestHttpClient().on("POST", "http://example.com/negotiate?negotiateVersion=1",