diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations/HttpServer')
8 files changed, 96 insertions, 55 deletions
diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs index 4727e6035..f91054206 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs @@ -35,6 +35,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer private readonly ContainerAdapter _containerAdapter; public event EventHandler<WebSocketConnectEventArgs> WebSocketConnected; + public event EventHandler<WebSocketConnectingEventArgs> WebSocketConnecting; private readonly List<string> _localEndpoints = new List<string>(); @@ -196,7 +197,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer _listener = GetListener(); - _listener.WebSocketHandler = WebSocketHandler; + _listener.WebSocketConnected = OnWebSocketConnected; + _listener.WebSocketConnecting = OnWebSocketConnecting; _listener.ErrorHandler = ErrorHandler; _listener.RequestHandler = RequestHandler; @@ -208,7 +210,15 @@ namespace MediaBrowser.Server.Implementations.HttpServer return new WebSocketSharpListener(_logger, OnRequestReceived, CertificatePath); } - private void WebSocketHandler(WebSocketConnectEventArgs args) + private void OnWebSocketConnecting(WebSocketConnectingEventArgs args) + { + if (WebSocketConnecting != null) + { + WebSocketConnecting(this, args); + } + } + + private void OnWebSocketConnected(WebSocketConnectEventArgs args) { if (WebSocketConnected != null) { diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs index 681d3ac5e..ecf58e4a6 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs @@ -461,10 +461,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer { return new RangeRequestWriter(rangeHeader, stream, contentType, isHeadRequest) { - Throttle = options.Throttle, - ThrottleLimit = options.ThrottleLimit, - MinThrottlePosition = options.MinThrottlePosition, - ThrottleCallback = options.ThrottleCallback, OnComplete = options.OnComplete }; } @@ -480,10 +476,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer return new StreamWriter(stream, contentType, _logger) { - Throttle = options.Throttle, - ThrottleLimit = options.ThrottleLimit, - MinThrottlePosition = options.MinThrottlePosition, - ThrottleCallback = options.ThrottleCallback, OnComplete = options.OnComplete }; } diff --git a/MediaBrowser.Server.Implementations/HttpServer/IHttpListener.cs b/MediaBrowser.Server.Implementations/HttpServer/IHttpListener.cs index e77600e93..dc315601f 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/IHttpListener.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/IHttpListener.cs @@ -24,9 +24,15 @@ namespace MediaBrowser.Server.Implementations.HttpServer /// Gets or sets the web socket handler. /// </summary> /// <value>The web socket handler.</value> - Action<WebSocketConnectEventArgs> WebSocketHandler { get; set; } + Action<WebSocketConnectEventArgs> WebSocketConnected { get; set; } /// <summary> + /// Gets or sets the web socket connecting. + /// </summary> + /// <value>The web socket connecting.</value> + Action<WebSocketConnectingEventArgs> WebSocketConnecting { get; set; } + + /// <summary> /// Starts this instance. /// </summary> /// <param name="urlPrefixes">The URL prefixes.</param> diff --git a/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs b/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs index cdd4c6d7c..8c72f9e7e 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs @@ -24,10 +24,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer private long RangeLength { get; set; } private long TotalContentLength { get; set; } - public bool Throttle { get; set; } - public long ThrottleLimit { get; set; } - public long MinThrottlePosition; - public Func<long, long, long> ThrottleCallback { get; set; } public Action OnComplete { get; set; } /// <summary> @@ -165,14 +161,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer /// <param name="responseStream">The response stream.</param> public void WriteTo(Stream responseStream) { - if (Throttle) - { - responseStream = new ThrottledStream(responseStream, ThrottleLimit) - { - MinThrottlePosition = MinThrottlePosition, - ThrottleCallback = ThrottleCallback - }; - } WriteToInternal(responseStream); } diff --git a/MediaBrowser.Server.Implementations/HttpServer/Security/SessionContext.cs b/MediaBrowser.Server.Implementations/HttpServer/Security/SessionContext.cs index 9d1ddb7fc..1bbe9893b 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/Security/SessionContext.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/Security/SessionContext.cs @@ -1,8 +1,10 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Net; +using MediaBrowser.Controller.Security; using MediaBrowser.Controller.Session; using ServiceStack.Web; +using System.Threading.Tasks; namespace MediaBrowser.Server.Implementations.HttpServer.Security { @@ -19,27 +21,41 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security _sessionManager = sessionManager; } - public SessionInfo GetSession(IServiceRequest requestContext) + public Task<SessionInfo> GetSession(IServiceRequest requestContext) { var authorization = _authContext.GetAuthorizationInfo(requestContext); - return _sessionManager.GetSession(authorization.DeviceId, authorization.Client, authorization.Version); + if (!string.IsNullOrWhiteSpace(authorization.Token)) + { + var auth = GetTokenInfo(requestContext); + return _sessionManager.GetSessionByAuthenticationToken(auth, authorization.DeviceId, requestContext.RemoteIp, authorization.Version); + } + + var session = _sessionManager.GetSession(authorization.DeviceId, authorization.Client, authorization.Version); + return Task.FromResult(session); } - public User GetUser(IServiceRequest requestContext) + private AuthenticationInfo GetTokenInfo(IServiceRequest request) { - var session = GetSession(requestContext); - - return session == null || !session.UserId.HasValue ? null : _userManager.GetUserById(session.UserId.Value); + object info; + request.Items.TryGetValue("OriginalAuthenticationInfo", out info); + return info as AuthenticationInfo; } - public SessionInfo GetSession(object requestContext) + public Task<SessionInfo> GetSession(object requestContext) { var req = new ServiceStackServiceRequest((IRequest)requestContext); return GetSession(req); } - public User GetUser(object requestContext) + public async Task<User> GetUser(IServiceRequest requestContext) + { + var session = await GetSession(requestContext).ConfigureAwait(false); + + return session == null || !session.UserId.HasValue ? null : _userManager.GetUserById(session.UserId.Value); + } + + public Task<User> GetUser(object requestContext) { var req = new ServiceStackServiceRequest((IRequest)requestContext); return GetUser(req); diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs index 9dcb679f4..8ab8b0215 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs @@ -2,6 +2,7 @@ using MediaBrowser.Controller.Net; using MediaBrowser.Model.Logging; using System; +using System.IO; using System.Threading; using System.Threading.Tasks; using WebSocketState = MediaBrowser.Model.Net.WebSocketState; @@ -65,7 +66,15 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp void socket_OnMessage(object sender, SocketHttpListener.MessageEventArgs e) { - if (OnReceive != null) + //if (!string.IsNullOrWhiteSpace(e.Data)) + //{ + // if (OnReceive != null) + // { + // OnReceive(e.Data); + // } + // return; + //} + if (OnReceiveBytes != null) { OnReceiveBytes(e.RawData); } @@ -141,7 +150,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp WebSocket.OnMessage -= socket_OnMessage; WebSocket.OnClose -= socket_OnClose; WebSocket.OnError -= socket_OnError; - + _cancellationTokenSource.Cancel(); WebSocket.Close(); diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs index 0c5c9e9bf..fdb27d40d 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Net; +using System.Collections.Specialized; +using MediaBrowser.Controller.Net; using MediaBrowser.Model.Logging; using MediaBrowser.Server.Implementations.Logging; using ServiceStack; @@ -18,9 +19,9 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp private readonly ILogger _logger; private readonly Action<string> _endpointListener; - private readonly string _certificatePath ; + private readonly string _certificatePath; - public WebSocketSharpListener(ILogger logger, Action<string> endpointListener, + public WebSocketSharpListener(ILogger logger, Action<string> endpointListener, string certificatePath) { _logger = logger; @@ -32,7 +33,9 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp public Func<IHttpRequest, Uri, Task> RequestHandler { get; set; } - public Action<WebSocketConnectEventArgs> WebSocketHandler { get; set; } + public Action<WebSocketConnectingEventArgs> WebSocketConnecting { get; set; } + + public Action<WebSocketConnectEventArgs> WebSocketConnected { get; set; } public void Start(IEnumerable<string> urlPrefixes) { @@ -115,15 +118,44 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp { try { - var webSocketContext = ctx.AcceptWebSocket(null); + var endpoint = ctx.Request.RemoteEndPoint.ToString(); + var url = ctx.Request.RawUrl; + var queryString = new NameValueCollection(ctx.Request.QueryString ?? new NameValueCollection()); + + var connectingArgs = new WebSocketConnectingEventArgs + { + Url = url, + QueryString = queryString, + Endpoint = endpoint + }; + + if (WebSocketConnecting != null) + { + WebSocketConnecting(connectingArgs); + } - if (WebSocketHandler != null) + if (connectingArgs.AllowConnection) { - WebSocketHandler(new WebSocketConnectEventArgs + _logger.Debug("Web socket connection allowed"); + + var webSocketContext = ctx.AcceptWebSocket(null); + + if (WebSocketConnected != null) { - WebSocket = new SharpWebSocket(webSocketContext.WebSocket, _logger), - Endpoint = ctx.Request.RemoteEndPoint.ToString() - }); + WebSocketConnected(new WebSocketConnectEventArgs + { + Url = url, + QueryString = queryString, + WebSocket = new SharpWebSocket(webSocketContext.WebSocket, _logger), + Endpoint = endpoint + }); + } + } + else + { + _logger.Warn("Web socket connection not allowed"); + ctx.Response.StatusCode = 401; + ctx.Response.Close(); } } catch (Exception ex) diff --git a/MediaBrowser.Server.Implementations/HttpServer/StreamWriter.cs b/MediaBrowser.Server.Implementations/HttpServer/StreamWriter.cs index 1db14e887..fe662542e 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/StreamWriter.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/StreamWriter.cs @@ -35,10 +35,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer get { return _options; } } - public bool Throttle { get; set; } - public long ThrottleLimit { get; set; } - public long MinThrottlePosition; - public Func<long, long, long> ThrottleCallback { get; set; } public Action OnComplete { get; set; } /// <summary> @@ -82,14 +78,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer /// <param name="responseStream">The response stream.</param> public void WriteTo(Stream responseStream) { - if (Throttle) - { - responseStream = new ThrottledStream(responseStream, ThrottleLimit) - { - MinThrottlePosition = MinThrottlePosition, - ThrottleCallback = ThrottleCallback - }; - } WriteToInternal(responseStream); } |
