Skip to content

Commit f489616

Browse files
committed
fb
1 parent 376825b commit f489616

File tree

2 files changed

+48
-17
lines changed

2 files changed

+48
-17
lines changed

src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/HubConnection.java

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,20 @@ public class HubConnection implements AutoCloseable {
3333
private static final List<Type> emptyArray = new ArrayList<>();
3434
private static final int MAX_NEGOTIATE_ATTEMPTS = 100;
3535

36-
private String baseUrl;
3736
private final CallbackMap handlers = new CallbackMap();
3837
private final HubProtocol protocol;
3938
private final boolean skipNegotiate;
4039
private final Map<String, String> headers;
4140
private final int negotiateVersion = 1;
4241
private final Logger logger = LoggerFactory.getLogger(HubConnection.class);
4342
private final HttpClient httpClient;
44-
private Completable start;
4543
private final Transport customTransport;
4644
private final OnReceiveCallBack callback;
4745
private final Single<String> accessTokenProvider;
46+
private final TransportEnum transportEnum;
4847

4948
// These are all user-settable properties
49+
private String baseUrl;
5050
private List<OnClosedCallback> onClosedCallbackList;
5151
private long keepAliveInterval = 15 * 1000;
5252
private long serverTimeout = 30 * 1000;
@@ -55,7 +55,6 @@ public class HubConnection implements AutoCloseable {
5555
// Private property, modified for testing
5656
private long tickRate = 1000;
5757

58-
private TransportEnum transportEnum = TransportEnum.ALL;
5958

6059
// Holds all mutable state other than user-defined handlers and settable properties.
6160
private final ReconnectingConnectionState state;
@@ -116,7 +115,7 @@ void setTickRate(long tickRateInMilliseconds) {
116115

117116
// For testing purposes
118117
TransportEnum getTransportEnum() {
119-
return this.transportEnum;
118+
return this.state.currentTransport;
120119
}
121120

122121
// For testing purposes
@@ -148,6 +147,7 @@ Transport getTransport() {
148147
}
149148

150149
if (transport != null) {
150+
this.transportEnum = TransportEnum.ALL;
151151
this.customTransport = transport;
152152
} else if (transportEnum != null) {
153153
this.transportEnum = transportEnum;
@@ -233,11 +233,11 @@ public Completable start() {
233233
try {
234234
if (this.state.getHubConnectionState() != HubConnectionState.DISCONNECTED) {
235235
logger.debug("The connection is in the '{}' state. Waiting for in-progress start to complete or completing this start immediately.", this.state.getHubConnectionState());
236-
return start;
236+
return this.state.startTask;
237237
}
238238

239239
this.state.changeState(HubConnectionState.DISCONNECTED, HubConnectionState.CONNECTING);
240-
start = localStart;
240+
this.state.startTask = localStart;
241241

242242
CompletableSubject tokenCompletable = CompletableSubject.create();
243243
Map<String, String> localHeaders = new HashMap<>();
@@ -269,7 +269,7 @@ public Completable start() {
269269
Transport transport = customTransport;
270270
if (transport == null) {
271271
Single<String> tokenProvider = negotiateResponse.getAccessToken() != null ? Single.just(negotiateResponse.getAccessToken()) : accessTokenProvider;
272-
switch (transportEnum) {
272+
switch (this.state.currentTransport) {
273273
case LONG_POLLING:
274274
transport = new LongPollingTransport(localHeaders, httpClient, tokenProvider);
275275
break;
@@ -296,7 +296,7 @@ public Completable start() {
296296
logger.info("HubConnection started.");
297297
connectionState.resetServerTimeout();
298298
// Don't send pings if we're using long polling.
299-
if (transportEnum != TransportEnum.LONG_POLLING) {
299+
if (this.state.currentTransport != TransportEnum.LONG_POLLING) {
300300
connectionState.activatePingTimer();
301301
}
302302
} finally {
@@ -337,15 +337,17 @@ private Single<NegotiateResponse> startNegotiate(String url, int negotiateAttemp
337337
Set<String> transports = response.getAvailableTransports();
338338
if (this.transportEnum == TransportEnum.ALL) {
339339
if (transports.contains("WebSockets")) {
340-
this.transportEnum = TransportEnum.WEBSOCKETS;
340+
this.state.currentTransport = TransportEnum.WEBSOCKETS;
341341
} else if (transports.contains("LongPolling")) {
342-
this.transportEnum = TransportEnum.LONG_POLLING;
342+
this.state.currentTransport = TransportEnum.LONG_POLLING;
343343
} else {
344344
throw new RuntimeException("There were no compatible transports on the server.");
345345
}
346346
} else if (this.transportEnum == TransportEnum.WEBSOCKETS && !transports.contains("WebSockets") ||
347347
(this.transportEnum == TransportEnum.LONG_POLLING && !transports.contains("LongPolling"))) {
348348
throw new RuntimeException("There were no compatible transports on the server.");
349+
} else {
350+
this.state.currentTransport = this.transportEnum;
349351
}
350352

351353
String connectionToken = "";
@@ -501,7 +503,6 @@ private void stopConnection(String errorMessage) {
501503

502504
logger.info("HubConnection stopped.");
503505
this.state.changeState(HubConnectionState.CONNECTED, HubConnectionState.DISCONNECTED);
504-
transportEnum = TransportEnum.ALL;
505506
} finally {
506507
this.state.unlock();
507508
}
@@ -1430,6 +1431,8 @@ private final class ReconnectingConnectionState {
14301431
private final Lock lock = new ReentrantLock();
14311432
private ConnectionState state;
14321433
private HubConnectionState hubConnectionState = HubConnectionState.DISCONNECTED;
1434+
public Completable startTask;
1435+
public TransportEnum currentTransport;
14331436

14341437
public ReconnectingConnectionState(Logger logger) {
14351438
this.logger = logger;

src/SignalR/clients/java/signalr/test/src/main/java/com/microsoft/signalr/HubConnectionTest.java

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2936,7 +2936,6 @@ public void ClientThatSelectsWebsocketsThrowsWhenWebsocketsAreNotAvailable() {
29362936
.withHttpClient(client)
29372937
.build();
29382938

2939-
assertEquals(TransportEnum.WEBSOCKETS, hubConnection.getTransportEnum());
29402939
RuntimeException exception = assertThrows(RuntimeException.class,
29412940
() -> hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait());
29422941

@@ -2955,13 +2954,42 @@ public void ClientThatSelectsLongPollingThrowsWhenLongPollingIsNotAvailable() {
29552954
.withHttpClient(client)
29562955
.build();
29572956

2958-
assertEquals(TransportEnum.LONG_POLLING, hubConnection.getTransportEnum());
29592957
RuntimeException exception = assertThrows(RuntimeException.class,
29602958
() -> hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait());
29612959

29622960
assertEquals(exception.getMessage(), "There were no compatible transports on the server.");
29632961
}
29642962

2963+
@Test
2964+
public void ConnectionRestartDoesNotResetUserTransportEnum() {
2965+
TestHttpClient client = new TestHttpClient()
2966+
.on("POST", (req) -> {
2967+
return Single.just(new HttpResponse(200, "", TestUtils.stringToByteBuffer("")));
2968+
})
2969+
.on("POST", "http://example.com/negotiate?negotiateVersion=1",
2970+
(req) -> Single.just(new HttpResponse(200, "", TestUtils.stringToByteBuffer("{\"connectionId\":\"bVOiRPG8-6YiJ6d7ZcTOVQ\",\""
2971+
+ "availableTransports\":[{\"transport\":\"WebSockets\",\"transferFormats\":[\"Text\",\"Binary\"]},"
2972+
+ "{\"transport\":\"LongPolling\",\"transferFormats\":[\"Text\",\"Binary\"]}]}"))))
2973+
.on("GET", (req) -> {
2974+
return Single.just(new HttpResponse(200, "", TestUtils.stringToByteBuffer("{}" + RECORD_SEPARATOR)));
2975+
})
2976+
.on("DELETE", (req) -> Single.just(new HttpResponse(200, "", TestUtils.stringToByteBuffer(""))));
2977+
2978+
HubConnection hubConnection = HubConnectionBuilder
2979+
.create("http://example.com")
2980+
.withTransport(TransportEnum.LONG_POLLING)
2981+
.withHttpClient(client)
2982+
.build();
2983+
2984+
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
2985+
assertEquals(TransportEnum.LONG_POLLING, hubConnection.getTransportEnum());
2986+
hubConnection.stop().timeout(30, TimeUnit.SECONDS).blockingAwait();
2987+
2988+
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
2989+
assertEquals(TransportEnum.LONG_POLLING, hubConnection.getTransportEnum());
2990+
hubConnection.stop().timeout(30, TimeUnit.SECONDS).blockingAwait();
2991+
}
2992+
29652993
@Test
29662994
public void LongPollingTransportAccessTokenProviderThrowsOnInitialPoll() {
29672995
TestHttpClient client = new TestHttpClient()
@@ -3121,10 +3149,10 @@ public void stopWithoutObservingWithLongPollingTransportStops() {
31213149
closed.onComplete();
31223150
});
31233151

3124-
hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait();
3152+
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
31253153

31263154
hubConnection.stop();
3127-
closed.timeout(1, TimeUnit.SECONDS).blockingAwait();
3155+
closed.timeout(30, TimeUnit.SECONDS).blockingAwait();
31283156
blockGet.onComplete();
31293157
assertEquals(HubConnectionState.DISCONNECTED, hubConnection.getConnectionState());
31303158
}
@@ -3159,12 +3187,12 @@ public void hubConnectionClosesAndRunsOnClosedCallbackAfterCloseMessageWithLongP
31593187
hubConnection.onClosed((ex) -> {
31603188
closed.onComplete();
31613189
});
3162-
hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait();
3190+
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
31633191

31643192
assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState());
31653193
blockGet.onComplete();
31663194

3167-
closed.timeout(1, TimeUnit.SECONDS).blockingAwait();
3195+
closed.timeout(30, TimeUnit.SECONDS).blockingAwait();
31683196

31693197
assertEquals(HubConnectionState.DISCONNECTED, hubConnection.getConnectionState());
31703198
}

0 commit comments

Comments
 (0)