Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 28 additions & 6 deletions Shared/Middleware/RequestLoggingMiddleware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,13 @@ namespace Shared.Middleware;

public class RequestLoggingMiddleware
{
#region Fields
private readonly RequestDelegate next;
#endregion

#region Constructors
public RequestLoggingMiddleware(RequestDelegate next)
{
this.next = next;
}
#endregion

#region public async Task Invoke(HttpContext context)
public async Task Invoke(HttpContext context, RequestResponseMiddlewareLoggingConfig configuration)
{
if (!configuration.LogRequests)
Expand All @@ -41,6 +36,34 @@ public async Task Invoke(HttpContext context, RequestResponseMiddlewareLoggingCo
var requestBodyText = await new StreamReader(requestBodyStream).ReadToEndAsync();
StringBuilder logMessage = new();
logMessage.Append($"Request: Method: {context.Request.Method} Url: {url}");

// Append request headers. Redact sensitive headers like Authorization and Cookie.
if (context.Request.Headers != null && context.Request.Headers.Count > 0)
{
logMessage.Append(' ');
logMessage.Append("Headers:");
var firstHeader = true;
foreach (var header in context.Request.Headers)
{
if (!firstHeader)
logMessage.Append(',');
firstHeader = false;

var value = header.Value.ToString();
if (string.Equals(header.Key, "Authorization", StringComparison.OrdinalIgnoreCase)
|| string.Equals(header.Key, "Cookie", StringComparison.OrdinalIgnoreCase))
{
value = "***REDACTED***";
}

// Format: Key=Value
logMessage.Append(' ');
logMessage.Append(header.Key);
logMessage.Append('=');
logMessage.Append(value);
}
}

if (requestBodyText != String.Empty)
{
logMessage.Append(' ');
Expand All @@ -56,5 +79,4 @@ public async Task Invoke(HttpContext context, RequestResponseMiddlewareLoggingCo
context.Request.Body = originalRequestBody;
}
}
#endregion
}
41 changes: 29 additions & 12 deletions Shared/Middleware/ResponseLoggingMiddleware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,13 @@ namespace Shared.Middleware;

public class ResponseLoggingMiddleware
{
#region Fields

private readonly RequestDelegate next;

#endregion

#region Constructors
public ResponseLoggingMiddleware(RequestDelegate next)
{
this.next = next;
}
#endregion

#region Public Methods

#region public async Task Invoke(HttpContext context)
public async Task Invoke(HttpContext context, RequestResponseMiddlewareLoggingConfig configuration)
{
if (!configuration.LogResponses)
Expand All @@ -48,6 +39,35 @@ public async Task Invoke(HttpContext context, RequestResponseMiddlewareLoggingCo
var responseBody = await new StreamReader(responseBodyStream).ReadToEndAsync();
StringBuilder logMessage = new();
logMessage.Append($"Response: Status Code: {context.Response.StatusCode}");

// Append response headers. Redact sensitive headers like Set-Cookie and Authorization.
if (context.Response.Headers != null && context.Response.Headers.Count > 0)
{
logMessage.Append(' ');
logMessage.Append("Headers:");
var firstHeader = true;
foreach (var header in context.Response.Headers)
{
if (!firstHeader)
logMessage.Append(',');
firstHeader = false;

var value = header.Value.ToString();
if (string.Equals(header.Key, "Set-Cookie", StringComparison.OrdinalIgnoreCase)
|| string.Equals(header.Key, "Authorization", StringComparison.OrdinalIgnoreCase)
|| string.Equals(header.Key, "Cookie", StringComparison.OrdinalIgnoreCase))
{
value = "***REDACTED***";
}

// Format: Key=Value
logMessage.Append(' ');
logMessage.Append(header.Key);
logMessage.Append('=');
logMessage.Append(value);
}
}

if (!String.IsNullOrEmpty(responseBody))
{
logMessage.Append(' ');
Expand All @@ -65,9 +85,6 @@ public async Task Invoke(HttpContext context, RequestResponseMiddlewareLoggingCo
}
}
}
#endregion

#endregion
}

[ExcludeFromCodeCoverage]
Expand Down
Loading