7 #define CALLBACK_MAYBE(PARSER, NAME, ...) \
9 llhttp_settings_t* settings; \
10 settings = (llhttp_settings_t*) (PARSER)->settings; \
11 if (settings == NULL || settings->NAME == NULL) { \
15 err = settings->NAME(__VA_ARGS__); \
18 void llhttp_init(llhttp_t* parser, llhttp_type_t type,
19 const llhttp_settings_t* settings) {
20 llhttp__internal_init(parser);
23 parser->settings = (void*) settings;
27 llhttp_errno_t llhttp_execute(llhttp_t* parser, const char* data, size_t len) {
28 return llhttp__internal_execute(parser, data, data + len);
32 void llhttp_settings_init(llhttp_settings_t* settings) {
33 memset(settings, 0, sizeof(*settings));
37 llhttp_errno_t llhttp_finish(llhttp_t* parser) {
40 /* We're in an error state. Don't bother doing anything. */
41 if (parser->error != 0) {
45 switch (parser->finish) {
46 case HTTP_FINISH_SAFE_WITH_CB:
47 CALLBACK_MAYBE(parser, on_message_complete, parser);
48 if (err != HPE_OK) return err;
51 case HTTP_FINISH_SAFE:
53 case HTTP_FINISH_UNSAFE:
54 parser->reason = "Invalid EOF state";
55 return HPE_INVALID_EOF_STATE;
62 void llhttp_pause(llhttp_t* parser) {
63 if (parser->error != HPE_OK) {
67 parser->error = HPE_PAUSED;
68 parser->reason = "Paused";
72 void llhttp_resume(llhttp_t* parser) {
73 if (parser->error != HPE_PAUSED) {
81 void llhttp_resume_after_upgrade(llhttp_t* parser) {
82 if (parser->error != HPE_PAUSED_UPGRADE) {
90 llhttp_errno_t llhttp_get_errno(const llhttp_t* parser) {
95 const char* llhttp_get_error_reason(const llhttp_t* parser) {
96 return parser->reason;
100 void llhttp_set_error_reason(llhttp_t* parser, const char* reason) {
101 parser->reason = reason;
105 const char* llhttp_get_error_pos(const llhttp_t* parser) {
106 return parser->error_pos;
110 const char* llhttp_errno_name(llhttp_errno_t err) {
111 #define HTTP_ERRNO_GEN(CODE, NAME, _) case HPE_##NAME: return "HPE_" #NAME;
113 HTTP_ERRNO_MAP(HTTP_ERRNO_GEN)
116 #undef HTTP_ERRNO_GEN
120 const char* llhttp_method_name(llhttp_method_t method) {
121 #define HTTP_METHOD_GEN(NUM, NAME, STRING) case HTTP_##NAME: return #STRING;
123 HTTP_METHOD_MAP(HTTP_METHOD_GEN)
126 #undef HTTP_METHOD_GEN
130 void llhttp_set_lenient(llhttp_t* parser, int enabled) {
132 parser->flags |= F_LENIENT;
134 parser->flags &= ~F_LENIENT;
142 int llhttp__on_message_begin(llhttp_t* s, const char* p, const char* endp) {
144 CALLBACK_MAYBE(s, on_message_begin, s);
149 int llhttp__on_url(llhttp_t* s, const char* p, const char* endp) {
151 CALLBACK_MAYBE(s, on_url, s, p, endp - p);
156 int llhttp__on_status(llhttp_t* s, const char* p, const char* endp) {
158 CALLBACK_MAYBE(s, on_status, s, p, endp - p);
163 int llhttp__on_header_field(llhttp_t* s, const char* p, const char* endp) {
165 CALLBACK_MAYBE(s, on_header_field, s, p, endp - p);
170 int llhttp__on_header_value(llhttp_t* s, const char* p, const char* endp) {
172 CALLBACK_MAYBE(s, on_header_value, s, p, endp - p);
177 int llhttp__on_headers_complete(llhttp_t* s, const char* p, const char* endp) {
179 CALLBACK_MAYBE(s, on_headers_complete, s);
184 int llhttp__on_message_complete(llhttp_t* s, const char* p, const char* endp) {
186 CALLBACK_MAYBE(s, on_message_complete, s);
191 int llhttp__on_body(llhttp_t* s, const char* p, const char* endp) {
193 CALLBACK_MAYBE(s, on_body, s, p, endp - p);
198 int llhttp__on_chunk_header(llhttp_t* s, const char* p, const char* endp) {
200 CALLBACK_MAYBE(s, on_chunk_header, s);
205 int llhttp__on_chunk_complete(llhttp_t* s, const char* p, const char* endp) {
207 CALLBACK_MAYBE(s, on_chunk_complete, s);
215 void llhttp__debug(llhttp_t* s, const char* p, const char* endp,
218 fprintf(stderr, "p=%p type=%d flags=%02x next=null debug=%s\n", s, s->type,
221 fprintf(stderr, "p=%p type=%d flags=%02x next=%02x debug=%s\n", s,
222 s->type, s->flags, *p, msg);