Skip to content

Commit 75e0a3c

Browse files
committed
deps: update llhttp to 9.0.0
1 parent d396a04 commit 75e0a3c

File tree

11 files changed

+827
-9361
lines changed

11 files changed

+827
-9361
lines changed

deps/llhttp/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
libllhttp.pc

deps/llhttp/CMakeLists.txt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
cmake_minimum_required(VERSION 3.5.1)
22
cmake_policy(SET CMP0069 NEW)
33

4-
project(llhttp VERSION 8.1.1)
4+
project(llhttp VERSION 9.0.0)
55
include(GNUInstallDirs)
66

77
set(CMAKE_C_STANDARD 99)
@@ -47,8 +47,9 @@ configure_file(
4747
function(config_library target)
4848
target_sources(${target} PRIVATE ${LLHTTP_SOURCES} ${LLHTTP_HEADERS})
4949

50-
target_include_directories(${target} PRIVATE
51-
${CMAKE_CURRENT_SOURCE_DIR}/include
50+
target_include_directories(${target} PUBLIC
51+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
52+
$<INSTALL_INTERFACE:include>
5253
)
5354

5455
set_target_properties(${target} PROPERTIES
@@ -72,9 +73,10 @@ function(config_library target)
7273

7374
# This is required to work with FetchContent
7475
install(EXPORT llhttp
75-
FILE llhttp-config.cmake
76-
NAMESPACE llhttp::
77-
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/llhttp)
76+
FILE llhttp-config.cmake
77+
NAMESPACE llhttp::
78+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/llhttp
79+
)
7880
endfunction(config_library target)
7981

8082
if(BUILD_SHARED_LIBS)

deps/llhttp/README.md

Lines changed: 95 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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
```
93101
For 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.
279287
No `HPE_INVALID_HEADER_TOKEN` will be raised for incorrect header values when
280288
lenient 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`.
292300
This error is important to prevent HTTP request smuggling, but may be less desirable
293301
for 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
299307
Enables/disables lenient handling of `Connection: close` and HTTP/1.0
300308
requests 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
306313
This is important to prevent cache poisoning attacks,
307314
but might interact badly with outdated and insecure clients.
308315
309316
With 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,48 @@ avoid request smuggling.
323330
324331
With 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_crlf_after_chunk(llhttp_t* parser, int enabled)`
367+
368+
Enables/disables lenient handling of chunks not separated via CRLF.
369+
370+
Normally `llhttp` would error when after a chunk data a CRLF is missing before
371+
starting a new chunk.
372+
With this flag the new chunk can start immediately after the previous one.
373+
374+
**Enabling this flag can pose a security issue since you will be exposed to request smuggling attacks. USE WITH CAUTION!**
327375
328376
## Build Instructions
329377
@@ -345,17 +393,34 @@ make
345393

346394
### Using with CMake
347395

348-
If you want to use this library in a CMake project you can use the snippet below.
396+
If you want to use this library in a CMake project as a shared library, you can use the snippet below.
397+
398+
```
399+
FetchContent_Declare(llhttp
400+
URL "https://github.com/nodejs/llhttp/archive/refs/tags/release/v8.1.0.tar.gz")
401+
402+
FetchContent_MakeAvailable(llhttp)
403+
404+
# Link with the llhttp_shared target
405+
target_link_libraries(${EXAMPLE_PROJECT_NAME} ${PROJECT_LIBRARIES} llhttp_shared ${PROJECT_NAME})
406+
```
407+
408+
If you want to use this library in a CMake project as a static library, you can set some cache variables first.
349409

350410
```
351411
FetchContent_Declare(llhttp
352-
URL "https://github.com/nodejs/llhttp/archive/refs/tags/v6.0.5.tar.gz") # Using version 6.0.5
412+
URL "https://github.com/nodejs/llhttp/archive/refs/tags/release/v8.1.0.tar.gz")
353413
414+
set(BUILD_SHARED_LIBS OFF CACHE INTERNAL "")
415+
set(BUILD_STATIC_LIBS ON CACHE INTERNAL "")
354416
FetchContent_MakeAvailable(llhttp)
355417
356-
target_link_libraries(${EXAMPLE_PROJECT_NAME} ${PROJECT_LIBRARIES} llhttp ${PROJECT_NAME})
418+
# Link with the llhttp_static target
419+
target_link_libraries(${EXAMPLE_PROJECT_NAME} ${PROJECT_LIBRARIES} llhttp_static ${PROJECT_NAME})
357420
```
358421

422+
_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._
423+
359424
## Building on Windows
360425

361426
### Installation

deps/llhttp/include/llhttp.h

Lines changed: 68 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
1+
12
#ifndef INCLUDE_LLHTTP_H_
23
#define INCLUDE_LLHTTP_H_
34

4-
#define LLHTTP_VERSION_MAJOR 8
5-
#define LLHTTP_VERSION_MINOR 1
6-
#define LLHTTP_VERSION_PATCH 1
7-
8-
#ifndef LLHTTP_STRICT_MODE
9-
# define LLHTTP_STRICT_MODE 0
10-
#endif
5+
#define LLHTTP_VERSION_MAJOR 9
6+
#define LLHTTP_VERSION_MINOR 0
7+
#define LLHTTP_VERSION_PATCH 0
118

129
#ifndef INCLUDE_LLHTTP_ITSELF_H_
1310
#define INCLUDE_LLHTTP_ITSELF_H_
@@ -50,6 +47,7 @@ int llhttp__internal_execute(llhttp__internal_t* s, const char* p, const char* e
5047
#endif
5148
#endif /* INCLUDE_LLHTTP_ITSELF_H_ */
5249

50+
5351
#ifndef LLLLHTTP_C_HEADERS_
5452
#define LLLLHTTP_C_HEADERS_
5553
#ifdef __cplusplus
@@ -114,7 +112,10 @@ enum llhttp_lenient_flags {
114112
LENIENT_CHUNKED_LENGTH = 0x2,
115113
LENIENT_KEEP_ALIVE = 0x4,
116114
LENIENT_TRANSFER_ENCODING = 0x8,
117-
LENIENT_VERSION = 0x10
115+
LENIENT_VERSION = 0x10,
116+
LENIENT_DATA_AFTER_CLOSE = 0x20,
117+
LENIENT_OPTIONAL_LF_AFTER_CR = 0x40,
118+
LENIENT_OPTIONAL_CRLF_AFTER_CHUNK = 0x80
118119
};
119120
typedef enum llhttp_lenient_flags llhttp_lenient_flags_t;
120121

@@ -534,6 +535,7 @@ typedef enum llhttp_status llhttp_status_t;
534535
#endif
535536
#endif /* LLLLHTTP_C_HEADERS_ */
536537

538+
537539
#ifndef INCLUDE_LLHTTP_API_H_
538540
#define INCLUDE_LLHTTP_API_H_
539541
#ifdef __cplusplus
@@ -759,7 +761,8 @@ const char* llhttp_status_name(llhttp_status_t status);
759761
* `HPE_INVALID_HEADER_TOKEN` will be raised for incorrect header values when
760762
* lenient parsing is "on".
761763
*
762-
* **(USE AT YOUR OWN RISK)**
764+
* **Enabling this flag can pose a security issue since you will be exposed to
765+
* request smuggling attacks. USE WITH CAUTION!**
763766
*/
764767
LLHTTP_EXPORT
765768
void llhttp_set_lenient_headers(llhttp_t* parser, int enabled);
@@ -773,7 +776,8 @@ void llhttp_set_lenient_headers(llhttp_t* parser, int enabled);
773776
* request smuggling, but may be less desirable for small number of cases
774777
* involving legacy servers.
775778
*
776-
* **(USE AT YOUR OWN RISK)**
779+
* **Enabling this flag can pose a security issue since you will be exposed to
780+
* request smuggling attacks. USE WITH CAUTION!**
777781
*/
778782
LLHTTP_EXPORT
779783
void llhttp_set_lenient_chunked_length(llhttp_t* parser, int enabled);
@@ -788,7 +792,8 @@ void llhttp_set_lenient_chunked_length(llhttp_t* parser, int enabled);
788792
* but might interact badly with outdated and insecure clients. With this flag
789793
* the extra request/response will be parsed normally.
790794
*
791-
* **(USE AT YOUR OWN RISK)**
795+
* **Enabling this flag can pose a security issue since you will be exposed to
796+
* poisoning attacks. USE WITH CAUTION!**
792797
*/
793798
LLHTTP_EXPORT
794799
void llhttp_set_lenient_keep_alive(llhttp_t* parser, int enabled);
@@ -802,14 +807,65 @@ void llhttp_set_lenient_keep_alive(llhttp_t* parser, int enabled);
802807
* avoid request smuggling.
803808
* With this flag the extra value will be parsed normally.
804809
*
805-
* **(USE AT YOUR OWN RISK)**
810+
* **Enabling this flag can pose a security issue since you will be exposed to
811+
* request smuggling attacks. USE WITH CAUTION!**
806812
*/
807813
LLHTTP_EXPORT
808814
void llhttp_set_lenient_transfer_encoding(llhttp_t* parser, int enabled);
809815

816+
/* Enables/disables lenient handling of HTTP version.
817+
*
818+
* Normally `llhttp` would error when the HTTP version in the request or status line
819+
* is not `0.9`, `1.0`, `1.1` or `2.0`.
820+
* With this flag the invalid value will be parsed normally.
821+
*
822+
* **Enabling this flag can pose a security issue since you will allow unsupported
823+
* HTTP versions. USE WITH CAUTION!**
824+
*/
825+
LLHTTP_EXPORT
826+
void llhttp_set_lenient_version(llhttp_t* parser, int enabled);
827+
828+
/* Enables/disables lenient handling of additional data received after a message ends
829+
* and keep-alive is disabled.
830+
*
831+
* Normally `llhttp` would error when additional unexpected data is received if the message
832+
* contains the `Connection` header with `close` value.
833+
* With this flag the extra data will discarded without throwing an error.
834+
*
835+
* **Enabling this flag can pose a security issue since you will be exposed to
836+
* poisoning attacks. USE WITH CAUTION!**
837+
*/
838+
LLHTTP_EXPORT
839+
void llhttp_set_lenient_data_after_close(llhttp_t* parser, int enabled);
840+
841+
/* Enables/disables lenient handling of incomplete CRLF sequences.
842+
*
843+
* Normally `llhttp` would error when a CR is not followed by LF when terminating the
844+
* request line, the status line, the headers or a chunk header.
845+
* With this flag only a CR is required to terminate such sections.
846+
*
847+
* **Enabling this flag can pose a security issue since you will be exposed to
848+
* request smuggling attacks. USE WITH CAUTION!**
849+
*/
850+
LLHTTP_EXPORT
851+
void llhttp_set_lenient_optional_lf_after_cr(llhttp_t* parser, int enabled);
852+
853+
/* Enables/disables lenient handling of chunks not separated via CRLF.
854+
*
855+
* Normally `llhttp` would error when after a chunk data a CRLF is missing before
856+
* starting a new chunk.
857+
* With this flag the new chunk can start immediately after the previous one.
858+
*
859+
* **Enabling this flag can pose a security issue since you will be exposed to
860+
* request smuggling attacks. USE WITH CAUTION!**
861+
*/
862+
LLHTTP_EXPORT
863+
void llhttp_set_lenient_optional_crlf_after_chunk(llhttp_t* parser, int enabled);
864+
810865
#ifdef __cplusplus
811866
} /* extern "C" */
812867
#endif
813868
#endif /* INCLUDE_LLHTTP_API_H_ */
814869

870+
815871
#endif /* INCLUDE_LLHTTP_H_ */

0 commit comments

Comments
 (0)