Add support for forwarding headers
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
using System.Net;
|
||||
using FrameProcessor.Concurrency;
|
||||
using FrameProcessor.Configuration;
|
||||
using FrameProcessor.ImagePipeline;
|
||||
@@ -5,10 +6,13 @@ using FrameProcessor.Middleware;
|
||||
using FrameProcessor.Mqtt;
|
||||
using FrameProcessor.Storage;
|
||||
using FrameProcessor.UrlFetch;
|
||||
using Microsoft.AspNetCore.HttpOverrides;
|
||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Microsoft.OpenApi;
|
||||
using Serilog;
|
||||
using AspForwardedHeadersOptions = Microsoft.AspNetCore.Builder.ForwardedHeadersOptions;
|
||||
using ForwardedHeadersOptions = FrameProcessor.Configuration.ForwardedHeadersOptions;
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
@@ -135,6 +139,9 @@ builder.Services.AddOptions<ApiKeyOptions>()
|
||||
.ValidateDataAnnotations()
|
||||
.ValidateOnStart();
|
||||
|
||||
builder.Services.AddOptions<ForwardedHeadersOptions>()
|
||||
.Bind(builder.Configuration.GetSection(ForwardedHeadersOptions.SectionName));
|
||||
|
||||
// FramesOptions is bound but not validated via the options pipeline so that
|
||||
// IOptionsMonitor<FramesOptions> can fire OnChange with invalid content during
|
||||
// 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.
|
||||
_ = 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.UseSwaggerUI(options =>
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user