Przeglądaj źródła

Merge pull request #1863 from joshuaboniface/fix-baseurl-issues

Fix inconsistent BaseUrl behavior

(cherry picked from commit 1176749f143cf5d5b5878a39de77247a1ced1e03)
Signed-off-by: Joshua Boniface <joshua@boniface.me>
Vasily 5 lat temu
rodzic
commit
9c0a8350d6

+ 34 - 39
Emby.Server.Implementations/HttpServer/HttpListenerHost.cs

@@ -39,6 +39,7 @@ namespace Emby.Server.Implementations.HttpServer
         private readonly IHttpListener _socketListener;
         private readonly Func<Type, Func<string, object>> _funcParseFn;
         private readonly string _defaultRedirectPath;
+        private readonly string _baseUrlPrefix;
         private readonly Dictionary<Type, Type> ServiceOperationsMap = new Dictionary<Type, Type>();
         private IWebSocketListener[] _webSocketListeners = Array.Empty<IWebSocketListener>();
         private readonly List<IWebSocketConnection> _webSocketConnections = new List<IWebSocketConnection>();
@@ -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;
+            }
+        }
+
         /// <summary>
         /// 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);
         }
 
         /// <inheritdoc />

+ 29 - 2
MediaBrowser.Model/Configuration/ServerConfiguration.cs

@@ -10,6 +10,7 @@ namespace MediaBrowser.Model.Configuration
     {
         public const int DefaultHttpPort = 8096;
         public const int DefaultHttpsPort = 8920;
+        private string _baseUrl;
 
         /// <summary>
         /// Gets or sets a value indicating whether [enable u pn p].
@@ -162,7 +163,33 @@ namespace MediaBrowser.Model.Configuration
         public bool SkipDeserializationForBasicTypes { get; set; }
 
         public string ServerName { get; set; }
-        public string BaseUrl { get; set; }
+        public string BaseUrl
+        {
+            get => _baseUrl;
+            set
+            {
+                // Normalize the start of the string
+                if (string.IsNullOrWhiteSpace(value))
+                {
+                    // If baseUrl is empty, set an empty prefix string
+                    value = string.Empty;
+                }
+                else if (!value.StartsWith("/"))
+                {
+                    // If baseUrl was not configured with a leading slash, append one for consistency
+                    value = "/" + value;
+                }
+
+                // Normalize the end of the string
+                if (value.EndsWith("/"))
+                {
+                    // If baseUrl was configured with a trailing slash, remove it for consistency
+                    value = value.Remove(value.Length - 1);
+                }
+
+                _baseUrl = value;
+            }
+        }
 
         public string UICulture { get; set; }
 
@@ -243,7 +270,7 @@ namespace MediaBrowser.Model.Configuration
             SortRemoveCharacters = new[] { ",", "&", "-", "{", "}", "'" };
             SortRemoveWords = new[] { "the", "a", "an" };
 
-            BaseUrl = "jellyfin";
+            BaseUrl = string.Empty;
             UICulture = "en-US";
 
             MetadataOptions = new[]