Skip to content

Commit e39f5be

Browse files
committed
fb
1 parent 45e7a74 commit e39f5be

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 = "";
@@ -497,7 +499,6 @@ private void stopConnection(String errorMessage) {
497499

498500
logger.info("HubConnection stopped.");
499501
this.state.changeState(HubConnectionState.CONNECTED, HubConnectionState.DISCONNECTED);
500-
transportEnum = TransportEnum.ALL;
501502
} finally {
502503
this.state.unlock();
503504
}
@@ -1426,6 +1427,8 @@ private final class ReconnectingConnectionState {
14261427
private final Lock lock = new ReentrantLock();
14271428
private ConnectionState state;
14281429
private HubConnectionState hubConnectionState = HubConnectionState.DISCONNECTED;
1430+
public Completable startTask;
1431+
public TransportEnum currentTransport;
14291432

14301433
public ReconnectingConnectionState(Logger logger) {
14311434
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
@@ -2904,7 +2904,6 @@ public void ClientThatSelectsWebsocketsThrowsWhenWebsocketsAreNotAvailable() {
29042904
.withHttpClient(client)
29052905
.build();
29062906

2907-
assertEquals(TransportEnum.WEBSOCKETS, hubConnection.getTransportEnum());
29082907
RuntimeException exception = assertThrows(RuntimeException.class,
29092908
() -> hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait());
29102909

@@ -2923,13 +2922,42 @@ public void ClientThatSelectsLongPollingThrowsWhenLongPollingIsNotAvailable() {
29232922
.withHttpClient(client)
29242923
.build();
29252924

2926-
assertEquals(TransportEnum.LONG_POLLING, hubConnection.getTransportEnum());
29272925
RuntimeException exception = assertThrows(RuntimeException.class,
29282926
() -> hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait());
29292927

29302928
assertEquals(exception.getMessage(), "There were no compatible transports on the server.");
29312929
}
29322930

2931+
@Test
2932+
public void ConnectionRestartDoesNotResetUserTransportEnum() {
2933+
TestHttpClient client = new TestHttpClient()
2934+
.on("POST", (req) -> {
2935+
return Single.just(new HttpResponse(200, "", TestUtils.stringToByteBuffer("")));
2936+
})
2937+
.on("POST", "http://example.com/negotiate?negotiateVersion=1",
2938+
(req) -> Single.just(new HttpResponse(200, "", TestUtils.stringToByteBuffer("{\"connectionId\":\"bVOiRPG8-6YiJ6d7ZcTOVQ\",\""
2939+
+ "availableTransports\":[{\"transport\":\"WebSockets\",\"transferFormats\":[\"Text\",\"Binary\"]},"
2940+
+ "{\"transport\":\"LongPolling\",\"transferFormats\":[\"Text\",\"Binary\"]}]}"))))
2941+
.on("GET", (req) -> {
2942+
return Single.just(new HttpResponse(200, "", TestUtils.stringToByteBuffer("{}" + RECORD_SEPARATOR)));
2943+
})
2944+
.on("DELETE", (req) -> Single.just(new HttpResponse(200, "", TestUtils.stringToByteBuffer(""))));
2945+
2946+
HubConnection hubConnection = HubConnectionBuilder
2947+
.create("http://example.com")
2948+
.withTransport(TransportEnum.LONG_POLLING)
2949+
.withHttpClient(client)
2950+
.build();
2951+
2952+
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
2953+
assertEquals(TransportEnum.LONG_POLLING, hubConnection.getTransportEnum());
2954+
hubConnection.stop().timeout(30, TimeUnit.SECONDS).blockingAwait();
2955+
2956+
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
2957+
assertEquals(TransportEnum.LONG_POLLING, hubConnection.getTransportEnum());
2958+
hubConnection.stop().timeout(30, TimeUnit.SECONDS).blockingAwait();
2959+
}
2960+
29332961
@Test
29342962
public void LongPollingTransportAccessTokenProviderThrowsOnInitialPoll() {
29352963
TestHttpClient client = new TestHttpClient()
@@ -3089,10 +3117,10 @@ public void stopWithoutObservingWithLongPollingTransportStops() {
30893117
closed.onComplete();
30903118
});
30913119

3092-
hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait();
3120+
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
30933121

30943122
hubConnection.stop();
3095-
closed.timeout(1, TimeUnit.SECONDS).blockingAwait();
3123+
closed.timeout(30, TimeUnit.SECONDS).blockingAwait();
30963124
blockGet.onComplete();
30973125
assertEquals(HubConnectionState.DISCONNECTED, hubConnection.getConnectionState());
30983126
}
@@ -3127,12 +3155,12 @@ public void hubConnectionClosesAndRunsOnClosedCallbackAfterCloseMessageWithLongP
31273155
hubConnection.onClosed((ex) -> {
31283156
closed.onComplete();
31293157
});
3130-
hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait();
3158+
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
31313159

31323160
assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState());
31333161
blockGet.onComplete();
31343162

3135-
closed.timeout(1, TimeUnit.SECONDS).blockingAwait();
3163+
closed.timeout(30, TimeUnit.SECONDS).blockingAwait();
31363164

31373165
assertEquals(HubConnectionState.DISCONNECTED, hubConnection.getConnectionState());
31383166
}

0 commit comments

Comments
 (0)