New: Return static response to requests while app is starting

(cherry picked from commit 303fc5d786ccf2ad14c8523fc239696c5d37ea53)
pull/3397/head
Mark McDowall 1 year ago committed by Qstick
parent b1bad2067c
commit fc79738fcb

@ -0,0 +1,40 @@
using System.Text;
using System.Threading.Tasks;
using Lidarr.Http.Extensions;
using Microsoft.AspNetCore.Http;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Serializer;
namespace Lidarr.Http.Middleware
{
public class StartingUpMiddleware
{
private readonly RequestDelegate _next;
private readonly IRuntimeInfo _runtimeInfo;
private static readonly string MESSAGE = "Lidarr is starting up, please try again later";
public StartingUpMiddleware(RequestDelegate next, IRuntimeInfo runtimeInfo)
{
_next = next;
_runtimeInfo = runtimeInfo;
}
public async Task InvokeAsync(HttpContext context)
{
if (_runtimeInfo.IsStarting)
{
var isJson = context.Request.IsApiRequest();
var message = isJson ? STJson.ToJson(new { ErrorMessage = MESSAGE }) : MESSAGE;
var bytes = Encoding.UTF8.GetBytes(message);
context.Response.StatusCode = 503;
context.Response.ContentType = isJson ? "application/json" : "text/plain";
await context.Response.Body.WriteAsync(bytes, 0, bytes.Length);
return;
}
await _next(context);
}
}
}

@ -9,6 +9,7 @@ namespace NzbDrone.Common.EnvironmentInfo
bool IsAdmin { get; }
bool IsWindowsService { get; }
bool IsWindowsTray { get; }
bool IsStarting { get; set; }
bool IsExiting { get; set; }
bool IsTray { get; }
RuntimeMode Mode { get; }

@ -19,6 +19,7 @@ namespace NzbDrone.Common.EnvironmentInfo
_logger = logger;
IsWindowsService = hostLifetime is WindowsServiceLifetime;
IsStarting = true;
// net6.0 will return Lidarr.dll for entry assembly, we need the actual
// executable name (Lidarr on linux). On mono this will return the location of
@ -82,6 +83,7 @@ namespace NzbDrone.Common.EnvironmentInfo
public bool IsWindowsService { get; private set; }
public bool IsStarting { get; set; }
public bool IsExiting { get; set; }
public bool IsTray

@ -57,6 +57,7 @@ namespace NzbDrone.Host
private void OnAppStarted()
{
_runtimeInfo.IsStarting = false;
_runtimeInfo.IsExiting = false;
if (!_startupContext.Flags.Contains(StartupContext.NO_BROWSER)

@ -265,6 +265,7 @@ namespace NzbDrone.Host
app.UseMiddleware<VersionMiddleware>();
app.UseMiddleware<UrlBaseMiddleware>(configFileProvider.UrlBase);
app.UseMiddleware<StartingUpMiddleware>();
app.UseMiddleware<CacheHeaderMiddleware>();
app.UseMiddleware<IfModifiedMiddleware>();
app.UseMiddleware<BufferingMiddleware>(new List<string> { "/api/v1/command" });

Loading…
Cancel
Save