aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/HttpServer
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/HttpServer')
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs14
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs8
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/IHttpListener.cs8
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs12
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/Security/SessionContext.cs32
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs13
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs52
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/StreamWriter.cs12
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);
}