aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVasily <JustAMan@users.noreply.github.com>2019-10-09 19:24:41 +0300
committerJoshua Boniface <joshua@boniface.me>2019-10-20 14:21:26 -0400
commit9c0a8350d6aa6fd13e418b5322a60dc5f720fa3a (patch)
treeb0ef4ebd4ae097c00bb0bb9381de33565a5786a3
parent818d21718c496adc0e14c4962f584eb4e3c50df4 (diff)
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>
-rw-r--r--Emby.Server.Implementations/HttpServer/HttpListenerHost.cs73
-rw-r--r--MediaBrowser.Model/Configuration/ServerConfiguration.cs31
2 files changed, 63 insertions, 41 deletions
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<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 />
diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
index 24e771403..b8abe49e3 100644
--- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs
+++ b/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[]