aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/HttpServer/WebSocketConnection.cs
diff options
context:
space:
mode:
authorBond-009 <bond.009@outlook.com>2019-12-27 14:42:53 +0100
committerBond_009 <bond.009@outlook.com>2020-01-13 20:06:08 +0100
commit4d311870d2f40f67da6df5641b53df637fdee88d (patch)
treea24e97602077003012da9b18a41f68caf5ab2b78 /Emby.Server.Implementations/HttpServer/WebSocketConnection.cs
parent5ca68f9623e414b85ddbda1f97895f1b90bd05e0 (diff)
Fix websocket handling
Diffstat (limited to 'Emby.Server.Implementations/HttpServer/WebSocketConnection.cs')
-rw-r--r--Emby.Server.Implementations/HttpServer/WebSocketConnection.cs73
1 files changed, 29 insertions, 44 deletions
diff --git a/Emby.Server.Implementations/HttpServer/WebSocketConnection.cs b/Emby.Server.Implementations/HttpServer/WebSocketConnection.cs
index 88974f9ab..913a51217 100644
--- a/Emby.Server.Implementations/HttpServer/WebSocketConnection.cs
+++ b/Emby.Server.Implementations/HttpServer/WebSocketConnection.cs
@@ -99,7 +99,6 @@ namespace Emby.Server.Implementations.HttpServer
/// <param name="message">The message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task.</returns>
- /// <exception cref="ArgumentNullException">message</exception>
public Task SendAsync<T>(WebSocketMessage<T> message, CancellationToken cancellationToken)
{
var json = JsonSerializer.SerializeToUtf8Bytes(message, _jsonOptions);
@@ -117,7 +116,6 @@ namespace Emby.Server.Implementations.HttpServer
{
// Allocate at least 512 bytes from the PipeWriter
Memory<byte> memory = writer.GetMemory(512);
-
receiveresult = await _socket.ReceiveAsync(memory, cancellationToken);
int bytesRead = receiveresult.Count;
if (bytesRead == 0)
@@ -144,33 +142,30 @@ namespace Emby.Server.Implementations.HttpServer
}
} while (_socket.State == WebSocketState.Open && receiveresult.MessageType != WebSocketMessageType.Close);
- if (_socket.State == WebSocketState.Open)
- {
- _logger.LogWarning("Stopped reading from websocket before it was closed");
- }
-
Closed?.Invoke(this, EventArgs.Empty);
- _socket.Dispose();
+ await _socket.CloseAsync(
+ WebSocketCloseStatus.NormalClosure,
+ string.Empty,
+ cancellationToken).ConfigureAwait(false);
}
private async Task ProcessInternal(PipeReader reader)
{
+ ReadResult result = await reader.ReadAsync().ConfigureAwait(false);
+ ReadOnlySequence<byte> buffer = result.Buffer;
+
if (OnReceive == null)
{
+ // Tell the PipeReader how much of the buffer we have consumed
+ reader.AdvanceTo(buffer.End);
return;
}
+ WebSocketMessage<object> stub;
try
{
- var result = await reader.ReadAsync().ConfigureAwait(false);
- if (!result.IsCompleted)
- {
- return;
- }
- WebSocketMessage<object> stub;
- var buffer = result.Buffer;
if (buffer.IsSingleSegment)
{
stub = JsonSerializer.Deserialize<WebSocketMessage<object>>(buffer.FirstSpan, _jsonOptions);
@@ -188,46 +183,36 @@ namespace Emby.Server.Implementations.HttpServer
ArrayPool<byte>.Shared.Return(buf);
}
}
-
- var info = new WebSocketMessageInfo
- {
- MessageType = stub.MessageType,
- Data = stub.Data.ToString(),
- Connection = this
- };
-
- await OnReceive(info).ConfigureAwait(false);
}
catch (JsonException ex)
{
+ // Tell the PipeReader how much of the buffer we have consumed
+ reader.AdvanceTo(buffer.End);
_logger.LogError(ex, "Error processing web socket message");
+ return;
}
- }
- /// <inheritdoc />
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
+ // Tell the PipeReader how much of the buffer we have consumed
+ reader.AdvanceTo(buffer.End);
- /// <summary>
- /// Releases unmanaged and - optionally - managed resources.
- /// </summary>
- /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
- protected virtual void Dispose(bool dispose)
- {
- if (_disposed)
+ _logger.LogDebug("WS received message: {@Message}", stub);
+
+ var info = new WebSocketMessageInfo
{
- return;
- }
+ MessageType = stub.MessageType,
+ Data = stub.Data?.ToString(), // Data can be null
+ Connection = this
+ };
+
+ _logger.LogDebug("WS message info: {@MessageInfo}", info);
- if (dispose)
+ await OnReceive(info).ConfigureAwait(false);
+
+ // Stop reading if there's no more data coming
+ if (result.IsCompleted)
{
- _socket.Dispose();
+ return;
}
-
- _disposed = true;
}
}
}