1+ 
12#ifndef  INCLUDE_LLHTTP_H_ 
23#define  INCLUDE_LLHTTP_H_ 
34
4- #define  LLHTTP_VERSION_MAJOR  8 
5+ #define  LLHTTP_VERSION_MAJOR  9 
56#define  LLHTTP_VERSION_MINOR  1
67#define  LLHTTP_VERSION_PATCH  2
78
8- #ifndef  LLHTTP_STRICT_MODE 
9- # define  LLHTTP_STRICT_MODE  0
10- #endif 
11- 
129#ifndef  INCLUDE_LLHTTP_ITSELF_H_ 
1310#define  INCLUDE_LLHTTP_ITSELF_H_ 
1411#ifdef  __cplusplus 
@@ -33,7 +30,7 @@ struct llhttp__internal_s {
3330 uint8_t  http_major ;
3431 uint8_t  http_minor ;
3532 uint8_t  header_state ;
36-  uint8_t  lenient_flags ;
33+  uint16_t  lenient_flags ;
3734 uint8_t  upgrade ;
3835 uint8_t  finish ;
3936 uint16_t  flags ;
@@ -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,12 @@ 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 ,
119+  LENIENT_OPTIONAL_CR_BEFORE_LF  =  0x100 ,
120+  LENIENT_SPACES_AFTER_CHUNK_SIZE  =  0x200 
118121};
119122typedef  enum  llhttp_lenient_flags  llhttp_lenient_flags_t ;
120123
@@ -534,6 +537,7 @@ typedef enum llhttp_status llhttp_status_t;
534537#endif 
535538#endif  /* LLLLHTTP_C_HEADERS_ */ 
536539
540+ 
537541#ifndef  INCLUDE_LLHTTP_API_H_ 
538542#define  INCLUDE_LLHTTP_API_H_ 
539543#ifdef  __cplusplus 
@@ -759,7 +763,8 @@ const char* llhttp_status_name(llhttp_status_t status);
759763 * `HPE_INVALID_HEADER_TOKEN` will be raised for incorrect header values when 
760764 * lenient parsing is "on". 
761765 * 
762-  * **(USE AT YOUR OWN RISK)** 
766+  * **Enabling this flag can pose a security issue since you will be exposed to 
767+  * request smuggling attacks. USE WITH CAUTION!** 
763768 */ 
764769LLHTTP_EXPORT 
765770void  llhttp_set_lenient_headers (llhttp_t *  parser , int  enabled );
@@ -773,7 +778,8 @@ void llhttp_set_lenient_headers(llhttp_t* parser, int enabled);
773778 * request smuggling, but may be less desirable for small number of cases 
774779 * involving legacy servers. 
775780 * 
776-  * **(USE AT YOUR OWN RISK)** 
781+  * **Enabling this flag can pose a security issue since you will be exposed to 
782+  * request smuggling attacks. USE WITH CAUTION!** 
777783 */ 
778784LLHTTP_EXPORT 
779785void  llhttp_set_lenient_chunked_length (llhttp_t *  parser , int  enabled );
@@ -788,7 +794,8 @@ void llhttp_set_lenient_chunked_length(llhttp_t* parser, int enabled);
788794 * but might interact badly with outdated and insecure clients. With this flag 
789795 * the extra request/response will be parsed normally. 
790796 * 
791-  * **(USE AT YOUR OWN RISK)** 
797+  * **Enabling this flag can pose a security issue since you will be exposed to 
798+  * poisoning attacks. USE WITH CAUTION!** 
792799 */ 
793800LLHTTP_EXPORT 
794801void  llhttp_set_lenient_keep_alive (llhttp_t *  parser , int  enabled );
@@ -802,14 +809,90 @@ void llhttp_set_lenient_keep_alive(llhttp_t* parser, int enabled);
802809 * avoid request smuggling. 
803810 * With this flag the extra value will be parsed normally. 
804811 * 
805-  * **(USE AT YOUR OWN RISK)** 
812+  * **Enabling this flag can pose a security issue since you will be exposed to 
813+  * request smuggling attacks. USE WITH CAUTION!** 
806814 */ 
807815LLHTTP_EXPORT 
808816void  llhttp_set_lenient_transfer_encoding (llhttp_t *  parser , int  enabled );
809817
818+ /* Enables/disables lenient handling of HTTP version. 
819+  * 
820+  * Normally `llhttp` would error when the HTTP version in the request or status line 
821+  * is not `0.9`, `1.0`, `1.1` or `2.0`. 
822+  * With this flag the invalid value will be parsed normally. 
823+  * 
824+  * **Enabling this flag can pose a security issue since you will allow unsupported 
825+  * HTTP versions. USE WITH CAUTION!** 
826+  */ 
827+ LLHTTP_EXPORT 
828+ void  llhttp_set_lenient_version (llhttp_t *  parser , int  enabled );
829+ 
830+ /* Enables/disables lenient handling of additional data received after a message ends 
831+  * and keep-alive is disabled. 
832+  * 
833+  * Normally `llhttp` would error when additional unexpected data is received if the message 
834+  * contains the `Connection` header with `close` value. 
835+  * With this flag the extra data will discarded without throwing an error. 
836+  * 
837+  * **Enabling this flag can pose a security issue since you will be exposed to 
838+  * poisoning attacks. USE WITH CAUTION!** 
839+  */ 
840+ LLHTTP_EXPORT 
841+ void  llhttp_set_lenient_data_after_close (llhttp_t *  parser , int  enabled );
842+ 
843+ /* Enables/disables lenient handling of incomplete CRLF sequences. 
844+  * 
845+  * Normally `llhttp` would error when a CR is not followed by LF when terminating the 
846+  * request line, the status line, the headers or a chunk header. 
847+  * With this flag only a CR is required to terminate such sections. 
848+  * 
849+  * **Enabling this flag can pose a security issue since you will be exposed to 
850+  * request smuggling attacks. USE WITH CAUTION!** 
851+  */ 
852+ LLHTTP_EXPORT 
853+ void  llhttp_set_lenient_optional_lf_after_cr (llhttp_t *  parser , int  enabled );
854+ 
855+ /* 
856+  * Enables/disables lenient handling of line separators. 
857+  * 
858+  * Normally `llhttp` would error when a LF is not preceded by CR when terminating the 
859+  * request line, the status line, the headers, a chunk header or a chunk data. 
860+  * With this flag only a LF is required to terminate such sections. 
861+  * 
862+  * **Enabling this flag can pose a security issue since you will be exposed to 
863+  * request smuggling attacks. USE WITH CAUTION!** 
864+  */ 
865+ LLHTTP_EXPORT 
866+ void  llhttp_set_lenient_optional_cr_before_lf (llhttp_t *  parser , int  enabled );
867+ 
868+ /* Enables/disables lenient handling of chunks not separated via CRLF. 
869+  * 
870+  * Normally `llhttp` would error when after a chunk data a CRLF is missing before 
871+  * starting a new chunk. 
872+  * With this flag the new chunk can start immediately after the previous one. 
873+  * 
874+  * **Enabling this flag can pose a security issue since you will be exposed to 
875+  * request smuggling attacks. USE WITH CAUTION!** 
876+  */ 
877+ LLHTTP_EXPORT 
878+ void  llhttp_set_lenient_optional_crlf_after_chunk (llhttp_t *  parser , int  enabled );
879+ 
880+ /* Enables/disables lenient handling of spaces after chunk size. 
881+  * 
882+  * Normally `llhttp` would error when after a chunk size is followed by one or more 
883+  * spaces are present instead of a CRLF or `;`. 
884+  * With this flag this check is disabled. 
885+  * 
886+  * **Enabling this flag can pose a security issue since you will be exposed to 
887+  * request smuggling attacks. USE WITH CAUTION!** 
888+  */ 
889+ LLHTTP_EXPORT 
890+ void  llhttp_set_lenient_spaces_after_chunk_size (llhttp_t *  parser , int  enabled );
891+ 
810892#ifdef  __cplusplus 
811893} /* extern "C" */ 
812894#endif 
813895#endif  /* INCLUDE_LLHTTP_API_H_ */ 
814896
897+ 
815898#endif  /* INCLUDE_LLHTTP_H_ */ 
0 commit comments