From 775143804aad7fecc9ecc775c3781d3980330d81 Mon Sep 17 00:00:00 2001
From: Masters <dustin.masters@olo.com>
Date: Tue, 28 Jun 2022 13:14:59 -0400
Subject: [PATCH] Fix logging conditions for additional request headers
 (#42456)

---
 .../HttpLogging/src/W3CLoggingMiddleware.cs   | 34 ++++++++----------
 .../test/W3CLoggingMiddlewareTests.cs         | 36 +++++++++++++++++++
 2 files changed, 51 insertions(+), 19 deletions(-)

diff --git a/src/Middleware/HttpLogging/src/W3CLoggingMiddleware.cs b/src/Middleware/HttpLogging/src/W3CLoggingMiddleware.cs
index de9f9334d2b..90fe835629a 100644
--- a/src/Middleware/HttpLogging/src/W3CLoggingMiddleware.cs
+++ b/src/Middleware/HttpLogging/src/W3CLoggingMiddleware.cs
@@ -82,10 +82,8 @@ internal sealed class W3CLoggingMiddleware
     {
         var options = _options.CurrentValue;
 
-        var additionalHeadersLength = _additionalRequestHeaders.Count;
-
         var elements = new string[_fieldsLength];
-        var additionalHeaderElements = new string[additionalHeadersLength];
+        var additionalHeaderElements = new string[_additionalRequestHeaders.Count];
 
         // Whether any of the requested fields actually had content
         bool shouldLog = false;
@@ -154,11 +152,9 @@ internal sealed class W3CLoggingMiddleware
 
             if ((W3CLoggingFields.RequestHeaders & options.LoggingFields) != W3CLoggingFields.None)
             {
-                var headers = request.Headers;
-
                 if (options.LoggingFields.HasFlag(W3CLoggingFields.Host))
                 {
-                    if (headers.TryGetValue(HeaderNames.Host, out var host))
+                    if (request.Headers.TryGetValue(HeaderNames.Host, out var host))
                     {
                         shouldLog |= AddToList(elements, _hostIndex, host.ToString());
                     }
@@ -166,7 +162,7 @@ internal sealed class W3CLoggingMiddleware
 
                 if (options.LoggingFields.HasFlag(W3CLoggingFields.Referer))
                 {
-                    if (headers.TryGetValue(HeaderNames.Referer, out var referer))
+                    if (request.Headers.TryGetValue(HeaderNames.Referer, out var referer))
                     {
                         shouldLog |= AddToList(elements, _refererIndex, referer.ToString());
                     }
@@ -174,7 +170,7 @@ internal sealed class W3CLoggingMiddleware
 
                 if (options.LoggingFields.HasFlag(W3CLoggingFields.UserAgent))
                 {
-                    if (headers.TryGetValue(HeaderNames.UserAgent, out var agent))
+                    if (request.Headers.TryGetValue(HeaderNames.UserAgent, out var agent))
                     {
                         shouldLog |= AddToList(elements, _userAgentIndex, agent.ToString());
                     }
@@ -182,23 +178,23 @@ internal sealed class W3CLoggingMiddleware
 
                 if (options.LoggingFields.HasFlag(W3CLoggingFields.Cookie))
                 {
-                    if (headers.TryGetValue(HeaderNames.Cookie, out var cookie))
+                    if (request.Headers.TryGetValue(HeaderNames.Cookie, out var cookie))
                     {
                         shouldLog |= AddToList(elements, _cookieIndex, cookie.ToString());
                     }
                 }
+            }
+        }
 
-                if (_additionalRequestHeaders.Count != 0)
-                {
-                    var additionalRequestHeaders = _additionalRequestHeaders.ToList();
+        if (_additionalRequestHeaders.Count != 0)
+        {
+            var additionalRequestHeaders = _additionalRequestHeaders.ToList();
 
-                    for (var i = 0; i < additionalHeadersLength; i++)
-                    {
-                        if (headers.TryGetValue(additionalRequestHeaders[i], out var headerValue))
-                        {
-                            shouldLog |= AddToList(additionalHeaderElements, i, headerValue.ToString());
-                        }
-                    }
+            for (var i = 0; i < additionalRequestHeaders.Count; i++)
+            {
+                if (context.Request.Headers.TryGetValue(additionalRequestHeaders[i], out var headerValue))
+                {
+                    shouldLog |= AddToList(additionalHeaderElements, i, headerValue.ToString());
                 }
             }
         }
diff --git a/src/Middleware/HttpLogging/test/W3CLoggingMiddlewareTests.cs b/src/Middleware/HttpLogging/test/W3CLoggingMiddlewareTests.cs
index d9be128515e..988631cd96c 100644
--- a/src/Middleware/HttpLogging/test/W3CLoggingMiddlewareTests.cs
+++ b/src/Middleware/HttpLogging/test/W3CLoggingMiddlewareTests.cs
@@ -147,6 +147,42 @@ public class W3CLoggingMiddlewareTests
         Assert.EndsWith("- - 1.3.3.7,+2001:db8:85a3:8d3:1319:8a2e:370:7348", lines[3]);
     }
 
+    [Fact]
+    public async Task LogsAdditionalRequestHeaders_WithNoOtherOptions()
+    {
+        var options = CreateOptionsAccessor();
+        options.CurrentValue.AdditionalRequestHeaders.Add("x-forwarded-for");
+        options.CurrentValue.LoggingFields = W3CLoggingFields.None;
+
+        var logger = Helpers.CreateTestW3CLogger(options);
+
+        var middleware = new W3CLoggingMiddleware(
+            c =>
+            {
+                c.Response.StatusCode = 200;
+                return Task.CompletedTask;
+            },
+            options,
+            logger);
+
+        var httpContext = new DefaultHttpContext();
+        httpContext.Request.Protocol = "HTTP/1.0";
+        httpContext.Request.Headers["Cookie"] = "Snickerdoodle";
+        httpContext.Request.Headers["x-forwarded-for"] = "1.3.3.7, 2001:db8:85a3:8d3:1319:8a2e:370:7348";
+        httpContext.Response.StatusCode = 200;
+
+        var now = DateTime.UtcNow;
+        await middleware.Invoke(httpContext);
+        await logger.Processor.WaitForWrites(4).DefaultTimeout();
+
+        var lines = logger.Processor.Lines;
+        Assert.Equal("#Version: 1.0", lines[0]);
+
+        Assert.StartsWith("#Start-Date: ", lines[1]);
+        Assert.Equal("#Fields: cs(x-forwarded-for)", lines[2]);
+        Assert.Equal("1.3.3.7,+2001:db8:85a3:8d3:1319:8a2e:370:7348", lines[3]);
+    }
+
     [Fact]
     public async Task OmitsDuplicateAdditionalRequestHeaders()
     {
-- 
GitLab