mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-05-31 20:24:21 -04:00
Remove dead code and improve logging
This commit is contained in:
parent
4d311870d2
commit
8865b3ea3d
@ -520,7 +520,7 @@ namespace Emby.Server.Implementations.HttpServer
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_logger.LogInformation("WS Request from {IP}", context.Connection.RemoteIpAddress);
|
_logger.LogInformation("WS {IP} request", context.Connection.RemoteIpAddress);
|
||||||
|
|
||||||
WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync().ConfigureAwait(false);
|
WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync().ConfigureAwait(false);
|
||||||
|
|
||||||
@ -536,11 +536,11 @@ namespace Emby.Server.Implementations.HttpServer
|
|||||||
WebSocketConnected?.Invoke(this, new GenericEventArgs<IWebSocketConnection>(connection));
|
WebSocketConnected?.Invoke(this, new GenericEventArgs<IWebSocketConnection>(connection));
|
||||||
|
|
||||||
await connection.ProcessAsync().ConfigureAwait(false);
|
await connection.ProcessAsync().ConfigureAwait(false);
|
||||||
_logger.LogInformation("WS closed from {IP}", context.Connection.RemoteIpAddress);
|
_logger.LogInformation("WS {IP} closed", context.Connection.RemoteIpAddress);
|
||||||
}
|
}
|
||||||
catch (Exception ex) // Otherwise ASP.Net will ignore the exception
|
catch (Exception ex) // Otherwise ASP.Net will ignore the exception
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, "WebSocketRequestHandler error");
|
_logger.LogError(ex, "WS {IP} WebSocketRequestHandler error");
|
||||||
if (!context.Response.HasStarted)
|
if (!context.Response.HasStarted)
|
||||||
{
|
{
|
||||||
context.Response.StatusCode = 500;
|
context.Response.StatusCode = 500;
|
||||||
@ -705,8 +705,6 @@ namespace Emby.Server.Implementations.HttpServer
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogDebug("Websocket message received: {0}", result.MessageType);
|
|
||||||
|
|
||||||
IEnumerable<Task> GetTasks()
|
IEnumerable<Task> GetTasks()
|
||||||
{
|
{
|
||||||
foreach (var x in _webSocketListeners)
|
foreach (var x in _webSocketListeners)
|
||||||
|
@ -195,7 +195,7 @@ namespace Emby.Server.Implementations.HttpServer
|
|||||||
// Tell the PipeReader how much of the buffer we have consumed
|
// Tell the PipeReader how much of the buffer we have consumed
|
||||||
reader.AdvanceTo(buffer.End);
|
reader.AdvanceTo(buffer.End);
|
||||||
|
|
||||||
_logger.LogDebug("WS received message: {@Message}", stub);
|
_logger.LogDebug("WS {IP} received message: {@Message}", RemoteEndPoint, stub);
|
||||||
|
|
||||||
var info = new WebSocketMessageInfo
|
var info = new WebSocketMessageInfo
|
||||||
{
|
{
|
||||||
@ -204,7 +204,7 @@ namespace Emby.Server.Implementations.HttpServer
|
|||||||
Connection = this
|
Connection = this
|
||||||
};
|
};
|
||||||
|
|
||||||
_logger.LogDebug("WS message info: {@MessageInfo}", info);
|
_logger.LogDebug("WS {IP} message info: {@MessageInfo}", RemoteEndPoint, info);
|
||||||
|
|
||||||
await OnReceive(info).ConfigureAwait(false);
|
await OnReceive(info).ConfigureAwait(false);
|
||||||
|
|
||||||
|
@ -1,39 +0,0 @@
|
|||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using WebSocketManager = Emby.Server.Implementations.WebSockets.WebSocketManager;
|
|
||||||
|
|
||||||
namespace Emby.Server.Implementations.Middleware
|
|
||||||
{
|
|
||||||
public class WebSocketMiddleware
|
|
||||||
{
|
|
||||||
private readonly RequestDelegate _next;
|
|
||||||
private readonly ILogger<WebSocketMiddleware> _logger;
|
|
||||||
private readonly WebSocketManager _webSocketManager;
|
|
||||||
|
|
||||||
public WebSocketMiddleware(RequestDelegate next, ILogger<WebSocketMiddleware> logger, WebSocketManager webSocketManager)
|
|
||||||
{
|
|
||||||
_next = next;
|
|
||||||
_logger = logger;
|
|
||||||
_webSocketManager = webSocketManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task Invoke(HttpContext httpContext)
|
|
||||||
{
|
|
||||||
_logger.LogInformation("Handling request: " + httpContext.Request.Path);
|
|
||||||
|
|
||||||
if (httpContext.WebSockets.IsWebSocketRequest)
|
|
||||||
{
|
|
||||||
var webSocketContext = await httpContext.WebSockets.AcceptWebSocketAsync(null).ConfigureAwait(false);
|
|
||||||
if (webSocketContext != null)
|
|
||||||
{
|
|
||||||
await _webSocketManager.OnWebSocketConnected(webSocketContext).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
await _next.Invoke(httpContext).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
using System.Threading.Tasks;
|
|
||||||
using MediaBrowser.Model.Net;
|
|
||||||
|
|
||||||
namespace Emby.Server.Implementations.WebSockets
|
|
||||||
{
|
|
||||||
public interface IWebSocketHandler
|
|
||||||
{
|
|
||||||
Task ProcessMessage(WebSocketMessage<object> message, TaskCompletionSource<bool> taskCompletionSource);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,104 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Concurrent;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Net.WebSockets;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using MediaBrowser.Controller.Net;
|
|
||||||
using MediaBrowser.Model.Net;
|
|
||||||
using MediaBrowser.Model.Serialization;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using UtfUnknown;
|
|
||||||
|
|
||||||
namespace Emby.Server.Implementations.WebSockets
|
|
||||||
{
|
|
||||||
public class WebSocketManager
|
|
||||||
{
|
|
||||||
private readonly IWebSocketHandler[] _webSocketHandlers;
|
|
||||||
private readonly IJsonSerializer _jsonSerializer;
|
|
||||||
private readonly ILogger<WebSocketManager> _logger;
|
|
||||||
private const int BufferSize = 4096;
|
|
||||||
|
|
||||||
public WebSocketManager(IWebSocketHandler[] webSocketHandlers, IJsonSerializer jsonSerializer, ILogger<WebSocketManager> logger)
|
|
||||||
{
|
|
||||||
_webSocketHandlers = webSocketHandlers;
|
|
||||||
_jsonSerializer = jsonSerializer;
|
|
||||||
_logger = logger;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task OnWebSocketConnected(WebSocket webSocket)
|
|
||||||
{
|
|
||||||
var taskCompletionSource = new TaskCompletionSource<bool>();
|
|
||||||
var cancellationToken = new CancellationTokenSource().Token;
|
|
||||||
WebSocketReceiveResult result;
|
|
||||||
var message = new List<byte>();
|
|
||||||
|
|
||||||
// Keep listening for incoming messages, otherwise the socket closes automatically
|
|
||||||
do
|
|
||||||
{
|
|
||||||
var buffer = WebSocket.CreateServerBuffer(BufferSize);
|
|
||||||
result = await webSocket.ReceiveAsync(buffer, cancellationToken).ConfigureAwait(false);
|
|
||||||
message.AddRange(buffer.Array.Take(result.Count));
|
|
||||||
|
|
||||||
if (result.EndOfMessage)
|
|
||||||
{
|
|
||||||
await ProcessMessage(message.ToArray(), taskCompletionSource).ConfigureAwait(false);
|
|
||||||
message.Clear();
|
|
||||||
}
|
|
||||||
} while (!taskCompletionSource.Task.IsCompleted &&
|
|
||||||
webSocket.State == WebSocketState.Open &&
|
|
||||||
result.MessageType != WebSocketMessageType.Close);
|
|
||||||
|
|
||||||
if (webSocket.State == WebSocketState.Open)
|
|
||||||
{
|
|
||||||
await webSocket.CloseAsync(
|
|
||||||
result.CloseStatus ?? WebSocketCloseStatus.NormalClosure,
|
|
||||||
result.CloseStatusDescription,
|
|
||||||
cancellationToken).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task ProcessMessage(byte[] messageBytes, TaskCompletionSource<bool> taskCompletionSource)
|
|
||||||
{
|
|
||||||
var charset = CharsetDetector.DetectFromBytes(messageBytes).Detected?.EncodingName;
|
|
||||||
var message = string.Equals(charset, "utf-8", StringComparison.OrdinalIgnoreCase)
|
|
||||||
? Encoding.UTF8.GetString(messageBytes, 0, messageBytes.Length)
|
|
||||||
: Encoding.ASCII.GetString(messageBytes, 0, messageBytes.Length);
|
|
||||||
|
|
||||||
// All messages are expected to be valid JSON objects
|
|
||||||
if (!message.StartsWith("{", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
_logger.LogDebug("Received web socket message that is not a json structure: {Message}", message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var info = _jsonSerializer.DeserializeFromString<WebSocketMessage<object>>(message);
|
|
||||||
|
|
||||||
_logger.LogDebug("Websocket message received: {0}", info.MessageType);
|
|
||||||
|
|
||||||
var tasks = _webSocketHandlers.Select(handler => Task.Run(() =>
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
handler.ProcessMessage(info, taskCompletionSource).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "{HandlerType} failed processing WebSocket message {MessageType}",
|
|
||||||
handler.GetType().Name, info.MessageType ?? string.Empty);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
await Task.WhenAll(tasks);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "Error processing web socket message");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +1,4 @@
|
|||||||
using System.Collections.Generic;
|
using System;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using MediaBrowser.Controller.Net;
|
using MediaBrowser.Controller.Net;
|
||||||
using MediaBrowser.Model.Activity;
|
using MediaBrowser.Model.Activity;
|
||||||
@ -11,7 +10,7 @@ namespace MediaBrowser.Api.System
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Class SessionInfoWebSocketListener
|
/// Class SessionInfoWebSocketListener
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ActivityLogWebSocketListener : BasePeriodicWebSocketListener<List<ActivityLogEntry>, WebSocketListenerState>
|
public class ActivityLogWebSocketListener : BasePeriodicWebSocketListener<ActivityLogEntry[], WebSocketListenerState>
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the name.
|
/// Gets the name.
|
||||||
@ -27,10 +26,10 @@ namespace MediaBrowser.Api.System
|
|||||||
public ActivityLogWebSocketListener(ILogger logger, IActivityManager activityManager) : base(logger)
|
public ActivityLogWebSocketListener(ILogger logger, IActivityManager activityManager) : base(logger)
|
||||||
{
|
{
|
||||||
_activityManager = activityManager;
|
_activityManager = activityManager;
|
||||||
_activityManager.EntryCreated += _activityManager_EntryCreated;
|
_activityManager.EntryCreated += OnEntryCreated;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _activityManager_EntryCreated(object sender, GenericEventArgs<ActivityLogEntry> e)
|
private void OnEntryCreated(object sender, GenericEventArgs<ActivityLogEntry> e)
|
||||||
{
|
{
|
||||||
SendData(true);
|
SendData(true);
|
||||||
}
|
}
|
||||||
@ -39,15 +38,15 @@ namespace MediaBrowser.Api.System
|
|||||||
/// Gets the data to send.
|
/// Gets the data to send.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>Task{SystemInfo}.</returns>
|
/// <returns>Task{SystemInfo}.</returns>
|
||||||
protected override Task<List<ActivityLogEntry>> GetDataToSend()
|
protected override Task<ActivityLogEntry[]> GetDataToSend()
|
||||||
{
|
{
|
||||||
return Task.FromResult(new List<ActivityLogEntry>());
|
return Task.FromResult(Array.Empty<ActivityLogEntry>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
protected override void Dispose(bool dispose)
|
protected override void Dispose(bool dispose)
|
||||||
{
|
{
|
||||||
_activityManager.EntryCreated -= _activityManager_EntryCreated;
|
_activityManager.EntryCreated -= OnEntryCreated;
|
||||||
|
|
||||||
base.Dispose(dispose);
|
base.Dispose(dispose);
|
||||||
}
|
}
|
||||||
|
@ -77,8 +77,6 @@ namespace MediaBrowser.Controller.Net
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected readonly CultureInfo UsCulture = new CultureInfo("en-US");
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Starts sending messages over a web socket
|
/// Starts sending messages over a web socket
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -87,12 +85,12 @@ namespace MediaBrowser.Controller.Net
|
|||||||
{
|
{
|
||||||
var vals = message.Data.Split(',');
|
var vals = message.Data.Split(',');
|
||||||
|
|
||||||
var dueTimeMs = long.Parse(vals[0], UsCulture);
|
var dueTimeMs = long.Parse(vals[0], CultureInfo.InvariantCulture);
|
||||||
var periodMs = long.Parse(vals[1], UsCulture);
|
var periodMs = long.Parse(vals[1], CultureInfo.InvariantCulture);
|
||||||
|
|
||||||
var cancellationTokenSource = new CancellationTokenSource();
|
var cancellationTokenSource = new CancellationTokenSource();
|
||||||
|
|
||||||
Logger.LogDebug("{1} Begin transmitting over websocket to {0}", message.Connection.RemoteEndPoint, GetType().Name);
|
Logger.LogDebug("WS {1} begin transmitting to {0}", message.Connection.RemoteEndPoint, GetType().Name);
|
||||||
|
|
||||||
var state = new TStateType
|
var state = new TStateType
|
||||||
{
|
{
|
||||||
@ -196,7 +194,7 @@ namespace MediaBrowser.Controller.Net
|
|||||||
/// <param name="connection">The connection.</param>
|
/// <param name="connection">The connection.</param>
|
||||||
private void DisposeConnection(Tuple<IWebSocketConnection, CancellationTokenSource, TStateType> connection)
|
private void DisposeConnection(Tuple<IWebSocketConnection, CancellationTokenSource, TStateType> connection)
|
||||||
{
|
{
|
||||||
Logger.LogDebug("{1} stop transmitting over websocket to {0}", connection.Item1.RemoteEndPoint, GetType().Name);
|
Logger.LogDebug("WS {1} stop transmitting to {0}", connection.Item1.RemoteEndPoint, GetType().Name);
|
||||||
|
|
||||||
// TODO disposing the connection seems to break websockets in subtle ways, so what is the purpose of this function really...
|
// TODO disposing the connection seems to break websockets in subtle ways, so what is the purpose of this function really...
|
||||||
// connection.Item1.Dispose();
|
// connection.Item1.Dispose();
|
||||||
@ -241,6 +239,7 @@ namespace MediaBrowser.Controller.Net
|
|||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
Dispose(true);
|
Dispose(true);
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user