aboutsummaryrefslogtreecommitdiff
path: root/Jellyfin.Server/Extensions/WebHostBuilderExtensions.cs
diff options
context:
space:
mode:
authorJoshua M. Boniface <joshua@boniface.me>2025-08-03 17:27:17 -0400
committerGitHub <noreply@github.com>2025-08-03 17:27:17 -0400
commit4b6fb6c4bb2478badad068ce18aabe0c2955db48 (patch)
tree15f986ee62327cceb8f5c8f009bcf08d10cfaa66 /Jellyfin.Server/Extensions/WebHostBuilderExtensions.cs
parente7bc86ebb8496615e0b3f73eb4f13ab4c0913dc8 (diff)
parentdb7465e83d9cc07134a0bffad7ed17b1c7b873da (diff)
Merge branch 'master' into master
Diffstat (limited to 'Jellyfin.Server/Extensions/WebHostBuilderExtensions.cs')
-rw-r--r--Jellyfin.Server/Extensions/WebHostBuilderExtensions.cs116
1 files changed, 81 insertions, 35 deletions
diff --git a/Jellyfin.Server/Extensions/WebHostBuilderExtensions.cs b/Jellyfin.Server/Extensions/WebHostBuilderExtensions.cs
index 6b95770ed..be9cf0f15 100644
--- a/Jellyfin.Server/Extensions/WebHostBuilderExtensions.cs
+++ b/Jellyfin.Server/Extensions/WebHostBuilderExtensions.cs
@@ -1,10 +1,14 @@
using System;
+using System.Collections.Generic;
using System.IO;
using System.Net;
+using System.Security.Cryptography.X509Certificates;
using Jellyfin.Server.Helpers;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Extensions;
+using MediaBrowser.Model.Net;
using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
@@ -35,56 +39,98 @@ public static class WebHostBuilderExtensions
return builder
.UseKestrel((builderContext, options) =>
{
- var addresses = appHost.NetManager.GetAllBindInterfaces(false);
+ SetupJellyfinWebServer(
+ appHost.NetManager.GetAllBindInterfaces(false),
+ appHost.HttpPort,
+ appHost.ListenWithHttps ? appHost.HttpsPort : null,
+ appHost.Certificate,
+ startupConfig,
+ appPaths,
+ logger,
+ builderContext,
+ options);
+ })
+ .UseStartup(context => new Startup(appHost, context.Configuration));
+ }
- bool flagged = false;
- foreach (var netAdd in addresses)
+ /// <summary>
+ /// Configures a Kestrel type webServer to bind to the specific arguments.
+ /// </summary>
+ /// <param name="addresses">The IP addresses that should be listend to.</param>
+ /// <param name="httpPort">The http port.</param>
+ /// <param name="httpsPort">If set the https port. If set you must also set the certificate.</param>
+ /// <param name="certificate">The certificate used for https port.</param>
+ /// <param name="startupConfig">The startup config.</param>
+ /// <param name="appPaths">The app paths.</param>
+ /// <param name="logger">A logger.</param>
+ /// <param name="builderContext">The kestrel build pipeline context.</param>
+ /// <param name="options">The kestrel server options.</param>
+ /// <exception cref="InvalidOperationException">Will be thrown when a https port is set but no or an invalid certificate is provided.</exception>
+ public static void SetupJellyfinWebServer(
+ IReadOnlyList<IPData> addresses,
+ int httpPort,
+ int? httpsPort,
+ X509Certificate2? certificate,
+ IConfiguration startupConfig,
+ IApplicationPaths appPaths,
+ ILogger logger,
+ WebHostBuilderContext builderContext,
+ KestrelServerOptions options)
+ {
+ bool flagged = false;
+ foreach (var netAdd in addresses)
+ {
+ var address = netAdd.Address;
+ logger.LogInformation("Kestrel is listening on {Address}", address.Equals(IPAddress.IPv6Any) ? "all interfaces" : address);
+ options.Listen(netAdd.Address, httpPort);
+ if (httpsPort.HasValue)
+ {
+ if (builderContext.HostingEnvironment.IsDevelopment())
{
- var address = netAdd.Address;
- logger.LogInformation("Kestrel is listening on {Address}", address.Equals(IPAddress.IPv6Any) ? "all interfaces" : address);
- options.Listen(netAdd.Address, appHost.HttpPort);
- if (appHost.ListenWithHttps)
+ try
{
options.Listen(
address,
- appHost.HttpsPort,
- listenOptions => listenOptions.UseHttps(appHost.Certificate));
+ httpsPort.Value,
+ listenOptions => listenOptions.UseHttps());
}
- else if (builderContext.HostingEnvironment.IsDevelopment())
+ catch (InvalidOperationException)
{
- try
+ if (!flagged)
{
- options.Listen(
- address,
- appHost.HttpsPort,
- listenOptions => listenOptions.UseHttps());
- }
- catch (InvalidOperationException)
- {
- if (!flagged)
- {
- logger.LogWarning("Failed to listen to HTTPS using the ASP.NET Core HTTPS development certificate. Please ensure it has been installed and set as trusted");
- flagged = true;
- }
+ logger.LogWarning("Failed to listen to HTTPS using the ASP.NET Core HTTPS development certificate. Please ensure it has been installed and set as trusted");
+ flagged = true;
}
}
}
-
- // Bind to unix socket (only on unix systems)
- if (startupConfig.UseUnixSocket() && Environment.OSVersion.Platform == PlatformID.Unix)
+ else
{
- var socketPath = StartupHelpers.GetUnixSocketPath(startupConfig, appPaths);
-
- // Workaround for https://github.com/aspnet/AspNetCore/issues/14134
- if (File.Exists(socketPath))
+ if (certificate is null)
{
- File.Delete(socketPath);
+ throw new InvalidOperationException("Cannot run jellyfin with https without setting a valid certificate.");
}
- options.ListenUnixSocket(socketPath);
- logger.LogInformation("Kestrel listening to unix socket {SocketPath}", socketPath);
+ options.Listen(
+ address,
+ httpsPort.Value,
+ listenOptions => listenOptions.UseHttps(certificate));
}
- })
- .UseStartup(_ => new Startup(appHost));
+ }
+ }
+
+ // Bind to unix socket (only on unix systems)
+ if (startupConfig.UseUnixSocket() && Environment.OSVersion.Platform == PlatformID.Unix)
+ {
+ var socketPath = StartupHelpers.GetUnixSocketPath(startupConfig, appPaths);
+
+ // Workaround for https://github.com/aspnet/AspNetCore/issues/14134
+ if (File.Exists(socketPath))
+ {
+ File.Delete(socketPath);
+ }
+
+ options.ListenUnixSocket(socketPath);
+ logger.LogInformation("Kestrel listening to unix socket {SocketPath}", socketPath);
+ }
}
}