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
12 changes: 10 additions & 2 deletions DebugProbe.AspNetCore.Tests/Rendering/HtmlRendererTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public void Html_encoding_escapes_untrusted_values()
var entry = CreateEntry();
entry.Method = "<script>alert(1)</script>";
entry.Path = "/orders/<bad>";
entry.Headers["X-Unsafe"] = "<img src=x onerror=alert(1)>";
entry.RequestHeaders["X-Unsafe"] = "<img src=x onerror=alert(1)>";

var html = HtmlRenderer.RenderDetailsPage(
entry,
Expand Down Expand Up @@ -94,7 +94,15 @@ private static DebugEntry CreateEntry()
DurationMs = 12,
Timestamp = new DateTimeOffset(2026, 1, 2, 3, 4, 5, TimeSpan.Zero),
RequestTimeUtc = new DateTimeOffset(2026, 1, 2, 3, 4, 5, TimeSpan.Zero),
Headers = new Dictionary<string, string> { ["X-Test"] = "yes" }
RequestHeaders = new Dictionary<string, string>
{
["X-Test"] = "yes"
},

ResponseHeaders = new Dictionary<string, string>
{
["Content-Type"] = "application/json"
}
};
}

Expand Down
29 changes: 29 additions & 0 deletions DebugProbe.AspNetCore/Assets/html/details.html
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ <h2>{{method}} {{path}}</h2>
</div>
</div>


<div class="section-title">
<h3>Request URL</h3>

Expand All @@ -104,6 +105,20 @@ <h3>Request URL</h3>
<pre>{{requestUrl}}</pre>
</div>

<div class="section-title">
<h3>Request Headers</h3>

<div class="code-badges">
<span class="code-badge payload-text">
HEADERS
</span>
</div>
</div>

<div class="code-block">
<button class="copy-btn" onclick="copyText(this)">Copy</button>
<pre>{{requestHeaders}}</pre>
</div>

<div class="section-title">
<h3>Request Body</h3>
Expand All @@ -119,6 +134,20 @@ <h3>Request Body</h3>
<pre>{{request}}</pre>
</div>

<div class="section-title">
<h3>Response Headers</h3>

<div class="code-badges">
<span class="code-badge payload-text">
HEADERS
</span>
</div>
</div>

<div class="code-block">
<button class="copy-btn" onclick="copyText(this)">Copy</button>
<pre>{{responseHeaders}}</pre>
</div>

<div class="section-title">
<h3>Response Body</h3>
Expand Down
10 changes: 5 additions & 5 deletions DebugProbe.AspNetCore/DebugProbe.AspNetCore.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,11 @@
</ItemGroup>

<ItemGroup>
<EmbeddedResource Include="Assets\**\*.html" />
<EmbeddedResource Include="Assets\**\*.css" />
<EmbeddedResource Include="Assets\**\*.js" />
<EmbeddedResource Include="Assets\**\*.png" />
<EmbeddedResource Include="Assets\**\*.ico" />
<EmbeddedResource Include="Assets\**\*" />
</ItemGroup>

<ItemGroup>
<None Remove="Assets\**\*" />
</ItemGroup>

<ItemGroup>
Expand Down
13 changes: 9 additions & 4 deletions DebugProbe.AspNetCore/Internal/Rendering/HtmlRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,11 @@ public static string RenderIndexPage(List<DebugEntry> items)

public static string RenderDetailsPage(DebugEntry x, DebugEnvironment e, string req, string res)
{
var headers = string.Join("", x.Headers.Select(h =>
$"<tr><td>{Encode(h.Key)}</td><td>{Encode(h.Value)}</td></tr>"));
//var headers = string.Join("", x.Reqe.Select(h =>
// $"<tr><td>{Encode(h.Key)}</td><td>{Encode(h.Value)}</td></tr>"));

var requestHeaders = string.Join(Environment.NewLine, x.RequestHeaders.Select(h => $"{h.Key}: {h.Value}"));
var responseHeaders = string.Join(Environment.NewLine, x.ResponseHeaders.Select(h => $"{h.Key}: {h.Value}"));

var pathWithQuery = string.IsNullOrEmpty(x.Query)
? x.Path
Expand Down Expand Up @@ -79,13 +82,15 @@ public static string RenderDetailsPage(DebugEntry x, DebugEnvironment e, string
.Replace("{{requestUrl}}", Encode(string.IsNullOrEmpty(x.RequestUrl) ? "" : x.RequestUrl))
.Replace("{{requestType}}", GetPayloadType(req))
.Replace("{{requestTypeClass}}", GetPayloadTypeClass(req))
.Replace("{{requestHeaders}}", Encode(requestHeaders))
.Replace("{{request}}", Encode(string.IsNullOrEmpty(req) ? "" : req))

.Replace("{{responseType}}", GetPayloadType(res))
.Replace("{{responseTypeClass}}", GetPayloadTypeClass(res))
.Replace("{{response}}", Encode(string.IsNullOrEmpty(res) ? "" : res))
.Replace("{{responseHeaders}}", Encode(responseHeaders))
.Replace("{{response}}", Encode(string.IsNullOrEmpty(res) ? "" : res));

.Replace("{{headers}}", headers);
//.Replace("{{headers}}", headers);

return BuildLayout(content);
}
Expand Down
12 changes: 8 additions & 4 deletions DebugProbe.AspNetCore/Middleware/DebugProbeMiddleware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,11 @@ public async Task Invoke(HttpContext context, DebugEntryStore store)
RequestSize = context.Request.ContentLength ?? Encoding.UTF8.GetByteCount(requestBody),
ResponseSize = Encoding.UTF8.GetByteCount(responseBody),


// Request Headers
RequestHeaders = context.Request.Headers.ToDictionary(x => x.Key, x =>
SensitiveHeaders.Contains(x.Key) ? "[REDACTED]" : x.Value.ToString()),

// Request
RequestUrl = $"{context.Request.Scheme}://{context.Request.Host}" +
$"{context.Request.Path}{context.Request.QueryString}",
Expand All @@ -103,10 +108,9 @@ public async Task Invoke(HttpContext context, DebugEntryStore store)
// Response
ResponseBody = Trim(responseBody, maxBodySize),

// Headers
Headers = context.Request.Headers.ToDictionary(
x => x.Key,
x => SensitiveHeaders.Contains(x.Key) ? "[REDACTED]" : x.Value.ToString()),
// Response Headers
ResponseHeaders = context.Response.Headers.ToDictionary(x => x.Key, x =>
SensitiveHeaders.Contains(x.Key)? "[REDACTED]" : x.Value.ToString()),

// Other
Timestamp = DateTime.UtcNow,
Expand Down
3 changes: 2 additions & 1 deletion DebugProbe.AspNetCore/Models/DebugEntry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ public class DebugEntry
public string ResponseBody { get; set; } = default!;

// Headers
public Dictionary<string, string> Headers { get; set; } = new();
public Dictionary<string, string> RequestHeaders { get; set; } = new();
public Dictionary<string, string> ResponseHeaders { get; set; } = new();

// Metadata
public DateTimeOffset Timestamp { get; set; }
Expand Down
Loading