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