| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | using System;using System.Threading.Tasks;using MediaBrowser.Controller.Net;using MediaBrowser.Controller.Session;using MediaBrowser.Model.Events;using MediaBrowser.Model.Serialization;using MediaBrowser.Model.Services;using Microsoft.AspNetCore.Http;using Microsoft.Extensions.Logging;namespace Emby.Server.Implementations.Session{    /// <summary>    /// Class SessionWebSocketListener    /// </summary>    public class SessionWebSocketListener : IWebSocketListener, IDisposable    {        /// <summary>        /// The _session manager        /// </summary>        private readonly ISessionManager _sessionManager;        /// <summary>        /// The _logger        /// </summary>        private readonly ILogger _logger;        /// <summary>        /// The _dto service        /// </summary>        private readonly IJsonSerializer _json;        private readonly IHttpServer _httpServer;        /// <summary>        /// Initializes a new instance of the <see cref="SessionWebSocketListener" /> class.        /// </summary>        /// <param name="sessionManager">The session manager.</param>        /// <param name="loggerFactory">The logger factory.</param>        /// <param name="json">The json.</param>        /// <param name="httpServer">The HTTP server.</param>        public SessionWebSocketListener(ISessionManager sessionManager, ILoggerFactory loggerFactory, IJsonSerializer json, IHttpServer httpServer)        {            _sessionManager = sessionManager;            _logger = loggerFactory.CreateLogger(GetType().Name);            _json = json;            _httpServer = httpServer;            httpServer.WebSocketConnected += _serverManager_WebSocketConnected;        }        void _serverManager_WebSocketConnected(object sender, GenericEventArgs<IWebSocketConnection> e)        {            var session = GetSession(e.Argument.QueryString, e.Argument.RemoteEndPoint);            if (session != null)            {                EnsureController(session, e.Argument);            }            else            {                _logger.LogWarning("Unable to determine session based on url: {0}", e.Argument.Url);            }        }        private SessionInfo GetSession(IQueryCollection queryString, string remoteEndpoint)        {            if (queryString == null)            {                throw new ArgumentNullException(nameof(queryString));            }            var token = queryString["api_key"];            if (string.IsNullOrWhiteSpace(token))            {                return null;            }            var deviceId = queryString["deviceId"];            return _sessionManager.GetSessionByAuthenticationToken(token, deviceId, remoteEndpoint);        }        public void Dispose()        {            _httpServer.WebSocketConnected -= _serverManager_WebSocketConnected;        }        /// <summary>        /// Processes the message.        /// </summary>        /// <param name="message">The message.</param>        /// <returns>Task.</returns>        public Task ProcessMessageAsync(WebSocketMessageInfo message)            => Task.CompletedTask;        private void EnsureController(SessionInfo session, IWebSocketConnection connection)        {            var controllerInfo = session.EnsureController<WebSocketController>(s => new WebSocketController(s, _logger, _sessionManager));            var controller = (WebSocketController)controllerInfo.Item1;            controller.AddWebSocket(connection);        }    }}
 |