From 5f29a33a00b305986cee0395e77bde1828327507 Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Wed, 20 Nov 2019 23:59:16 -0800 Subject: [PATCH] http: keep `F_LENIENT` between messages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `F_LENIENT` flag should not be reset along with the other flags when starting parsing a new message. This setting should remain on for the lifetime of the parser or until `llhttp_set_lenient(..., 0)`. PR-URL: https://github.com/nodejs/llhttp/pull/34 Reviewed-By: Anna Henningsen Reviewed-By: Ben Noordhuis Reviewed-By: Tobias Nießen Reviewed-By: Sam Roberts --- src/native/http.c | 4 +++- test/request/lenient.md | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/native/http.c b/src/native/http.c index 67834c2d..65d2ee67 100644 --- a/src/native/http.c +++ b/src/native/http.c @@ -74,9 +74,11 @@ int llhttp__after_message_complete(llhttp_t* parser, const char* p, int should_keep_alive; should_keep_alive = llhttp_should_keep_alive(parser); - parser->flags = 0; parser->finish = HTTP_FINISH_SAFE; + /* Keep `F_LENIENT` flag between messages, but reset every other flag */ + parser->flags &= F_LENIENT; + /* NOTE: this is ignored in loose parsing mode */ return should_keep_alive; } diff --git a/test/request/lenient.md b/test/request/lenient.md index 450dd401..8fb50e41 100644 --- a/test/request/lenient.md +++ b/test/request/lenient.md @@ -22,6 +22,35 @@ off=33 headers complete method=1 v=1/1 flags=100 content_length=0 off=33 message complete ``` +## Second request header value with lenient + + +```http +GET /url HTTP/1.1 +Header1: Okay + + +GET /url HTTP/1.1 +Header1: \f + + +``` + +```log +off=0 message begin +off=4 len=4 span[url]="/url" +off=19 len=7 span[header_field]="Header1" +off=28 len=4 span[header_value]="Okay" +off=36 headers complete method=1 v=1/1 flags=100 content_length=0 +off=36 message complete +off=38 message begin +off=42 len=4 span[url]="/url" +off=57 len=7 span[header_field]="Header1" +off=66 len=1 span[header_value]="\f" +off=71 headers complete method=1 v=1/1 flags=100 content_length=0 +off=71 message complete +``` + ## Header value without lenient