Files
wjones af1152b001 Refactor: standardize namespace and using directive style
Refactored all C# test files to use explicit namespace declarations and moved all using directives inside the namespace block for consistency. Updated assembly info and cache files to reflect the new build. Adjusted MvcTestingAppManifest.json to use fully qualified assembly names. No functional changes; all updates are related to code style, organization, and project metadata.
2026-02-20 16:26:53 -05:00

141 lines
5.5 KiB
C#

// <copyright file="WebHostBuilderExtensions.cs" company="PlaceholderCompany">
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
namespace Jellyfin.Server.Extensions;
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;
/// <summary>
/// Extensions for configuring the web host builder.
/// </summary>
public static class WebHostBuilderExtensions
{
/// <summary>
/// Configure the web host builder.
/// </summary>
/// <param name="builder">The builder to configure.</param>
/// <param name="appHost">The application host.</param>
/// <param name="startupConfig">The application configuration.</param>
/// <param name="appPaths">The application paths.</param>
/// <param name="logger">The logger.</param>
/// <returns>The configured web host builder.</returns>
public static IWebHostBuilder ConfigureWebHostBuilder(
this IWebHostBuilder builder,
CoreAppHost appHost,
IConfiguration startupConfig,
IApplicationPaths appPaths,
ILogger logger)
{
return builder
.UseKestrel((builderContext, options) =>
{
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));
}
/// <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())
{
try
{
options.Listen(
address,
httpsPort.Value,
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;
}
}
}
else
{
if (certificate is null)
{
throw new InvalidOperationException("Cannot run jellyfin with https without setting a valid certificate.");
}
options.Listen(
address,
httpsPort.Value,
listenOptions => listenOptions.UseHttps(certificate));
}
}
}
// 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);
}
}
}