@@ -61,33 +61,41 @@ checks could be performed to get even stricter verification of the llhttp.
6161## Usage
6262
6363``` C
64+ #include " stdio.h"
6465#include " llhttp.h"
66+ #include " string.h"
6567
66- llhttp_t parser;
67- llhttp_settings_t settings;
68+ int handle_on_message_complete (llhttp_t* parser) {
69+ fprintf(stdout, "Message completed!\n");
70+ return 0;
71+ }
72+
73+ int main() {
74+ llhttp_t parser;
75+ llhttp_settings_t settings;
6876
69- /* Initialize user callbacks and settings */
70- llhttp_settings_init (&settings);
77+ /* Initialize user callbacks and settings */
78+ llhttp_settings_init(&settings);
7179
72- / * Set user callback * /
73- settings.on_message_complete = handle_on_message_complete;
80+ /* Set user callback */
81+ settings.on_message_complete = handle_on_message_complete;
7482
75- / * Initialize the parser in HTTP_BOTH mode, meaning that it will select between
76- * HTTP_REQUEST and HTTP_RESPONSE parsing automatically while reading the first
77- * input.
78- * /
79- llhttp_init(&parser, HTTP_BOTH, &settings);
83+ /* Initialize the parser in HTTP_BOTH mode, meaning that it will select between
84+ * HTTP_REQUEST and HTTP_RESPONSE parsing automatically while reading the first
85+ * input.
86+ */
87+ llhttp_init(&parser, HTTP_BOTH, &settings);
8088
81- / * Parse request! * /
82- const char* request = "GET / HTTP/1.1\r\n\r\n";
83- int request_len = strlen(request);
89+ /* Parse request! */
90+ const char* request = "GET / HTTP/1.1\r\n\r\n";
91+ int request_len = strlen(request);
8492
85- enum llhttp_errno err = llhttp_execute(&parser, request, request_len);
86- if (err == HPE_OK) {
87- / * Successfully parsed! * /
88- } else {
89- fprintf(stderr, "Parse error: %s %s\n", llhttp_errno_name(err),
90- parser.reason);
93+ enum llhttp_errno err = llhttp_execute(&parser, request, request_len);
94+ if (err == HPE_OK) {
95+ fprintf(stdout, " Successfully parsed!\n");
96+ } else {
97+ fprintf(stderr, "Parse error: %s %s\n", llhttp_errno_name(err), parser.reason);
98+ }
9199}
92100```
93101For more information on API usage, please refer to [src/native/api.h](https://github.com/nodejs/llhttp/blob/main/src/native/api.h).
@@ -279,7 +287,7 @@ protocol support to highly non-compliant clients/server.
279287No `HPE_INVALID_HEADER_TOKEN` will be raised for incorrect header values when
280288lenient parsing is "on".
281289
282- **USE AT YOUR OWN RISK !**
290+ **Enabling this flag can pose a security issue since you will be exposed to request smuggling attacks. USE WITH CAUTION !**
283291
284292### `void llhttp_set_lenient_chunked_length(llhttp_t* parser, int enabled)`
285293
@@ -292,23 +300,22 @@ conjunction with `Content-Length`.
292300This error is important to prevent HTTP request smuggling, but may be less desirable
293301for small number of cases involving legacy servers.
294302
295- **USE AT YOUR OWN RISK !**
303+ **Enabling this flag can pose a security issue since you will be exposed to request smuggling attacks. USE WITH CAUTION !**
296304
297305### `void llhttp_set_lenient_keep_alive(llhttp_t* parser, int enabled)`
298306
299307Enables/disables lenient handling of `Connection: close` and HTTP/1.0
300308requests responses.
301309
302- Normally `llhttp` would error on (in strict mode) or discard (in loose mode)
303- the HTTP request/response after the request/response with `Connection: close`
304- and `Content-Length`.
310+ Normally `llhttp` would error the HTTP request/response
311+ after the request/response with `Connection: close` and `Content-Length`.
305312
306313This is important to prevent cache poisoning attacks,
307314but might interact badly with outdated and insecure clients.
308315
309316With this flag the extra request/response will be parsed normally.
310317
311- **USE AT YOUR OWN RISK !**
318+ **Enabling this flag can pose a security issue since you will be exposed to poisoning attacks. USE WITH CAUTION !**
312319
313320### `void llhttp_set_lenient_transfer_encoding(llhttp_t* parser, int enabled)`
314321
@@ -323,7 +330,67 @@ avoid request smuggling.
323330
324331With this flag the extra value will be parsed normally.
325332
326- **USE AT YOUR OWN RISK!**
333+ **Enabling this flag can pose a security issue since you will be exposed to request smuggling attacks. USE WITH CAUTION!**
334+
335+ ### `void llhttp_set_lenient_version(llhttp_t* parser, int enabled)`
336+
337+ Enables/disables lenient handling of HTTP version.
338+
339+ Normally `llhttp` would error when the HTTP version in the request or status line
340+ is not `0.9`, `1.0`, `1.1` or `2.0`.
341+ With this flag the extra value will be parsed normally.
342+
343+ **Enabling this flag can pose a security issue since you will allow unsupported HTTP versions. USE WITH CAUTION!**
344+
345+ ### `void llhttp_set_lenient_data_after_close(llhttp_t* parser, int enabled)`
346+
347+ Enables/disables lenient handling of additional data received after a message ends
348+ and keep-alive is disabled.
349+
350+ Normally `llhttp` would error when additional unexpected data is received if the message
351+ contains the `Connection` header with `close` value.
352+ With this flag the extra data will discarded without throwing an error.
353+
354+ **Enabling this flag can pose a security issue since you will be exposed to poisoning attacks. USE WITH CAUTION!**
355+
356+ ### `void llhttp_set_lenient_optional_lf_after_cr(llhttp_t* parser, int enabled)`
357+
358+ Enables/disables lenient handling of incomplete CRLF sequences.
359+
360+ Normally `llhttp` would error when a CR is not followed by LF when terminating the
361+ request line, the status line, the headers or a chunk header.
362+ With this flag only a CR is required to terminate such sections.
363+
364+ **Enabling this flag can pose a security issue since you will be exposed to request smuggling attacks. USE WITH CAUTION!**
365+
366+ ### `void llhttp_set_lenient_optional_cr_before_lf(llhttp_t* parser, int enabled)`
367+
368+ Enables/disables lenient handling of line separators.
369+
370+ Normally `llhttp` would error when a LF is not preceded by CR when terminating the
371+ request line, the status line, the headers, a chunk header or a chunk data.
372+ With this flag only a LF is required to terminate such sections.
373+
374+ **Enabling this flag can pose a security issue since you will be exposed to request smuggling attacks. USE WITH CAUTION!**
375+
376+ ### `void llhttp_set_lenient_optional_crlf_after_chunk(llhttp_t* parser, int enabled)`
377+
378+ Enables/disables lenient handling of chunks not separated via CRLF.
379+
380+ Normally `llhttp` would error when after a chunk data a CRLF is missing before
381+ starting a new chunk.
382+ With this flag the new chunk can start immediately after the previous one.
383+
384+ **Enabling this flag can pose a security issue since you will be exposed to request smuggling attacks. USE WITH CAUTION!**
385+
386+ ### `void llhttp_set_lenient_spaces_after_chunk_size(llhttp_t* parser, int enabled)`
387+
388+ Enables/disables lenient handling of spaces after chunk size.
389+
390+ Normally `llhttp` would error when after a chunk size is followed by one or more spaces are present instead of a CRLF or `;`.
391+ With this flag this check is disabled.
392+
393+ **Enabling this flag can pose a security issue since you will be exposed to request smuggling attacks. USE WITH CAUTION!**
327394
328395## Build Instructions
329396
@@ -345,17 +412,34 @@ make
345412
346413### Using with CMake
347414
348- If you want to use this library in a CMake project you can use the snippet below.
415+ If you want to use this library in a CMake project as a shared library, you can use the snippet below.
349416
350417```
351418FetchContent_Declare(llhttp
352- URL "https://github.com/nodejs/llhttp/archive/refs/tags/v6.0.5. tar.gz") # Using version 6.0.5
419+ URL "https://github.com/nodejs/llhttp/archive/refs/tags/release/v8.1.0. tar.gz")
353420
354421FetchContent_MakeAvailable(llhttp)
355422
356- target_link_libraries(${EXAMPLE_PROJECT_NAME} ${PROJECT_LIBRARIES} llhttp ${PROJECT_NAME})
423+ # Link with the llhttp_shared target
424+ target_link_libraries(${EXAMPLE_PROJECT_NAME} ${PROJECT_LIBRARIES} llhttp_shared ${PROJECT_NAME})
357425```
358426
427+ If you want to use this library in a CMake project as a static library, you can set some cache variables first.
428+
429+ ```
430+ FetchContent_Declare(llhttp
431+ URL "https://github.com/nodejs/llhttp/archive/refs/tags/release/v8.1.0.tar.gz")
432+
433+ set(BUILD_SHARED_LIBS OFF CACHE INTERNAL "")
434+ set(BUILD_STATIC_LIBS ON CACHE INTERNAL "")
435+ FetchContent_MakeAvailable(llhttp)
436+
437+ # Link with the llhttp_static target
438+ target_link_libraries(${EXAMPLE_PROJECT_NAME} ${PROJECT_LIBRARIES} llhttp_static ${PROJECT_NAME})
439+ ```
440+
441+ _ Note that using the git repo directly (e.g., via a git repo url and tag) will not work with FetchContent_Declare because [ CMakeLists.txt] ( ./CMakeLists.txt ) requires string replacements (e.g., ` _RELEASE_ ` ) before it will build._
442+
359443## Building on Windows
360444
361445### Installation
0 commit comments