No changes my end

pull/3007/head
BaronGreenback 5 years ago
parent 93568be3e7
commit 6d8ab50be9

@ -10,14 +10,11 @@ using System.Text.RegularExpressions;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using CommandLine; using CommandLine;
using Emby.Drawing;
using Emby.Server.Implementations; using Emby.Server.Implementations;
using Emby.Server.Implementations.HttpServer; using Emby.Server.Implementations.HttpServer;
using Emby.Server.Implementations.IO; using Emby.Server.Implementations.IO;
using Emby.Server.Implementations.Networking; using Emby.Server.Implementations.Networking;
using Jellyfin.Drawing.Skia;
using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Extensions; using MediaBrowser.Controller.Extensions;
using MediaBrowser.WebDashboard.Api; using MediaBrowser.WebDashboard.Api;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
@ -43,12 +40,12 @@ namespace Jellyfin.Server
/// <summary> /// <summary>
/// The name of logging configuration file containing application defaults. /// The name of logging configuration file containing application defaults.
/// </summary> /// </summary>
public static readonly string LoggingConfigFileDefault = "logging.default.json"; public const string LoggingConfigFileDefault = "logging.default.json";
/// <summary> /// <summary>
/// The name of the logging configuration file containing the system-specific override settings. /// The name of the logging configuration file containing the system-specific override settings.
/// </summary> /// </summary>
public static readonly string LoggingConfigFileSystem = "logging.json"; public const string LoggingConfigFileSystem = "logging.json";
private static readonly CancellationTokenSource _tokenSource = new CancellationTokenSource(); private static readonly CancellationTokenSource _tokenSource = new CancellationTokenSource();
private static readonly ILoggerFactory _loggerFactory = new SerilogLoggerFactory(); private static readonly ILoggerFactory _loggerFactory = new SerilogLoggerFactory();
@ -161,23 +158,7 @@ namespace Jellyfin.Server
ApplicationHost.LogEnvironmentInfo(_logger, appPaths); ApplicationHost.LogEnvironmentInfo(_logger, appPaths);
// Make sure we have all the code pages we can get PerformStaticInitialization();
// Ref: https://docs.microsoft.com/en-us/dotnet/api/system.text.codepagesencodingprovider.instance?view=netcore-3.0#remarks
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
// Increase the max http request limit
// The default connection limit is 10 for ASP.NET hosted applications and 2 for all others.
ServicePointManager.DefaultConnectionLimit = Math.Max(96, ServicePointManager.DefaultConnectionLimit);
// Disable the "Expect: 100-Continue" header by default
// http://stackoverflow.com/questions/566437/http-post-returns-the-error-417-expectation-failed-c
ServicePointManager.Expect100Continue = false;
Batteries_V2.Init();
if (raw.sqlite3_enable_shared_cache(1) != raw.SQLITE_OK)
{
_logger.LogWarning("Failed to enable shared cache for SQLite");
}
var appHost = new CoreAppHost( var appHost = new CoreAppHost(
appPaths, appPaths,
@ -205,7 +186,7 @@ namespace Jellyfin.Server
ServiceCollection serviceCollection = new ServiceCollection(); ServiceCollection serviceCollection = new ServiceCollection();
appHost.Init(serviceCollection); appHost.Init(serviceCollection);
var webHost = CreateWebHostBuilder(appHost, serviceCollection, options, startupConfig, appPaths).Build(); var webHost = new WebHostBuilder().ConfigureWebHostBuilder(appHost, serviceCollection, options, startupConfig, appPaths).Build();
// Re-use the web host service provider in the app host since ASP.NET doesn't allow a custom service collection. // Re-use the web host service provider in the app host since ASP.NET doesn't allow a custom service collection.
appHost.ServiceProvider = webHost.Services; appHost.ServiceProvider = webHost.Services;
@ -250,14 +231,49 @@ namespace Jellyfin.Server
} }
} }
private static IWebHostBuilder CreateWebHostBuilder( /// <summary>
/// Call static initialization methods for the application.
/// </summary>
public static void PerformStaticInitialization()
{
// Make sure we have all the code pages we can get
// Ref: https://docs.microsoft.com/en-us/dotnet/api/system.text.codepagesencodingprovider.instance?view=netcore-3.0#remarks
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
// Increase the max http request limit
// The default connection limit is 10 for ASP.NET hosted applications and 2 for all others.
ServicePointManager.DefaultConnectionLimit = Math.Max(96, ServicePointManager.DefaultConnectionLimit);
// Disable the "Expect: 100-Continue" header by default
// http://stackoverflow.com/questions/566437/http-post-returns-the-error-417-expectation-failed-c
ServicePointManager.Expect100Continue = false;
Batteries_V2.Init();
if (raw.sqlite3_enable_shared_cache(1) != raw.SQLITE_OK)
{
_logger.LogWarning("Failed to enable shared cache for SQLite");
}
}
/// <summary>
/// Configure the web host builder.
/// </summary>
/// <param name="builder">The builder to configure.</param>
/// <param name="appHost">The application host.</param>
/// <param name="serviceCollection">The application service collection.</param>
/// <param name="commandLineOpts">The command line options passed to the application.</param>
/// <param name="startupConfig">The application configuration.</param>
/// <param name="appPaths">The application paths.</param>
/// <returns>The configured web host builder.</returns>
public static IWebHostBuilder ConfigureWebHostBuilder(
this IWebHostBuilder builder,
ApplicationHost appHost, ApplicationHost appHost,
IServiceCollection serviceCollection, IServiceCollection serviceCollection,
StartupOptions commandLineOpts, StartupOptions commandLineOpts,
IConfiguration startupConfig, IConfiguration startupConfig,
IApplicationPaths appPaths) IApplicationPaths appPaths)
{ {
return new WebHostBuilder() return builder
.UseKestrel((builderContext, options) => .UseKestrel((builderContext, options) =>
{ {
var addresses = appHost.ServerConfigurationManager var addresses = appHost.ServerConfigurationManager
@ -265,15 +281,20 @@ namespace Jellyfin.Server
.LocalNetworkAddresses .LocalNetworkAddresses
.Select(appHost.NormalizeConfiguredLocalAddress) .Select(appHost.NormalizeConfiguredLocalAddress)
.Where(i => i != null) .Where(i => i != null)
.ToList(); .ToHashSet();
if (addresses.Any()) if (addresses.Any() && !addresses.Contains(IPAddress.Any))
{ {
if (!addresses.Contains(IPAddress.Loopback))
{
// we must listen on loopback for LiveTV to function regardless of the settings
addresses.Add(IPAddress.Loopback);
}
foreach (var address in addresses) foreach (var address in addresses)
{ {
_logger.LogInformation("Kestrel listening on {IpAddress}", address); _logger.LogInformation("Kestrel listening on {IpAddress}", address);
options.Listen(address, appHost.HttpPort); options.Listen(address, appHost.HttpPort);
if (appHost.ListenWithHttps)
if (appHost.EnableHttps && appHost.Certificate != null)
{ {
options.Listen(address, appHost.HttpsPort, listenOptions => options.Listen(address, appHost.HttpsPort, listenOptions =>
{ {
@ -283,11 +304,18 @@ namespace Jellyfin.Server
} }
else if (builderContext.HostingEnvironment.IsDevelopment()) else if (builderContext.HostingEnvironment.IsDevelopment())
{ {
options.Listen(address, appHost.HttpsPort, listenOptions => try
{ {
listenOptions.UseHttps(); options.Listen(address, appHost.HttpsPort, listenOptions =>
listenOptions.Protocols = HttpProtocols.Http1AndHttp2; {
}); listenOptions.UseHttps();
listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
});
}
catch (InvalidOperationException ex)
{
_logger.LogError(ex, "Failed to listen to HTTPS using the ASP.NET Core HTTPS development certificate. Please ensure it has been installed and set as trusted.");
}
} }
} }
} }
@ -296,7 +324,7 @@ namespace Jellyfin.Server
_logger.LogInformation("Kestrel listening on all interfaces"); _logger.LogInformation("Kestrel listening on all interfaces");
options.ListenAnyIP(appHost.HttpPort); options.ListenAnyIP(appHost.HttpPort);
if (appHost.EnableHttps && appHost.Certificate != null) if (appHost.ListenWithHttps)
{ {
options.ListenAnyIP(appHost.HttpsPort, listenOptions => options.ListenAnyIP(appHost.HttpsPort, listenOptions =>
{ {
@ -306,11 +334,18 @@ namespace Jellyfin.Server
} }
else if (builderContext.HostingEnvironment.IsDevelopment()) else if (builderContext.HostingEnvironment.IsDevelopment())
{ {
options.ListenAnyIP(appHost.HttpsPort, listenOptions => try
{ {
listenOptions.UseHttps(); options.ListenAnyIP(appHost.HttpsPort, listenOptions =>
listenOptions.Protocols = HttpProtocols.Http1AndHttp2; {
}); listenOptions.UseHttps();
listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
});
}
catch (InvalidOperationException ex)
{
_logger.LogError(ex, "Failed to listen to HTTPS using the ASP.NET Core HTTPS development certificate. Please ensure it has been installed and set as trusted.");
}
} }
} }
}) })
@ -490,7 +525,9 @@ namespace Jellyfin.Server
/// Initialize the logging configuration file using the bundled resource file as a default if it doesn't exist /// Initialize the logging configuration file using the bundled resource file as a default if it doesn't exist
/// already. /// already.
/// </summary> /// </summary>
private static async Task InitLoggingConfigFile(IApplicationPaths appPaths) /// <param name="appPaths">The application paths.</param>
/// <returns>A task representing the creation of the configuration file, or a completed task if the file already exists.</returns>
public static async Task InitLoggingConfigFile(IApplicationPaths appPaths)
{ {
// Do nothing if the config file already exists // Do nothing if the config file already exists
string configPath = Path.Combine(appPaths.ConfigurationDirectoryPath, LoggingConfigFileDefault); string configPath = Path.Combine(appPaths.ConfigurationDirectoryPath, LoggingConfigFileDefault);
@ -510,7 +547,13 @@ namespace Jellyfin.Server
await resource.CopyToAsync(dst).ConfigureAwait(false); await resource.CopyToAsync(dst).ConfigureAwait(false);
} }
private static IConfiguration CreateAppConfiguration(StartupOptions commandLineOpts, IApplicationPaths appPaths) /// <summary>
/// Create the application configuration.
/// </summary>
/// <param name="commandLineOpts">The command line options passed to the program.</param>
/// <param name="appPaths">The application paths.</param>
/// <returns>The application configuration.</returns>
public static IConfiguration CreateAppConfiguration(StartupOptions commandLineOpts, IApplicationPaths appPaths)
{ {
return new ConfigurationBuilder() return new ConfigurationBuilder()
.ConfigureAppConfiguration(commandLineOpts, appPaths) .ConfigureAppConfiguration(commandLineOpts, appPaths)

Loading…
Cancel
Save