@ -10,7 +10,6 @@ using System.Reflection;
using System.Text ;
using System.Threading ;
using System.Threading.Tasks ;
using Emby.Server.Implementations.HttpServer ;
using Emby.Server.Implementations.HttpServer.SocketSharp ;
using Emby.Server.Implementations.Services ;
using MediaBrowser.Common.Net ;
@ -34,7 +33,7 @@ namespace Emby.Server.Implementations.HttpServer
private string DefaultRedirectPath { get ; set ; }
private readonly ILogger _logger ;
public IEnumerable < string > UrlPrefixes { get ; private set ; }
public string [ ] UrlPrefixes { get ; private set ; }
private readonly List < IService > _restServices = new List < IService > ( ) ;
@ -62,8 +61,8 @@ namespace Emby.Server.Implementations.HttpServer
private readonly Func < Type , Func < string , object > > _funcParseFn ;
private readonly bool _enableDualModeSockets ;
public List< Action< IRequest , IResponse , object > > RequestFilters { get ; set ; }
public List< Action< IRequest , IResponse , object > > ResponseFilters { get ; set ; }
public Action< IRequest , IResponse , object > [] RequestFilters { get ; set ; }
public Action< IRequest , IResponse , object > [] ResponseFilters { get ; set ; }
private readonly Dictionary < Type , Type > ServiceOperationsMap = new Dictionary < Type , Type > ( ) ;
public static HttpListenerHost Instance { get ; protected set ; }
@ -95,8 +94,8 @@ namespace Emby.Server.Implementations.HttpServer
_logger = logger ;
RequestFilters = new List< Action< IRequest , IResponse , object > >( ) ;
ResponseFilters = new List< Action< IRequest , IResponse , object > >( ) ;
RequestFilters = new Action< IRequest , IResponse , object > [] { } ;
ResponseFilters = new Action< IRequest , IResponse , object > [] { } ;
}
public string GlobalResponse { get ; set ; }
@ -135,7 +134,9 @@ namespace Emby.Server.Implementations.HttpServer
//Exec all RequestFilter attributes with Priority < 0
var attributes = GetRequestFilterAttributes ( requestDto . GetType ( ) ) ;
var i = 0 ;
for ( ; i < attributes . Length & & attributes [ i ] . Priority < 0 ; i + + )
var count = attributes . Count ;
for ( ; i < count & & attributes [ i ] . Priority < 0 ; i + + )
{
var attribute = attributes [ i ] ;
attribute . RequestFilter ( req , res , requestDto ) ;
@ -148,7 +149,7 @@ namespace Emby.Server.Implementations.HttpServer
}
//Exec remaining RequestFilter attributes with Priority >= 0
for ( ; i < attributes. Length & & attributes [ i ] . Priority > = 0 ; i + + )
for ( ; i < count & & attributes [ i ] . Priority > = 0 ; i + + )
{
var attribute = attributes [ i ] ;
attribute . RequestFilter ( req , res , requestDto ) ;
@ -167,7 +168,7 @@ namespace Emby.Server.Implementations.HttpServer
ServiceOperationsMap [ requestType ] = serviceType ;
}
private IHasRequestFilter[ ] GetRequestFilterAttributes ( Type requestDtoType )
private List< IHasRequestFilter > GetRequestFilterAttributes ( Type requestDtoType )
{
var attributes = requestDtoType . GetTypeInfo ( ) . GetCustomAttributes ( true ) . OfType < IHasRequestFilter > ( ) . ToList ( ) ;
@ -179,24 +180,7 @@ namespace Emby.Server.Implementations.HttpServer
attributes . Sort ( ( x , y ) = > x . Priority - y . Priority ) ;
return attributes . ToArray ( attributes . Count ) ;
}
/// <summary>
/// Starts the Web Service
/// </summary>
private void StartListener ( )
{
WebSocketSharpRequest . HandlerFactoryPath = GetHandlerPathIfAny ( UrlPrefixes . First ( ) ) ;
_listener = GetListener ( ) ;
_listener . WebSocketConnected = OnWebSocketConnected ;
_listener . WebSocketConnecting = OnWebSocketConnecting ;
_listener . ErrorHandler = ErrorHandler ;
_listener . RequestHandler = RequestHandler ;
_listener . Start ( UrlPrefixes ) ;
return attributes ;
}
public static string GetHandlerPathIfAny ( string listenerUrl )
@ -698,13 +682,18 @@ namespace Emby.Server.Implementations.HttpServer
ServiceController . Init ( this , types ) ;
var requestFilters = _appHost . GetExports < IRequestFilter > ( ) . ToList ( ) ;
foreach ( var filter in requestFilters )
var list = new List < Action < IRequest , IResponse , object > > ( ) ;
foreach ( var filter in _appHost. GetExports < IRequestFilter > ( ) )
{
RequestFi lters . Add ( filter . Filter ) ;
lis t. Add ( filter . Filter ) ;
}
ResponseFilters . Add ( new ResponseFilter ( _logger ) . FilterResponse ) ;
RequestFilters = list . ToArray ( ) ;
ResponseFilters = new Action < IRequest , IResponse , object > [ ]
{
new ResponseFilter ( _logger ) . FilterResponse
} ;
}
public RouteAttribute [ ] GetRouteAttributes ( Type requestType )
@ -819,10 +808,20 @@ namespace Emby.Server.Implementations.HttpServer
GC . SuppressFinalize ( this ) ;
}
public void StartServer ( IEnumerable < string > urlPrefixes )
public void StartServer ( string [ ] urlPrefixes )
{
UrlPrefixes = urlPrefixes . ToList ( ) ;
StartListener ( ) ;
UrlPrefixes = urlPrefixes ;
WebSocketSharpRequest . HandlerFactoryPath = GetHandlerPathIfAny ( UrlPrefixes [ 0 ] ) ;
_listener = GetListener ( ) ;
_listener . WebSocketConnected = OnWebSocketConnected ;
_listener . WebSocketConnecting = OnWebSocketConnecting ;
_listener . ErrorHandler = ErrorHandler ;
_listener . RequestHandler = RequestHandler ;
_listener . Start ( UrlPrefixes ) ;
}
}
}