Add support for forwarding headers

This commit is contained in:
2026-06-07 20:19:35 +02:00
parent fc8903c04e
commit 96934b6824

View File

@@ -1,3 +1,4 @@
using System.Net;
using FrameProcessor.Concurrency; using FrameProcessor.Concurrency;
using FrameProcessor.Configuration; using FrameProcessor.Configuration;
using FrameProcessor.ImagePipeline; using FrameProcessor.ImagePipeline;
@@ -5,10 +6,13 @@ using FrameProcessor.Middleware;
using FrameProcessor.Mqtt; using FrameProcessor.Mqtt;
using FrameProcessor.Storage; using FrameProcessor.Storage;
using FrameProcessor.UrlFetch; using FrameProcessor.UrlFetch;
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Microsoft.OpenApi; using Microsoft.OpenApi;
using Serilog; using Serilog;
using AspForwardedHeadersOptions = Microsoft.AspNetCore.Builder.ForwardedHeadersOptions;
using ForwardedHeadersOptions = FrameProcessor.Configuration.ForwardedHeadersOptions;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@@ -135,6 +139,9 @@ builder.Services.AddOptions<ApiKeyOptions>()
.ValidateDataAnnotations() .ValidateDataAnnotations()
.ValidateOnStart(); .ValidateOnStart();
builder.Services.AddOptions<ForwardedHeadersOptions>()
.Bind(builder.Configuration.GetSection(ForwardedHeadersOptions.SectionName));
// FramesOptions is bound but not validated via the options pipeline so that // FramesOptions is bound but not validated via the options pipeline so that
// IOptionsMonitor<FramesOptions> can fire OnChange with invalid content during // IOptionsMonitor<FramesOptions> can fire OnChange with invalid content during
// hot-reload without throwing. FramesRegistry takes responsibility for both // hot-reload without throwing. FramesRegistry takes responsibility for both
@@ -169,6 +176,25 @@ var app = builder.Build();
// Eagerly resolve FramesRegistry so an invalid frames.json fails startup fast. // Eagerly resolve FramesRegistry so an invalid frames.json fails startup fast.
_ = app.Services.GetRequiredService<FramesRegistry>(); _ = app.Services.GetRequiredService<FramesRegistry>();
// Honor X-Forwarded-Proto/Host from the reverse proxy so generated URLs
// (OpenAPI, Swagger UI) use the externally-visible scheme and host.
var proxyConfig = app.Services.GetRequiredService<IOptions<ForwardedHeadersOptions>>().Value;
var forwardedHeadersOptions = new AspForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost,
};
forwardedHeadersOptions.KnownIPNetworks.Clear();
forwardedHeadersOptions.KnownProxies.Clear();
foreach (var network in proxyConfig.KnownNetworks)
{
forwardedHeadersOptions.KnownIPNetworks.Add(System.Net.IPNetwork.Parse(network));
}
foreach (var proxy in proxyConfig.KnownProxies)
{
forwardedHeadersOptions.KnownProxies.Add(IPAddress.Parse(proxy));
}
app.UseForwardedHeaders(forwardedHeadersOptions);
app.MapOpenApi(); app.MapOpenApi();
app.UseSwaggerUI(options => app.UseSwaggerUI(options =>
{ {