35 lines
1.1 KiB
C#
35 lines
1.1 KiB
C#
namespace DysonNetwork.Gateway.Health;
|
|
|
|
using Microsoft.AspNetCore.Http;
|
|
|
|
public sealed class GatewayReadinessMiddleware(RequestDelegate next)
|
|
{
|
|
public async Task InvokeAsync(HttpContext context, GatewayReadinessStore store)
|
|
{
|
|
if (context.Request.Path.StartsWithSegments("/health"))
|
|
{
|
|
await next(context);
|
|
return;
|
|
}
|
|
|
|
var readiness = store.Current;
|
|
|
|
// Only core services participate in readiness gating
|
|
var notReadyCoreServices = readiness.Services
|
|
.Where(kv => GatewayConstant.CoreServiceNames.Contains(kv.Key))
|
|
.Where(kv => !kv.Value.IsHealthy)
|
|
.Select(kv => kv.Key)
|
|
.ToArray();
|
|
|
|
if (notReadyCoreServices.Length > 0)
|
|
{
|
|
context.Response.StatusCode = StatusCodes.Status503ServiceUnavailable;
|
|
var unavailableServices = string.Join(", ", notReadyCoreServices);
|
|
context.Response.Headers["X-NotReady"] = unavailableServices;
|
|
await context.Response.WriteAsync("Solar Network is warming up. Try again later please.");
|
|
return;
|
|
}
|
|
|
|
await next(context);
|
|
}
|
|
} |