Skip to content

Commit de15b0c

Browse files
mikaelm12BrennanConroy
authored andcommitted
Add support for negotiateVersion query string parameter and ConnectionToken (#13880)
1 parent 7d59ae1 commit de15b0c

File tree

7 files changed

+159
-49
lines changed

7 files changed

+159
-49
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
/**
@@ -339,11 +341,12 @@ public Completable start() {
339341
});
340342

341343
stopError = null;
344+
String urlWithQS = Utils.appendQueryString(baseUrl, "negotiateVersion=" + negotiateVersion);
342345
Single<NegotiateResponse> negotiate = null;
343346
if (!skipNegotiate) {
344-
negotiate = tokenCompletable.andThen(Single.defer(() -> startNegotiate(baseUrl, 0)));
347+
negotiate = tokenCompletable.andThen(Single.defer(() -> startNegotiate(urlWithQS, 0)));
345348
} else {
346-
negotiate = tokenCompletable.andThen(Single.defer(() -> Single.just(new NegotiateResponse(baseUrl))));
349+
negotiate = tokenCompletable.andThen(Single.defer(() -> Single.just(new NegotiateResponse(urlWithQS))));
347350
}
348351

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

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

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

@@ -520,6 +524,7 @@ private void stopConnection(String errorMessage) {
520524
handshakeResponseSubject.onComplete();
521525
redirectAccessTokenProvider = null;
522526
connectionId = null;
527+
connectionToken = null;
523528
transportEnum = TransportEnum.ALL;
524529
this.localHeaders.clear();
525530
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+
}

0 commit comments

Comments
 (0)