using System; using System.Net.Mime; using System.Threading.Tasks; using MediaBrowser.Controller; using MediaBrowser.Model.Globalization; using Microsoft.AspNetCore.Http; namespace Jellyfin.Api.Middleware; /// <summary> /// Shows a custom message during server startup. /// </summary> public class ServerStartupMessageMiddleware { private readonly RequestDelegate _next; /// <summary> /// Initializes a new instance of the <see cref="ServerStartupMessageMiddleware"/> class. /// </summary> /// <param name="next">The next delegate in the pipeline.</param> public ServerStartupMessageMiddleware(RequestDelegate next) { _next = next; } /// <summary> /// Executes the middleware action. /// </summary> /// <param name="httpContext">The current HTTP context.</param> /// <param name="serverApplicationHost">The server application host.</param> /// <param name="localizationManager">The localization manager.</param> /// <returns>The async task.</returns> public async Task Invoke( HttpContext httpContext, IServerApplicationHost serverApplicationHost, ILocalizationManager localizationManager) { if (serverApplicationHost.CoreStartupHasCompleted || httpContext.Request.Path.Equals("/system/ping", StringComparison.OrdinalIgnoreCase)) { await _next(httpContext).ConfigureAwait(false); return; } var message = localizationManager.GetLocalizedString("StartupEmbyServerIsLoading"); httpContext.Response.StatusCode = StatusCodes.Status503ServiceUnavailable; httpContext.Response.ContentType = MediaTypeNames.Text.Html; await httpContext.Response.WriteAsync(message, httpContext.RequestAborted).ConfigureAwait(false); } }