srdusr
aboutsummaryrefslogtreecommitdiffstats
path: root/internal/proxy/intrude_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/proxy/intrude_test.go')
-rw-r--r--internal/proxy/intrude_test.go47
1 files changed, 47 insertions, 0 deletions
diff --git a/internal/proxy/intrude_test.go b/internal/proxy/intrude_test.go
index 5df80e6..6a0007f 100644
--- a/internal/proxy/intrude_test.go
+++ b/internal/proxy/intrude_test.go
@@ -114,3 +114,50 @@ func TestIntrudeRequestCount(t *testing.T) {
t.Fatalf("expected 2 positions, got %d", len(positions))
}
}
+
+func TestFixContentLength(t *testing.T) {
+ tests := []struct {
+ name string
+ raw string
+ want string
+ }{
+ {
+ name: "recalculates a stale length",
+ raw: "POST / HTTP/1.1\r\nHost: x\r\nContent-Length: 3\r\n\r\nfuzzedvalue",
+ want: "POST / HTTP/1.1\r\nHost: x\r\nContent-Length: 11\r\n\r\nfuzzedvalue",
+ },
+ {
+ name: "case-insensitive header name",
+ raw: "POST / HTTP/1.1\r\nHost: x\r\ncontent-length: 1\r\n\r\nabc",
+ want: "POST / HTTP/1.1\r\nHost: x\r\nContent-Length: 3\r\n\r\nabc",
+ },
+ {
+ name: "no content-length header - unchanged",
+ raw: "GET /§1§ HTTP/1.1\r\nHost: x\r\n\r\n",
+ want: "GET /§1§ HTTP/1.1\r\nHost: x\r\n\r\n",
+ },
+ {
+ name: "no body boundary - unchanged",
+ raw: "GET / HTTP/1.1\r\nHost: x",
+ want: "GET / HTTP/1.1\r\nHost: x",
+ },
+ {
+ name: "two content-length headers - left alone, ambiguous smuggling case",
+ raw: "POST / HTTP/1.1\r\nContent-Length: 3\r\nContent-Length: 999\r\n\r\nabc",
+ want: "POST / HTTP/1.1\r\nContent-Length: 3\r\nContent-Length: 999\r\n\r\nabc",
+ },
+ {
+ name: "empty body recalculates to zero",
+ raw: "POST / HTTP/1.1\r\nContent-Length: 5\r\n\r\n",
+ want: "POST / HTTP/1.1\r\nContent-Length: 0\r\n\r\n",
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ got := fixContentLength([]byte(tt.raw))
+ if string(got) != tt.want {
+ t.Errorf("fixContentLength(%q) = %q, want %q", tt.raw, got, tt.want)
+ }
+ })
+ }
+}