diff options
Diffstat (limited to 'internal/proxy/intrude_test.go')
| -rw-r--r-- | internal/proxy/intrude_test.go | 47 |
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) + } + }) + } +} |