Skip to content

Commit 9218162

Browse files
mikaelm12BrennanConroy
authored andcommitted
Add support for negotiateVersion query string parameter and ConnectionToken (#13880)
1 parent 1540b7d commit 9218162

File tree

8 files changed

+165
-54
lines changed

8 files changed

+165
-54
lines changed

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

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ public class HubConnection {
5757
private Map<String, Observable> streamMap = new ConcurrentHashMap<>();
5858
private TransportEnum transportEnum = TransportEnum.ALL;
5959
private String connectionId;
60+
private String connectionToken;
61+
private final int negotiateVersion = 1;
6062
private final Logger logger = LoggerFactory.getLogger(HubConnection.class);
6163

6264
/**
@@ -340,11 +342,12 @@ public Completable start() {
340342
});
341343

342344
stopError = null;
345+
String urlWithQS = Utils.appendQueryString(baseUrl, "negotiateVersion=" + negotiateVersion);
343346
Single<NegotiateResponse> negotiate = null;
344347
if (!skipNegotiate) {
345-
negotiate = tokenCompletable.andThen(Single.defer(() -> startNegotiate(baseUrl, 0)));
348+
negotiate = tokenCompletable.andThen(Single.defer(() -> startNegotiate(urlWithQS, 0)));
346349
} else {
347-
negotiate = tokenCompletable.andThen(Single.defer(() -> Single.just(new NegotiateResponse(baseUrl))));
350+
negotiate = tokenCompletable.andThen(Single.defer(() -> Single.just(new NegotiateResponse(urlWithQS))));
348351
}
349352

350353
CompletableSubject start = CompletableSubject.create();
@@ -377,7 +380,6 @@ public Completable start() {
377380
hubConnectionStateLock.lock();
378381
try {
379382
hubConnectionState = HubConnectionState.CONNECTED;
380-
this.connectionId = negotiateResponse.getConnectionId();
381383
logger.info("HubConnection started.");
382384
resetServerTimeout();
383385
//Don't send pings if we're using long polling.
@@ -447,19 +449,21 @@ private Single<NegotiateResponse> startNegotiate(String url, int negotiateAttemp
447449
throw new RuntimeException("There were no compatible transports on the server.");
448450
}
449451

450-
String finalUrl = url;
451-
if (response.getConnectionId() != null) {
452-
if (url.contains("?")) {
453-
finalUrl = url + "&id=" + response.getConnectionId();
454-
} else {
455-
finalUrl = url + "?id=" + response.getConnectionId();
456-
}
452+
if (response.getVersion() > 0) {
453+
this.connectionId = response.getConnectionId();
454+
this.connectionToken = response.getConnectionToken();
455+
} else {
456+
this.connectionToken = this.connectionId = response.getConnectionId();
457457
}
458+
459+
String finalUrl = Utils.appendQueryString(url, "id=" + this.connectionToken);
460+
458461
response.setFinalUrl(finalUrl);
459462
return Single.just(response);
460463
}
461464

462-
return startNegotiate(response.getRedirectUrl(), negotiateAttempts + 1);
465+
String redirectUrl = Utils.appendQueryString(response.getRedirectUrl(), "negotiateVersion=" + negotiateVersion);
466+
return startNegotiate(redirectUrl, negotiateAttempts + 1);
463467
});
464468
}
465469

@@ -521,6 +525,7 @@ private void stopConnection(String errorMessage) {
521525
handshakeResponseSubject.onComplete();
522526
redirectAccessTokenProvider = null;
523527
connectionId = null;
528+
connectionToken = null;
524529
transportEnum = TransportEnum.ALL;
525530
this.localHeaders.clear();
526531
this.streamMap.clear();

src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/Negotiate.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public static String resolveNegotiateUrl(String url) {
1010
// Check if we have a query string. If we do then we ignore it for now.
1111
int queryStringIndex = url.indexOf('?');
1212
if (queryStringIndex > 0) {
13-
negotiateUrl = url.substring(0, url.indexOf('?'));
13+
negotiateUrl = url.substring(0, queryStringIndex);
1414
} else {
1515
negotiateUrl = url;
1616
}
@@ -24,7 +24,7 @@ public static String resolveNegotiateUrl(String url) {
2424

2525
// Add the query string back if it existed.
2626
if (queryStringIndex > 0) {
27-
negotiateUrl += url.substring(url.indexOf('?'));
27+
negotiateUrl += url.substring(queryStringIndex);
2828
}
2929

3030
return negotiateUrl;

src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/NegotiateResponse.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@
1111

1212
class NegotiateResponse {
1313
private String connectionId;
14+
private String connectionToken;
1415
private Set<String> availableTransports = new HashSet<>();
1516
private String redirectUrl;
1617
private String accessToken;
1718
private String error;
1819
private String finalUrl;
20+
private int version;
1921

2022
public NegotiateResponse(JsonReader reader) {
2123
try {
@@ -30,6 +32,12 @@ public NegotiateResponse(JsonReader reader) {
3032
case "ProtocolVersion":
3133
this.error = "Detected an ASP.NET SignalR Server. This client only supports connecting to an ASP.NET Core SignalR Server. See https://aka.ms/signalr-core-differences for details.";
3234
return;
35+
case "negotiateVersion":
36+
this.version = reader.nextInt();
37+
break;
38+
case "connectionToken":
39+
this.connectionToken = reader.nextString();
40+
break;
3341
case "url":
3442
this.redirectUrl = reader.nextString();
3543
break;
@@ -106,6 +114,14 @@ public String getFinalUrl() {
106114
return finalUrl;
107115
}
108116

117+
public int getVersion() {
118+
return version;
119+
}
120+
121+
public String getConnectionToken() {
122+
return connectionToken;
123+
}
124+
109125
public void setFinalUrl(String url) {
110126
this.finalUrl = url;
111127
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
package com.microsoft.signalr;
5+
6+
class Utils {
7+
public static String appendQueryString(String original, String queryStringValue) {
8+
if (original.contains("?")) {
9+
return original + "&" + queryStringValue;
10+
} else {
11+
return original + "?" + queryStringValue;
12+
}
13+
}
14+
}

src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/Version.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
// Copyright (c) .NET Foundation. All rights reserved.
32
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
43

0 commit comments

Comments
 (0)