From 767f1bbb45a9d555daecf90da386e1f04738a002 Mon Sep 17 00:00:00 2001 From: Paolo Insogna Date: Fri, 7 Oct 2022 21:55:14 +0200 Subject: [PATCH 1/2] fix: Reset Content-length upon reset. Fixes #202. --- src/llhttp/http.ts | 2 +- test/fixtures/extra.c | 3 +++ test/md-test.ts | 4 +++ test/request/content-length.md | 45 +++++++++++++++++++++++++++++++++ test/response/content-length.md | 41 ++++++++++++++++++++++++++++++ 5 files changed, 94 insertions(+), 1 deletion(-) diff --git a/src/llhttp/http.ts b/src/llhttp/http.ts index ecbb85ab..d05719c3 100644 --- a/src/llhttp/http.ts +++ b/src/llhttp/http.ts @@ -995,7 +995,7 @@ export class HTTP { // Check if we'd like to keep-alive n('cleanup') .otherwise(p.invoke(callback.afterMessageComplete, { - 1: n('restart'), + 1: this.update('content_length', 0, n('restart')), }, this.update('finish', FINISH.SAFE, lenientClose))); if (this.mode === 'strict') { diff --git a/test/fixtures/extra.c b/test/fixtures/extra.c index 40514214..c0efa373 100644 --- a/test/fixtures/extra.c +++ b/test/fixtures/extra.c @@ -283,6 +283,9 @@ int llhttp__on_headers_complete(llparse_t* s, const char* p, const char* endp) { #ifdef LLHTTP__TEST_PAUSE_ON_HEADERS_COMPLETE return LLPARSE__ERROR_PAUSE; + #elif defined(LLHTTP__TEST_SKIP_BODY) + llparse__print(p, endp, "skip body"); + return 1; #else return 0; #endif diff --git a/test/md-test.ts b/test/md-test.ts index 7f3296b8..55881812 100644 --- a/test/md-test.ts +++ b/test/md-test.ts @@ -99,6 +99,10 @@ async function buildMode(mode: llhttp.HTTPMode, ty: TestType, meta: any) extra.push(`-DLLHTTP__TEST_PAUSE_${meta.pause.toUpperCase()}=1`); } + if (meta.skipBody) { + extra.push('-DLLHTTP__TEST_SKIP_BODY=1'); + } + entry = await build(node.llparse, node.entry, `${prefix}-${mode}-${ty}`, { extra, }, ty); diff --git a/test/request/content-length.md b/test/request/content-length.md index 0101f615..9644ac53 100644 --- a/test/request/content-length.md +++ b/test/request/content-length.md @@ -387,3 +387,48 @@ off=14 len=3 span[version]="1.1" off=17 version complete off=26 error code=10 reason="Invalid header token" ``` + +## Content-Length reset when no body is assumed + + +```http +PUT /url HTTP/1.1 +Content-Length: 123 + +POST /url HTTP/1.1 +Content-Length: 456 + + +``` + +```log +off=0 message begin +off=0 len=3 span[method]="PUT" +off=3 method complete +off=4 len=4 span[url]="/url" +off=9 url complete +off=14 len=3 span[version]="1.1" +off=17 version complete +off=19 len=14 span[header_field]="Content-Length" +off=34 header_field complete +off=35 len=3 span[header_value]="123" +off=40 header_value complete +off=42 headers complete method=4 v=1/1 flags=20 content_length=123 +off=42 skip body +off=42 message complete +off=42 reset +off=42 message begin +off=42 len=4 span[method]="POST" +off=46 method complete +off=47 len=4 span[url]="/url" +off=52 url complete +off=57 len=3 span[version]="1.1" +off=60 version complete +off=62 len=14 span[header_field]="Content-Length" +off=77 header_field complete +off=78 len=3 span[header_value]="456" +off=83 header_value complete +off=85 headers complete method=3 v=1/1 flags=20 content_length=456 +off=85 skip body +off=85 message complete +``` diff --git a/test/response/content-length.md b/test/response/content-length.md index 0d1bb535..2013adbf 100644 --- a/test/response/content-length.md +++ b/test/response/content-length.md @@ -115,3 +115,44 @@ off=78 chunk header len=0 off=80 chunk complete off=80 message complete ``` + +## Content-Length reset when no body is assumed + + +```http +HTTP/1.1 200 OK +Content-Length: 123 + +HTTP/1.1 200 OK +Content-Length: 456 + + +``` + +```log +off=0 message begin +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]="123" +off=38 header_value complete +off=40 headers complete status=200 v=1/1 flags=20 content_length=123 +off=40 skip body +off=40 message complete +off=40 reset +off=40 message begin +off=45 len=3 span[version]="1.1" +off=48 version complete +off=53 len=2 span[status]="OK" +off=57 status complete +off=57 len=14 span[header_field]="Content-Length" +off=72 header_field complete +off=73 len=3 span[header_value]="456" +off=78 header_value complete +off=80 headers complete status=200 v=1/1 flags=20 content_length=456 +off=80 skip body +off=80 message complete +``` From 97e46fdcaa4416b073f7abd7d3db9675fa3db2e8 Mon Sep 17 00:00:00 2001 From: Paolo Insogna Date: Tue, 11 Oct 2022 00:19:02 +0200 Subject: [PATCH 2/2] fix: Rename tests Co-authored-by: Matteo Collina --- test/request/content-length.md | 2 +- test/response/content-length.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/request/content-length.md b/test/request/content-length.md index 9644ac53..c8fa9daa 100644 --- a/test/request/content-length.md +++ b/test/request/content-length.md @@ -388,7 +388,7 @@ off=17 version complete off=26 error code=10 reason="Invalid header token" ``` -## Content-Length reset when no body is assumed +## Content-Length reset when no body is received ```http diff --git a/test/response/content-length.md b/test/response/content-length.md index 2013adbf..6c339244 100644 --- a/test/response/content-length.md +++ b/test/response/content-length.md @@ -116,7 +116,7 @@ off=80 chunk complete off=80 message complete ``` -## Content-Length reset when no body is assumed +## Content-Length reset when no body is received ```http