From 9b061d091e198cf3b4629f3da3d205dfa9b3511c Mon Sep 17 00:00:00 2001 From: ryuhei shima Date: Sun, 22 Mar 2026 00:52:59 +0900 Subject: [PATCH] fix: allow tabs around Content-Length --- src/llhttp/http.ts | 2 +- test/request/content-length.md | 27 +++++++++++++++++++++++++++ test/response/content-length.md | 25 +++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/llhttp/http.ts b/src/llhttp/http.ts index 8388c574..dbc9c607 100644 --- a/src/llhttp/http.ts +++ b/src/llhttp/http.ts @@ -782,7 +782,7 @@ export class HTTP { .otherwise(n('header_value_content_length_ws')); n('header_value_content_length_ws') - .match(' ', n('header_value_content_length_ws')) + .match([ ' ', '\t' ], n('header_value_content_length_ws')) .peek([ '\r', '\n' ], this.setFlag(FLAGS.CONTENT_LENGTH, 'header_value_otherwise')) .otherwise(invalidContentLength('Invalid character in Content-Length')); diff --git a/test/request/content-length.md b/test/request/content-length.md index 0485f127..8317b056 100644 --- a/test/request/content-length.md +++ b/test/request/content-length.md @@ -314,6 +314,33 @@ off=39 header_value complete off=41 headers complete method=3 v=1/1 flags=20 content_length=42 ``` +### Tabs in `Content-Length` (surrounding) + + +```http +POST / HTTP/1.1 +Content-Length:\t42\t + + +``` + +```log +off=0 message begin +off=0 len=4 span[method]="POST" +off=4 method complete +off=5 len=1 span[url]="/" +off=7 url complete +off=7 len=4 span[protocol]="HTTP" +off=11 protocol complete +off=12 len=3 span[version]="1.1" +off=15 version complete +off=17 len=14 span[header_field]="Content-Length" +off=32 header_field complete +off=33 len=5 span[header_value]="42\t " +off=40 header_value complete +off=42 headers complete method=3 v=1/1 flags=20 content_length=42 +``` + ### Spaces in `Content-Length` #2 diff --git a/test/response/content-length.md b/test/response/content-length.md index def15061..5b9be2d5 100644 --- a/test/response/content-length.md +++ b/test/response/content-length.md @@ -164,3 +164,28 @@ off=80 headers complete status=200 v=1/1 flags=20 content_length=456 off=80 skip body off=80 message complete ``` + +## Tabs in `Content-Length` (surrounding) + + +```http +HTTP/1.1 200 OK +Content-Length:\t42\t + + +``` + +```log +off=0 message begin +off=0 len=4 span[protocol]="HTTP" +off=4 protocol complete +off=5 len=3 span[version]="1.1" +off=8 version complete +off=13 len=2 span[status]="OK" +off=17 status complete +off=17 len=14 span[header_field]="Content-Length" +off=32 header_field complete +off=33 len=3 span[header_value]="42\t" +off=38 header_value complete +off=40 headers complete status=200 v=1/1 flags=20 content_length=42 +```