From 9c0a8350d6aa6fd13e418b5322a60dc5f720fa3a Mon Sep 17 00:00:00 2001 From: Vasily Date: Wed, 9 Oct 2019 19:24:41 +0300 Subject: Merge pull request #1863 from joshuaboniface/fix-baseurl-issues Fix inconsistent BaseUrl behavior (cherry picked from commit 1176749f143cf5d5b5878a39de77247a1ced1e03) Signed-off-by: Joshua Boniface --- .../HttpServer/HttpListenerHost.cs | 73 ++++++++++------------ 1 file changed, 34 insertions(+), 39 deletions(-) (limited to 'Emby.Server.Implementations/HttpServer/HttpListenerHost.cs') diff --git a/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs b/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs index d60f5c055..ecd35a1a8 100644 --- a/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs +++ b/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs @@ -39,6 +39,7 @@ namespace Emby.Server.Implementations.HttpServer private readonly IHttpListener _socketListener; private readonly Func> _funcParseFn; private readonly string _defaultRedirectPath; + private readonly string _baseUrlPrefix; private readonly Dictionary ServiceOperationsMap = new Dictionary(); private IWebSocketListener[] _webSocketListeners = Array.Empty(); private readonly List _webSocketConnections = new List(); @@ -58,6 +59,7 @@ namespace Emby.Server.Implementations.HttpServer _logger = logger; _config = config; _defaultRedirectPath = configuration["HttpListenerHost:DefaultRedirectPath"]; + _baseUrlPrefix = _config.Configuration.BaseUrl; _networkManager = networkManager; _jsonSerializer = jsonSerializer; _xmlSerializer = xmlSerializer; @@ -87,6 +89,20 @@ namespace Emby.Server.Implementations.HttpServer return _appHost.CreateInstance(type); } + private static 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; + } + } + /// /// Applies the request filters. Returns whether or not the request has been handled /// and no more processing should be done. @@ -471,22 +487,15 @@ namespace Emby.Server.Implementations.HttpServer urlToLog = GetUrlToLog(urlString); - if (string.Equals(localPath, "/" + _config.Configuration.BaseUrl + "/", StringComparison.OrdinalIgnoreCase) - || string.Equals(localPath, "/" + _config.Configuration.BaseUrl, StringComparison.OrdinalIgnoreCase)) - { - httpRes.Redirect("/" + _config.Configuration.BaseUrl + "/" + _defaultRedirectPath); - return; - } - - if (string.Equals(localPath, "/", StringComparison.OrdinalIgnoreCase)) + if (string.Equals(localPath, _baseUrlPrefix + "/", StringComparison.OrdinalIgnoreCase) + || string.Equals(localPath, _baseUrlPrefix, StringComparison.OrdinalIgnoreCase) + || string.Equals(localPath, "/", StringComparison.OrdinalIgnoreCase) + || string.IsNullOrEmpty(localPath) + || !localPath.StartsWith(_baseUrlPrefix)) { - httpRes.Redirect(_defaultRedirectPath); - return; - } - - if (string.IsNullOrEmpty(localPath)) - { - httpRes.Redirect("/" + _defaultRedirectPath); + // Always redirect back to the default path if the base prefix is invalid or missing + _logger.LogDebug("Normalizing a URL at {0}", localPath); + httpRes.Redirect(_baseUrlPrefix + "/" + _defaultRedirectPath); return; } @@ -596,7 +605,7 @@ namespace Emby.Server.Implementations.HttpServer 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, Priority = route.Priority, @@ -651,36 +660,22 @@ namespace Emby.Server.Implementations.HttpServer return _socketListener.ProcessWebSocketRequest(context); } - // this method was left for compatibility with third party clients - private static string NormalizeEmbyRoutePath(string path) + private string NormalizeEmbyRoutePath(string path) { - if (path.StartsWith("/", StringComparison.OrdinalIgnoreCase)) - { - return "/emby" + path; - } - - return "emby/" + path; + _logger.LogDebug("Normalizing /emby route"); + return _baseUrlPrefix + "/emby" + NormalizeUrlPath(path); } - // this method was left for compatibility with third party clients - private static string NormalizeMediaBrowserRoutePath(string path) + private string NormalizeMediaBrowserRoutePath(string path) { - if (path.StartsWith("/", StringComparison.OrdinalIgnoreCase)) - { - return "/mediabrowser" + path; - } - - return "mediabrowser/" + path; + _logger.LogDebug("Normalizing /mediabrowser route"); + return _baseUrlPrefix + "/mediabrowser" + NormalizeUrlPath(path); } - private static string NormalizeCustomRoutePath(string baseUrl, string path) + private string NormalizeCustomRoutePath(string path) { - if (path.StartsWith("/", StringComparison.OrdinalIgnoreCase)) - { - return "/" + baseUrl + path; - } - - return baseUrl + "/" + path; + _logger.LogDebug("Normalizing custom route {0}", path); + return _baseUrlPrefix + NormalizeUrlPath(path); } /// -- cgit v1.2.3