mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-06-02 13:15:25 -04:00
Dynamically populate LocalAddress based on HTTP request
Support populating the LocalAddress field in the system info endpoint based on the x-forwarded-host and x-forwarded-proto header. The x-forwarded-host header must contain both the host and port for the url to be properly constructed. Behind network configuration option that is disabled by default.
This commit is contained in:
parent
e15fea5dad
commit
90174f68e2
@ -1073,9 +1073,9 @@ namespace Emby.Server.Implementations
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the system status.
|
/// Gets the system status.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="source">Where this request originated.</param>
|
/// <param name="request">Where this request originated.</param>
|
||||||
/// <returns>SystemInfo.</returns>
|
/// <returns>SystemInfo.</returns>
|
||||||
public SystemInfo GetSystemInfo(IPAddress source)
|
public SystemInfo GetSystemInfo(HttpRequest request)
|
||||||
{
|
{
|
||||||
return new SystemInfo
|
return new SystemInfo
|
||||||
{
|
{
|
||||||
@ -1097,7 +1097,7 @@ namespace Emby.Server.Implementations
|
|||||||
CanLaunchWebBrowser = CanLaunchWebBrowser,
|
CanLaunchWebBrowser = CanLaunchWebBrowser,
|
||||||
TranscodingTempPath = ConfigurationManager.GetTranscodePath(),
|
TranscodingTempPath = ConfigurationManager.GetTranscodePath(),
|
||||||
ServerName = FriendlyName,
|
ServerName = FriendlyName,
|
||||||
LocalAddress = GetSmartApiUrl(source),
|
LocalAddress = GetSmartApiUrl(request),
|
||||||
SupportsLibraryMonitor = true,
|
SupportsLibraryMonitor = true,
|
||||||
EncoderLocation = _mediaEncoder.EncoderLocation,
|
EncoderLocation = _mediaEncoder.EncoderLocation,
|
||||||
SystemArchitecture = RuntimeInformation.OSArchitecture,
|
SystemArchitecture = RuntimeInformation.OSArchitecture,
|
||||||
@ -1110,7 +1110,7 @@ namespace Emby.Server.Implementations
|
|||||||
.Select(i => new WakeOnLanInfo(i))
|
.Select(i => new WakeOnLanInfo(i))
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
public PublicSystemInfo GetPublicSystemInfo(IPAddress address)
|
public PublicSystemInfo GetPublicSystemInfo(HttpRequest request)
|
||||||
{
|
{
|
||||||
return new PublicSystemInfo
|
return new PublicSystemInfo
|
||||||
{
|
{
|
||||||
@ -1119,7 +1119,7 @@ namespace Emby.Server.Implementations
|
|||||||
Id = SystemId,
|
Id = SystemId,
|
||||||
OperatingSystem = MediaBrowser.Common.System.OperatingSystem.Id.ToString(),
|
OperatingSystem = MediaBrowser.Common.System.OperatingSystem.Id.ToString(),
|
||||||
ServerName = FriendlyName,
|
ServerName = FriendlyName,
|
||||||
LocalAddress = GetSmartApiUrl(address),
|
LocalAddress = GetSmartApiUrl(request),
|
||||||
StartupWizardCompleted = ConfigurationManager.CommonConfiguration.IsStartupWizardCompleted
|
StartupWizardCompleted = ConfigurationManager.CommonConfiguration.IsStartupWizardCompleted
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -1150,6 +1150,18 @@ namespace Emby.Server.Implementations
|
|||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public string GetSmartApiUrl(HttpRequest request, int? port = null)
|
public string GetSmartApiUrl(HttpRequest request, int? port = null)
|
||||||
{
|
{
|
||||||
|
// Return the host in the HTTP request as the API url
|
||||||
|
if (ConfigurationManager.GetNetworkConfiguration().EnablePublishedServerUriByRequest)
|
||||||
|
{
|
||||||
|
int? requestPort = request.Host.Port;
|
||||||
|
if ((requestPort == 80 && string.Equals(request.Scheme, "http", StringComparison.OrdinalIgnoreCase)) || (requestPort == 443 && string.Equals(request.Scheme, "https", StringComparison.OrdinalIgnoreCase)))
|
||||||
|
{
|
||||||
|
requestPort = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GetLocalApiUrl(request.Host.Host, request.Scheme, requestPort);
|
||||||
|
}
|
||||||
|
|
||||||
// Published server ends with a /
|
// Published server ends with a /
|
||||||
if (!string.IsNullOrEmpty(PublishedServerUrl))
|
if (!string.IsNullOrEmpty(PublishedServerUrl))
|
||||||
{
|
{
|
||||||
|
@ -66,7 +66,7 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||||
public ActionResult<SystemInfo> GetSystemInfo()
|
public ActionResult<SystemInfo> GetSystemInfo()
|
||||||
{
|
{
|
||||||
return _appHost.GetSystemInfo(Request.HttpContext.Connection.RemoteIpAddress ?? IPAddress.Loopback);
|
return _appHost.GetSystemInfo(Request);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -78,7 +78,7 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||||
public ActionResult<PublicSystemInfo> GetPublicSystemInfo()
|
public ActionResult<PublicSystemInfo> GetPublicSystemInfo()
|
||||||
{
|
{
|
||||||
return _appHost.GetPublicSystemInfo(Request.HttpContext.Connection.RemoteIpAddress ?? IPAddress.Loopback);
|
return _appHost.GetPublicSystemInfo(Request);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -226,5 +226,10 @@ namespace Jellyfin.Networking.Configuration
|
|||||||
/// Gets or sets the known proxies. If the proxy is a network, it's added to the KnownNetworks.
|
/// Gets or sets the known proxies. If the proxy is a network, it's added to the KnownNetworks.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string[] KnownProxies { get; set; } = Array.Empty<string>();
|
public string[] KnownProxies { get; set; } = Array.Empty<string>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a value indicating whether the published server uri is based on information in HTTP requests.
|
||||||
|
/// </summary>
|
||||||
|
public bool EnablePublishedServerUriByRequest { get; set; } = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -188,7 +188,8 @@ namespace Jellyfin.Server.Extensions
|
|||||||
// https://github.com/dotnet/aspnetcore/blob/master/src/Middleware/HttpOverrides/src/ForwardedHeadersMiddleware.cs
|
// https://github.com/dotnet/aspnetcore/blob/master/src/Middleware/HttpOverrides/src/ForwardedHeadersMiddleware.cs
|
||||||
// Enable debug logging on Microsoft.AspNetCore.HttpOverrides.ForwardedHeadersMiddleware to help investigate issues.
|
// Enable debug logging on Microsoft.AspNetCore.HttpOverrides.ForwardedHeadersMiddleware to help investigate issues.
|
||||||
|
|
||||||
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
|
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost;
|
||||||
|
|
||||||
if (config.KnownProxies.Length == 0)
|
if (config.KnownProxies.Length == 0)
|
||||||
{
|
{
|
||||||
options.KnownNetworks.Clear();
|
options.KnownNetworks.Clear();
|
||||||
|
@ -51,11 +51,11 @@ namespace MediaBrowser.Controller
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the system info.
|
/// Gets the system info.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="source">The originator of the request.</param>
|
/// <param name="request">The HTTP request.</param>
|
||||||
/// <returns>SystemInfo.</returns>
|
/// <returns>SystemInfo.</returns>
|
||||||
SystemInfo GetSystemInfo(IPAddress source);
|
SystemInfo GetSystemInfo(HttpRequest request);
|
||||||
|
|
||||||
PublicSystemInfo GetPublicSystemInfo(IPAddress address);
|
PublicSystemInfo GetPublicSystemInfo(HttpRequest request);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a URL specific for the request.
|
/// Gets a URL specific for the request.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user