Detect ASP.NET SignalR server connection attempt (#2820)
This commit is contained in:
parent
5f4d0dac3c
commit
f8a46faf9d
|
|
@ -146,6 +146,10 @@ export class HttpConnection implements IConnection {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((negotiateResponse as any).ProtocolVersion) {
|
||||||
|
throw Error("Detected a connection attempt to 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.");
|
||||||
|
}
|
||||||
|
|
||||||
if (negotiateResponse.url) {
|
if (negotiateResponse.url) {
|
||||||
url = negotiateResponse.url;
|
url = negotiateResponse.url;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -794,5 +794,38 @@ describe("HttpConnection", () => {
|
||||||
expect(() => connection.start(42)).toThrowError("Unknown transferFormat value: 42.");
|
expect(() => connection.start(42)).toThrowError("Unknown transferFormat value: 42.");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("throws if trying to connect to an ASP.NET SignalR Server", async () => {
|
||||||
|
await VerifyLogger.run(async (logger) => {
|
||||||
|
const options: IHttpConnectionOptions = {
|
||||||
|
...commonOptions,
|
||||||
|
httpClient: new TestHttpClient()
|
||||||
|
.on("POST", () => "{\"Url\":\"/signalr\"," +
|
||||||
|
"\"ConnectionToken\":\"X97dw3uxW4NPPggQsYVcNcyQcuz4w2\"," +
|
||||||
|
"\"ConnectionId\":\"05265228-1e2c-46c5-82a1-6a5bcc3f0143\"," +
|
||||||
|
"\"KeepAliveTimeout\":10.0," +
|
||||||
|
"\"DisconnectTimeout\":5.0," +
|
||||||
|
"\"TryWebSockets\":true," +
|
||||||
|
"\"ProtocolVersion\":\"1.5\"," +
|
||||||
|
"\"TransportConnectTimeout\":30.0," +
|
||||||
|
"\"LongPollDelay\":0.0}")
|
||||||
|
.on("GET", () => ""),
|
||||||
|
logger,
|
||||||
|
} as IHttpConnectionOptions;
|
||||||
|
|
||||||
|
const connection = new HttpConnection("http://tempuri.org", options);
|
||||||
|
let receivedError = false;
|
||||||
|
try {
|
||||||
|
await connection.start(TransferFormat.Text);
|
||||||
|
} catch (error) {
|
||||||
|
expect(error).toEqual(new Error("Detected a connection attempt to 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."));
|
||||||
|
receivedError = true;
|
||||||
|
} finally {
|
||||||
|
await connection.stop();
|
||||||
|
}
|
||||||
|
expect(receivedError).toBe(true);
|
||||||
|
},
|
||||||
|
"Failed to start the connection: Error: Detected a connection attempt to 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.");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,8 @@ namespace Microsoft.AspNetCore.Http.Connections
|
||||||
private const string AvailableTransportsPropertyName = "availableTransports";
|
private const string AvailableTransportsPropertyName = "availableTransports";
|
||||||
private const string TransportPropertyName = "transport";
|
private const string TransportPropertyName = "transport";
|
||||||
private const string TransferFormatsPropertyName = "transferFormats";
|
private const string TransferFormatsPropertyName = "transferFormats";
|
||||||
|
// Used to detect ASP.NET SignalR Server connection attempt
|
||||||
|
private const string ProtocolVersionPropertyName = "ProtocolVersion";
|
||||||
|
|
||||||
public static void WriteResponse(NegotiationResponse response, IBufferWriter<byte> output)
|
public static void WriteResponse(NegotiationResponse response, IBufferWriter<byte> output)
|
||||||
{
|
{
|
||||||
|
|
@ -134,6 +136,8 @@ namespace Microsoft.AspNetCore.Http.Connections
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case ProtocolVersionPropertyName:
|
||||||
|
throw new InvalidOperationException("Detected a connection attempt to 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.");
|
||||||
default:
|
default:
|
||||||
reader.Skip();
|
reader.Skip();
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,27 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests
|
||||||
Assert.Equal(expectedMessage, exception.InnerException.Message);
|
Assert.Equal(expectedMessage, exception.InnerException.Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ParsingAspNetSignalRResponseThrowsError()
|
||||||
|
{
|
||||||
|
var payload = "{\"Url\":\"/signalr\"," +
|
||||||
|
"\"ConnectionToken\":\"X97dw3uxW4NPPggQsYVcNcyQcuz4w2\"," +
|
||||||
|
"\"ConnectionId\":\"05265228-1e2c-46c5-82a1-6a5bcc3f0143\"," +
|
||||||
|
"\"KeepAliveTimeout\":10.0," +
|
||||||
|
"\"DisconnectTimeout\":5.0," +
|
||||||
|
"\"TryWebSockets\":true," +
|
||||||
|
"\"ProtocolVersion\":\"1.5\"," +
|
||||||
|
"\"TransportConnectTimeout\":30.0," +
|
||||||
|
"\"LongPollDelay\":0.0}";
|
||||||
|
|
||||||
|
var responseData = Encoding.UTF8.GetBytes(payload);
|
||||||
|
var ms = new MemoryStream(responseData);
|
||||||
|
|
||||||
|
var exception = Assert.Throws<InvalidDataException>(() => NegotiateProtocol.ParseResponse(ms));
|
||||||
|
|
||||||
|
Assert.Equal("Detected a connection attempt to 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.", exception.InnerException.Message);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void WriteNegotiateResponseWithNullAvailableTransports()
|
public void WriteNegotiateResponseWithNullAvailableTransports()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task NegotiateReturnedConenctionIdIsSetOnConnection()
|
public async Task NegotiateReturnedConnectionIdIsSetOnConnection()
|
||||||
{
|
{
|
||||||
string connectionId = null;
|
string connectionId = null;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue