From d918126a0da0fcbf64666465df2dc63a1950a675 Mon Sep 17 00:00:00 2001 From: Stefan Hacker Date: Fri, 16 Feb 2024 00:08:36 +0100 Subject: [PATCH] Fix X-Forwarded-For for IPv4 with dual stack sockets #2399 (#2400) * Fix X-Forwarded-For for IPv4 with dual stack sockets #2399 * Address review feedback --- .../Transforms/RequestHeaderXForwardedForTransform.cs | 9 ++++++++- .../RequestHeaderXForwardedForTransformTests.cs | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/ReverseProxy/Transforms/RequestHeaderXForwardedForTransform.cs b/src/ReverseProxy/Transforms/RequestHeaderXForwardedForTransform.cs index cd30ed736..d82b31e5c 100644 --- a/src/ReverseProxy/Transforms/RequestHeaderXForwardedForTransform.cs +++ b/src/ReverseProxy/Transforms/RequestHeaderXForwardedForTransform.cs @@ -42,7 +42,14 @@ public override ValueTask ApplyAsync(RequestTransformContext context) throw new ArgumentNullException(nameof(context)); } - var remoteIp = context.HttpContext.Connection.RemoteIpAddress?.ToString(); + string? remoteIp = null; + var remoteIpAddress = context.HttpContext.Connection.RemoteIpAddress; + if (remoteIpAddress is not null) + { + remoteIp = remoteIpAddress.IsIPv4MappedToIPv6 ? + remoteIpAddress.MapToIPv4().ToString() : + remoteIpAddress.ToString(); + } switch (TransformAction) { diff --git a/test/ReverseProxy.Tests/Transforms/RequestHeaderXForwardedForTransformTests.cs b/test/ReverseProxy.Tests/Transforms/RequestHeaderXForwardedForTransformTests.cs index 90a685045..b73662d58 100644 --- a/test/ReverseProxy.Tests/Transforms/RequestHeaderXForwardedForTransformTests.cs +++ b/test/ReverseProxy.Tests/Transforms/RequestHeaderXForwardedForTransformTests.cs @@ -19,7 +19,9 @@ public class RequestHeaderXForwardedForTransformTests [InlineData("", "", ForwardedTransformActions.Remove, "")] [InlineData("", "::1", ForwardedTransformActions.Set, "::1")] [InlineData("", "127.0.0.1", ForwardedTransformActions.Set, "127.0.0.1")] + [InlineData("", "::ffff:127.0.0.1", ForwardedTransformActions.Set, "127.0.0.1")] [InlineData("", "127.0.0.1", ForwardedTransformActions.Append, "127.0.0.1")] + [InlineData("", "::ffff:127.0.0.1", ForwardedTransformActions.Append, "127.0.0.1")] [InlineData("", "127.0.0.1", ForwardedTransformActions.Remove, "")] [InlineData("existing,Header", "", ForwardedTransformActions.Set, "")] [InlineData("existing;Header", "", ForwardedTransformActions.Set, "")]