Normalize framing header names with pre-colon whitespace

This commit is contained in:
Erik Dubbelboer
2026-03-28 05:32:02 +01:00
parent 611132707f
commit 82254a7add
3 changed files with 35 additions and 1 deletions
+12
View File
@@ -53,6 +53,7 @@ func (s *headerScanner) next() bool {
s.err = fmt.Errorf("malformed MIME header line: %q", kv)
return false
}
k = trimTrailingSpace(k)
if !isValidHeaderKey(k) {
s.err = fmt.Errorf("malformed MIME header line: %q", kv)
return false
@@ -166,3 +167,14 @@ func trim(s []byte) []byte {
}
return s[i:n]
}
func trimTrailingSpace(s []byte) []byte {
for len(s) > 0 {
c := s[len(s)-1]
if c != ' ' && c != '\t' {
break
}
s = s[:len(s)-1]
}
return s
}
+22
View File
@@ -1777,6 +1777,28 @@ func TestRequestReadLimitBody(t *testing.T) {
testRequestReadLimitBodySuccess(t, "GET /foo HTTP/1.0\r\n\r\n", 0)
}
func TestRequestReadLimitBodyWhitespaceBeforeColonFramingHeaders(t *testing.T) {
t.Parallel()
var req Request
r := bytes.NewBufferString("POST /foo HTTP/1.1\r\nHost: a.com\r\nContent-Length : 4\r\n\r\ntestNEXT")
br := bufio.NewReader(r)
if err := req.ReadLimitBody(br, 10); err != nil {
t.Fatalf("unexpected error: %v", err)
}
if got := string(req.Body()); got != "test" {
t.Fatalf("unexpected body %q", got)
}
rest, err := io.ReadAll(br)
if err != nil {
t.Fatalf("unexpected read error: %v", err)
}
if got := string(rest); got != "NEXT" {
t.Fatalf("unexpected buffered bytes %q", got)
}
}
func testResponseReadLimitBodyError(t *testing.T, s string, maxBodySize int, expectedErr error) {
var resp Response
r := bytes.NewBufferString(s)
+1 -1
View File
@@ -133,7 +133,7 @@ func getChunkedTestEnv(t testing.TB) (*fasthttputil.InmemoryListener, []byte) {
}()
req := Request{}
req.SetHost("localhost")
req.Header.SetHost("localhost")
req.Header.SetMethod("POST")
req.Header.Set("transfer-encoding", "chunked")
req.Header.SetContentLength(-1)