connect to socket with access token

This commit is contained in:
Luke Pulverenti
2015-03-08 15:48:30 -04:00
parent 55c47e50fc
commit ccb2dda358
13 changed files with 247 additions and 21 deletions

View File

@@ -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)
{

View File

@@ -24,8 +24,14 @@ 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>

View File

@@ -23,6 +23,10 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
{
var authorization = _authContext.GetAuthorizationInfo(requestContext);
if (!string.IsNullOrWhiteSpace(authorization.Token))
{
return _sessionManager.GetSessionByAuthenticationToken(authorization.Token);
}
return _sessionManager.GetSession(authorization.DeviceId, authorization.Client, authorization.Version);
}

View File

@@ -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,43 @@ 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);
if (WebSocketHandler != null)
var connectingArgs = new WebSocketConnectingEventArgs
{
WebSocketHandler(new WebSocketConnectEventArgs
Url = url,
QueryString = queryString,
Endpoint = endpoint
};
if (WebSocketConnecting != null)
{
WebSocketConnecting(connectingArgs);
}
if (connectingArgs.AllowConnection)
{
_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.Close();
}
}
catch (Exception ex)