Skip to content

Commit 7e40302

Browse files
hogwartsdeveloperraman-m
authored andcommitted
WebSocket Destination state abort Close fix
1 parent db930d4 commit 7e40302

File tree

1 file changed

+34
-4
lines changed

1 file changed

+34
-4
lines changed

src/Ocelot/WebSockets/WebSocketsProxyMiddleware.cs

+34-4
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,22 @@ private static async Task PumpWebSocket(WebSocket source, WebSocket destination,
5252
}
5353
catch (OperationCanceledException)
5454
{
55-
await destination.CloseOutputAsync(WebSocketCloseStatus.EndpointUnavailable, null, cancellationToken);
55+
await TryCloseWebSocket(
56+
destination,
57+
WebSocketCloseStatus.EndpointUnavailable,
58+
null,
59+
cancellationToken);
5660
return;
5761
}
5862
catch (WebSocketException e)
5963
{
6064
if (e.WebSocketErrorCode == WebSocketError.ConnectionClosedPrematurely)
6165
{
62-
await destination.CloseOutputAsync(WebSocketCloseStatus.EndpointUnavailable, null, cancellationToken);
66+
await TryCloseWebSocket(
67+
destination,
68+
WebSocketCloseStatus.EndpointUnavailable,
69+
null,
70+
cancellationToken);
6371
return;
6472
}
6573

@@ -68,11 +76,18 @@ private static async Task PumpWebSocket(WebSocket source, WebSocket destination,
6876

6977
if (result.MessageType == WebSocketMessageType.Close)
7078
{
71-
await destination.CloseOutputAsync(source.CloseStatus.Value, source.CloseStatusDescription, cancellationToken);
79+
await TryCloseWebSocket(
80+
destination,
81+
source.CloseStatus.Value,
82+
source.CloseStatusDescription,
83+
cancellationToken);
7284
return;
7385
}
7486

75-
await destination.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, cancellationToken);
87+
if (destination.State == WebSocketState.Open)
88+
{
89+
await destination.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, cancellationToken);
90+
}
7691
}
7792
}
7893

@@ -154,5 +169,20 @@ await Task.WhenAll(
154169
PumpWebSocket(server, client.ToWebSocket(), DefaultWebSocketBufferSize, context.RequestAborted));
155170
}
156171
}
172+
173+
private static async Task<bool> TryCloseWebSocket(
174+
WebSocket webSocket,
175+
WebSocketCloseStatus closeStatus,
176+
string statusDescription,
177+
CancellationToken cancellationToken)
178+
{
179+
if (webSocket.State == WebSocketState.Open || webSocket.State == WebSocketState.CloseReceived)
180+
{
181+
await webSocket.CloseOutputAsync(closeStatus, statusDescription, cancellationToken);
182+
return true;
183+
}
184+
185+
return false;
186+
}
157187
}
158188
}

0 commit comments

Comments
 (0)