@ -39,6 +39,7 @@ namespace Emby.Server.Implementations.HttpServer
private readonly IHttpListener _socketListener ;
private readonly IHttpListener _socketListener ;
private readonly Func < Type , Func < string , object > > _funcParseFn ;
private readonly Func < Type , Func < string , object > > _funcParseFn ;
private readonly string _defaultRedirectPath ;
private readonly string _defaultRedirectPath ;
private readonly string _baseUrlPrefix ;
private readonly Dictionary < Type , Type > ServiceOperationsMap = new Dictionary < Type , Type > ( ) ;
private readonly Dictionary < Type , Type > ServiceOperationsMap = new Dictionary < Type , Type > ( ) ;
private IWebSocketListener [ ] _webSocketListeners = Array . Empty < IWebSocketListener > ( ) ;
private IWebSocketListener [ ] _webSocketListeners = Array . Empty < IWebSocketListener > ( ) ;
private readonly List < IWebSocketConnection > _webSocketConnections = new List < IWebSocketConnection > ( ) ;
private readonly List < IWebSocketConnection > _webSocketConnections = new List < IWebSocketConnection > ( ) ;
@ -58,6 +59,7 @@ namespace Emby.Server.Implementations.HttpServer
_logger = logger ;
_logger = logger ;
_config = config ;
_config = config ;
_defaultRedirectPath = configuration [ "HttpListenerHost:DefaultRedirectPath" ] ;
_defaultRedirectPath = configuration [ "HttpListenerHost:DefaultRedirectPath" ] ;
_baseUrlPrefix = _config . Configuration . BaseUrl ;
_networkManager = networkManager ;
_networkManager = networkManager ;
_jsonSerializer = jsonSerializer ;
_jsonSerializer = jsonSerializer ;
_xmlSerializer = xmlSerializer ;
_xmlSerializer = xmlSerializer ;
@ -87,6 +89,20 @@ namespace Emby.Server.Implementations.HttpServer
return _appHost . CreateInstance ( type ) ;
return _appHost . CreateInstance ( type ) ;
}
}
private string NormalizeUrlPath ( string path )
{
if ( path . StartsWith ( "/" ) )
{
// If the path begins with a leading slash, just return it as-is
return path ;
}
else
{
// If the path does not begin with a leading slash, append one for consistency
return "/" + path ;
}
}
/// <summary>
/// <summary>
/// Applies the request filters. Returns whether or not the request has been handled
/// Applies the request filters. Returns whether or not the request has been handled
/// and no more processing should be done.
/// and no more processing should be done.
@ -471,22 +487,15 @@ namespace Emby.Server.Implementations.HttpServer
urlToLog = GetUrlToLog ( urlString ) ;
urlToLog = GetUrlToLog ( urlString ) ;
if ( string . Equals ( localPath , "/" + _config . Configuration . BaseUrl + "/" , StringComparison . OrdinalIgnoreCase )
if ( string . Equals ( localPath , _baseUrlPrefix + "/" , StringComparison . OrdinalIgnoreCase )
| | string . Equals ( localPath , "/" + _config . Configuration . BaseUrl , StringComparison . OrdinalIgnoreCase ) )
| | string . Equals ( localPath , _baseUrlPrefix , StringComparison . OrdinalIgnoreCase )
{
| | string . Equals ( localPath , "/" , StringComparison . OrdinalIgnoreCase )
httpRes . Redirect ( "/" + _config . Configuration . BaseUrl + "/" + _defaultRedirectPath ) ;
| | string . IsNullOrEmpty ( localPath )
return ;
| | ! localPath . StartsWith ( _baseUrlPrefix ) )
}
if ( string . Equals ( localPath , "/" , StringComparison . OrdinalIgnoreCase ) )
{
{
httpRes . Redirect ( _defaultRedirectPath ) ;
// Always redirect back to the default path if the base prefix is invalid or missing
return ;
_logger . LogDebug ( "Normalizing a URL at {0}" , localPath ) ;
}
httpRes . Redirect ( _baseUrlPrefix + "/" + _defaultRedirectPath ) ;
if ( string . IsNullOrEmpty ( localPath ) )
{
httpRes . Redirect ( "/" + _defaultRedirectPath ) ;
return ;
return ;
}
}
@ -596,7 +605,7 @@ namespace Emby.Server.Implementations.HttpServer
foreach ( var route in clone )
foreach ( var route in clone )
{
{
routes . Add ( new RouteAttribute ( NormalizeCustomRoutePath ( _config. Configuration . BaseUrl , route. Path ) , route . Verbs )
routes . Add ( new RouteAttribute ( NormalizeCustomRoutePath ( route. Path ) , route . Verbs )
{
{
Notes = route . Notes ,
Notes = route . Notes ,
Priority = route . Priority ,
Priority = route . Priority ,
@ -651,36 +660,22 @@ namespace Emby.Server.Implementations.HttpServer
return _socketListener . ProcessWebSocketRequest ( context ) ;
return _socketListener . ProcessWebSocketRequest ( context ) ;
}
}
// this method was left for compatibility with third party clients
private string NormalizeEmbyRoutePath ( string path )
private static string NormalizeEmbyRoutePath ( string path )
{
{
if ( path . StartsWith ( "/" , StringComparison . OrdinalIgnoreCase ) )
_logger . LogDebug ( "Normalizing /emby route" ) ;
{
return _baseUrlPrefix + "/emby" + NormalizeUrlPath ( path ) ;
return "/emby" + path ;
}
return "emby/" + path ;
}
}
// this method was left for compatibility with third party clients
private string NormalizeMediaBrowserRoutePath ( string path )
private static string NormalizeMediaBrowserRoutePath ( string path )
{
{
if ( path . StartsWith ( "/" , StringComparison . OrdinalIgnoreCase ) )
_logger . LogDebug ( "Normalizing /mediabrowser route" ) ;
{
return _baseUrlPrefix + "/mediabrowser" + NormalizeUrlPath ( path ) ;
return "/mediabrowser" + path ;
}
return "mediabrowser/" + path ;
}
}
private static string NormalizeCustomRoutePath ( string baseUrl , string path )
private string NormalizeCustomRoutePath ( string path )
{
{
if ( path . StartsWith ( "/" , StringComparison . OrdinalIgnoreCase ) )
_logger . LogDebug ( "Normalizing custom route {0}" , path ) ;
{
return _baseUrlPrefix + NormalizeUrlPath ( path ) ;
return "/" + baseUrl + path ;
}
return baseUrl + "/" + path ;
}
}
/// <inheritdoc />
/// <inheritdoc />