using System.Text;
using XFESystem.NativeRuntime.Application.Web;
namespace XFESystem.HttpProtocol.Tests;
public sealed class NativeBingHeadersTests
{
[Fact]
public void DiagnosticHeadersKeepFramingButRemoveCredentialsAndCookieValues()
{
const string headers = "GET /search?q=actual HTTP/1.1\r\nHost: bing.test\r\nCookie: sid=secret\r\nSet-Cookie: session=secret; HttpOnly\r\nAuthorization: Bearer secret\r\n\r\n";
string redacted = NativeHttpProtocol.RedactSensitiveHeaders(headers);
Assert.DoesNotContain("secret", redacted); Assert.Contains("Host: bing.test", redacted);
Assert.StartsWith("GET /search?q=actual HTTP/1.1\r\n", redacted); Assert.EndsWith("\r\n\r\n", redacted);
}
[Fact]
public void MultipleCspPoliciesAndCookieHeadersRemainSeparateAtEveryPacketBoundary()
{
byte[] wire = Encoding.ASCII.GetBytes("HTTP/1.1 200 OK\r\nContent-Length: 0\r\nContent-Security-Policy: script-src 'nonce-a' 'strict-dynamic'\r\nContent-Security-Policy: script-src 'none'\r\nSet-Cookie: one=1; Path=/\r\nSet-Cookie: two=2; HttpOnly\r\n\r\n");
for (int packet = 1; packet <= wire.Length; packet++)
{
using var stream = new MemoryStream(wire);
var response = NativeHttpProtocol.ReadResponse((target, offset, count) => stream.Read(target, offset, Math.Min(packet, count)), 1024);
Assert.Equal("script-src 'nonce-a' 'strict-dynamic', script-src 'none'", response.ContentSecurityPolicy);
Assert.Equal(new[] { "one=1; Path=/", "two=2; HttpOnly" }, response.SetCookies);
}
}
}
using System.Text;
using XFESystem.NativeRuntime.Application.Web;
namespace XFESystem.HttpProtocol.Tests;
public sealed class NativeBingHeadersTests
{
[Fact]
public void DiagnosticHeadersKeepFramingButRemoveCredentialsAndCookieValues()
{
const string headers = "GET /search?q=actual HTTP/1.1\r\nHost: bing.test\r\nCookie: sid=secret\r\nSet-Cookie: session=secret; HttpOnly\r\nAuthorization: Bearer secret\r\n\r\n";
string redacted = NativeHttpProtocol.RedactSensitiveHeaders(headers);
Assert.DoesNotContain("secret", redacted); Assert.Contains("Host: bing.test", redacted);
Assert.StartsWith("GET /search?q=actual HTTP/1.1\r\n", redacted); Assert.EndsWith("\r\n\r\n", redacted);
}
[Fact]
public void MultipleCspPoliciesAndCookieHeadersRemainSeparateAtEveryPacketBoundary()
{
byte[] wire = Encoding.ASCII.GetBytes("HTTP/1.1 200 OK\r\nContent-Length: 0\r\nContent-Security-Policy: script-src 'nonce-a' 'strict-dynamic'\r\nContent-Security-Policy: script-src 'none'\r\nSet-Cookie: one=1; Path=/\r\nSet-Cookie: two=2; HttpOnly\r\n\r\n");
for (int packet = 1; packet <= wire.Length; packet++)
{
using var stream = new MemoryStream(wire);
var response = NativeHttpProtocol.ReadResponse((target, offset, count) => stream.Read(target, offset, Math.Min(packet, count)), 1024);
Assert.Equal("script-src 'nonce-a' 'strict-dynamic', script-src 'none'", response.ContentSecurityPolicy);
Assert.Equal(new[] { "one=1; Path=/", "two=2; HttpOnly" }, response.SetCookies);
}
}
}