Lines Matching refs:parser
57 #define SET_ERRNO(e) (parser->http_errno = (e))
89 int count_header_size(struct http_parser *parser, int bytes) in count_header_size() argument
91 parser->nread += bytes; in count_header_size()
93 if (UNLIKELY(parser->nread > (HTTP_MAX_HEADER_SIZE))) { in count_header_size()
94 parser->http_errno = HPE_HEADER_OVERFLOW; in count_header_size()
214 int cb_notify(struct http_parser *parser, enum state *current_state, http_cb cb, in cb_notify() argument
217 __ASSERT_NO_MSG(HTTP_PARSER_ERRNO(parser) == HPE_OK); in cb_notify()
223 parser->state = *current_state; in cb_notify()
224 if (UNLIKELY(cb(parser) != 0)) { in cb_notify()
227 *current_state = parser->state; in cb_notify()
229 if (UNLIKELY(HTTP_PARSER_ERRNO(parser) != HPE_OK)) { in cb_notify()
231 return -HTTP_PARSER_ERRNO(parser); in cb_notify()
238 int cb_data(struct http_parser *parser, http_data_cb cb, int cb_error, in cb_data() argument
244 __ASSERT_NO_MSG(HTTP_PARSER_ERRNO(parser) == HPE_OK); in cb_data()
252 parser->state = *current_state; in cb_data()
253 rc = cb(parser, *mark, len); in cb_data()
257 *current_state = parser->state; in cb_data()
259 if (UNLIKELY(HTTP_PARSER_ERRNO(parser) != HPE_OK)) { in cb_data()
261 return -HTTP_PARSER_ERRNO(parser); in cb_data()
307 #define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res)
312 int strict_check(struct http_parser *parser, int c) in strict_check() argument
315 parser->http_errno = HPE_STRICT; in strict_check()
321 # define NEW_MESSAGE() (http_should_keep_alive(parser) ? start_state : s_dead)
324 int strict_check(struct http_parser *parser, int c) in strict_check() argument
326 (void)parser; in strict_check()
377 int http_message_needs_eof(const struct http_parser *parser);
380 int parser_header_state(struct http_parser *parser, char ch, char c) in parser_header_state() argument
384 switch (parser->header_state) { in parser_header_state()
389 parser->index++; in parser_header_state()
390 parser->header_state = (c == 'o' ? h_CO : h_general); in parser_header_state()
394 parser->index++; in parser_header_state()
395 parser->header_state = (c == 'n' ? h_CON : h_general); in parser_header_state()
399 parser->index++; in parser_header_state()
402 parser->header_state = h_matching_connection; in parser_header_state()
405 parser->header_state = h_matching_content; in parser_header_state()
408 parser->header_state = h_general; in parser_header_state()
416 parser->index++; in parser_header_state()
417 cond1 = parser->index > sizeof(CONNECTION) - 1; in parser_header_state()
418 if (cond1 || c != CONNECTION[parser->index]) { in parser_header_state()
419 parser->header_state = h_general; in parser_header_state()
420 } else if (parser->index == sizeof(CONNECTION) - 2) { in parser_header_state()
421 parser->header_state = h_connection; in parser_header_state()
428 parser->index++; in parser_header_state()
429 cond1 = parser->index > sizeof(PROXY_CONNECTION) - 1; in parser_header_state()
430 if (cond1 || c != PROXY_CONNECTION[parser->index]) { in parser_header_state()
431 parser->header_state = h_general; in parser_header_state()
432 } else if (parser->index == sizeof(PROXY_CONNECTION) - 2) { in parser_header_state()
433 parser->header_state = h_connection; in parser_header_state()
440 parser->index++; in parser_header_state()
441 cond1 = parser->index > sizeof(CONTENT) - 1; in parser_header_state()
442 if (cond1 || c != CONTENT[parser->index]) { in parser_header_state()
443 parser->header_state = h_general; in parser_header_state()
444 } else if (parser->index == sizeof(CONTENT) - 2) { in parser_header_state()
445 parser->header_state = h_CONTENT_; in parser_header_state()
450 parser->index++; in parser_header_state()
452 parser->header_state = h_matching_content_length; in parser_header_state()
454 parser->header_state = h_matching_content_range; in parser_header_state()
456 parser->header_state = h_general; in parser_header_state()
462 parser->index++; in parser_header_state()
463 cond1 = parser->index > sizeof(CONTENT_LENGTH) - 1; in parser_header_state()
464 if (cond1 || c != CONTENT_LENGTH[parser->index]) { in parser_header_state()
465 parser->header_state = h_general; in parser_header_state()
466 } else if (parser->index == sizeof(CONTENT_LENGTH) - 2) { in parser_header_state()
467 parser->header_state = h_content_length; in parser_header_state()
472 parser->index++; in parser_header_state()
473 cond1 = parser->index > sizeof(CONTENT_RANGE) - 1; in parser_header_state()
474 if (cond1 || c != CONTENT_RANGE[parser->index]) { in parser_header_state()
475 parser->header_state = h_general; in parser_header_state()
476 } else if (parser->index == sizeof(CONTENT_RANGE) - 2) { in parser_header_state()
477 parser->header_state = h_content_range_start; in parser_header_state()
484 parser->index++; in parser_header_state()
485 cond1 = parser->index > sizeof(TRANSFER_ENCODING) - 1; in parser_header_state()
486 if (cond1 || c != TRANSFER_ENCODING[parser->index]) { in parser_header_state()
487 parser->header_state = h_general; in parser_header_state()
488 } else if (parser->index == sizeof(TRANSFER_ENCODING) - 2) { in parser_header_state()
489 parser->header_state = h_transfer_encoding; in parser_header_state()
496 parser->index++; in parser_header_state()
497 cond1 = parser->index > sizeof(UPGRADE) - 1; in parser_header_state()
498 if (cond1 || c != UPGRADE[parser->index]) { in parser_header_state()
499 parser->header_state = h_general; in parser_header_state()
500 } else if (parser->index == sizeof(UPGRADE) - 2) { in parser_header_state()
501 parser->header_state = h_upgrade; in parser_header_state()
513 parser->header_state = h_general; in parser_header_state()
525 int header_states(struct http_parser *parser, const char *data, size_t len, in header_states() argument
573 parser->header_state = h_state; in header_states()
577 t = parser->content_length; in header_states()
584 if (UNLIKELY(value < parser->content_length)) { in header_states()
586 parser->header_state = h_state; in header_states()
590 parser->content_length = t; in header_states()
613 parser->header_state = h_state; in header_states()
617 t = parser->content_range.start; in header_states()
624 if (UNLIKELY(value < parser->content_range.start)) { in header_states()
626 parser->header_state = h_state; in header_states()
630 parser->content_range.start = t; in header_states()
649 parser->header_state = h_state; in header_states()
653 t = parser->content_range.end; in header_states()
660 if (UNLIKELY(value < parser->content_range.end)) { in header_states()
662 parser->header_state = h_state; in header_states()
666 parser->content_range.end = t; in header_states()
684 parser->header_state = h_state; in header_states()
688 t = parser->content_range.total; in header_states()
695 if (UNLIKELY(value < parser->content_range.total)) { in header_states()
697 parser->header_state = h_state; in header_states()
701 parser->content_range.total = t; in header_states()
707 parser->index++; in header_states()
708 cond1 = parser->index > sizeof(CHUNKED) - 1; in header_states()
709 if (cond1 || c != CHUNKED[parser->index]) { in header_states()
711 } else if (parser->index == sizeof(CHUNKED) - 2) { in header_states()
736 parser->index++; in header_states()
737 cond1 = parser->index > sizeof(KEEP_ALIVE) - 1; in header_states()
738 if (cond1 || c != KEEP_ALIVE[parser->index]) { in header_states()
740 } else if (parser->index == sizeof(KEEP_ALIVE) - 2) { in header_states()
747 parser->index++; in header_states()
748 cond1 = parser->index > sizeof(CLOSE) - 1; in header_states()
749 if (cond1 || c != CLOSE[parser->index]) { in header_states()
751 } else if (parser->index == sizeof(CLOSE) - 2) { in header_states()
758 parser->index++; in header_states()
759 cond1 = parser->index > sizeof(UPGRADE) - 1; in header_states()
760 if (cond1 || c != UPGRADE[parser->index]) { in header_states()
762 } else if (parser->index == sizeof(UPGRADE) - 2) { in header_states()
770 parser->index = 0U; in header_states()
785 parser->flags |= F_CONNECTION_KEEP_ALIVE; in header_states()
787 parser->flags |= F_CONNECTION_CLOSE; in header_states()
789 parser->flags |= F_CONNECTION_UPGRADE; in header_states()
792 parser->index = 0U; in header_states()
811 int zero_content_length(struct http_parser *parser, in zero_content_length() argument
819 if (parser->content_length == 0U) { in zero_content_length()
825 rc = cb_notify(parser, &p_state, settings->on_message_complete, in zero_content_length()
831 } else if (parser->content_length != ULLONG_MAX) { in zero_content_length()
837 if (!http_message_needs_eof(parser)) { in zero_content_length()
843 rc = cb_notify(parser, &p_state, in zero_content_length()
863 int parser_execute(struct http_parser *parser, in parser_execute() argument
867 const unsigned int lenient = parser->lenient_http_headers; in parser_execute()
868 enum state p_state = (enum state) parser->state; in parser_execute()
883 if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { in parser_execute()
894 cb_notify(parser, &p_state, in parser_execute()
943 rc = count_header_size(parser, 1); in parser_execute()
968 parser->flags = 0U; in parser_execute()
969 parser->content_length = ULLONG_MAX; in parser_execute()
970 parser->content_range.start = 0U; in parser_execute()
971 parser->content_range.end = 0U; in parser_execute()
972 parser->content_range.total = 0U; in parser_execute()
973 parser->content_range_present = false; in parser_execute()
978 rc = cb_notify(parser, &p_state, in parser_execute()
986 parser->type = HTTP_REQUEST; in parser_execute()
996 parser->type = HTTP_RESPONSE; in parser_execute()
1004 parser->type = HTTP_REQUEST; in parser_execute()
1005 parser->method = HTTP_HEAD; in parser_execute()
1006 parser->index = 2U; in parser_execute()
1012 parser->flags = 0U; in parser_execute()
1013 parser->content_length = ULLONG_MAX; in parser_execute()
1030 rc = cb_notify(parser, &p_state, in parser_execute()
1041 rc = strict_check(parser, ch != 'T'); in parser_execute()
1049 rc = strict_check(parser, ch != 'T'); in parser_execute()
1057 rc = strict_check(parser, ch != 'P'); in parser_execute()
1065 rc = strict_check(parser, ch != '/'); in parser_execute()
1078 parser->http_major = ch - '0'; in parser_execute()
1094 parser->http_major *= 10U; in parser_execute()
1095 parser->http_major += ch - '0'; in parser_execute()
1097 if (UNLIKELY(parser->http_major > 999)) { in parser_execute()
1112 parser->http_minor = ch - '0'; in parser_execute()
1128 parser->http_minor *= 10U; in parser_execute()
1129 parser->http_minor += ch - '0'; in parser_execute()
1131 if (UNLIKELY(parser->http_minor > 999)) { in parser_execute()
1148 parser->status_code = ch - '0'; in parser_execute()
1159 rc = cb_data(parser, in parser_execute()
1185 parser->status_code *= 10U; in parser_execute()
1186 parser->status_code += ch - '0'; in parser_execute()
1188 if (UNLIKELY(parser->status_code > 999)) { in parser_execute()
1201 rc = cb_data(parser, in parser_execute()
1221 parser->index = 0U; in parser_execute()
1228 rc = cb_data(parser, settings->on_status, in parser_execute()
1240 rc = cb_data(parser, settings->on_status, in parser_execute()
1254 rc = strict_check(parser, ch != LF); in parser_execute()
1265 parser->flags = 0U; in parser_execute()
1266 parser->content_length = ULLONG_MAX; in parser_execute()
1267 parser->content_range.start = 0U; in parser_execute()
1268 parser->content_range.end = 0U; in parser_execute()
1269 parser->content_range.total = 0U; in parser_execute()
1270 parser->content_range_present = false; in parser_execute()
1277 parser->method = (enum http_method) 0; in parser_execute()
1278 parser->index = 1U; in parser_execute()
1281 parser->method = HTTP_ACL; in parser_execute()
1284 parser->method = HTTP_BIND; in parser_execute()
1287 parser->method = HTTP_CONNECT; in parser_execute()
1291 parser->method = HTTP_DELETE; in parser_execute()
1294 parser->method = HTTP_GET; in parser_execute()
1297 parser->method = HTTP_HEAD; in parser_execute()
1300 parser->method = HTTP_LOCK; /* or LINK */ in parser_execute()
1303 parser->method = in parser_execute()
1310 parser->method = HTTP_NOTIFY; in parser_execute()
1313 parser->method = HTTP_OPTIONS; in parser_execute()
1316 parser->method = HTTP_POST; in parser_execute()
1320 parser->method = HTTP_REPORT; /* or REBIND */ in parser_execute()
1323 parser->method = HTTP_SUBSCRIBE; /* or SEARCH */ in parser_execute()
1326 parser->method = HTTP_TRACE; in parser_execute()
1329 parser->method = HTTP_UNLOCK; in parser_execute()
1339 rc = cb_notify(parser, &p_state, in parser_execute()
1357 matcher = method_strings[parser->method]; in parser_execute()
1358 if (ch == ' ' && matcher[parser->index] == '\0') { in parser_execute()
1360 } else if (ch == matcher[parser->index]) { in parser_execute()
1364 uint64_t sw_option = parser->method << 16 | in parser_execute()
1365 parser->index << 8 | ch; in parser_execute()
1368 parser->method = HTTP_PUT; in parser_execute()
1371 parser->method = HTTP_PATCH; in parser_execute()
1374 parser->method = HTTP_CHECKOUT; in parser_execute()
1377 parser->method = HTTP_COPY; in parser_execute()
1380 parser->method = HTTP_MOVE; in parser_execute()
1383 parser->method = HTTP_MERGE; in parser_execute()
1386 parser->method = HTTP_MKACTIVITY; in parser_execute()
1389 parser->method = HTTP_MKCALENDAR; in parser_execute()
1392 parser->method = HTTP_SEARCH; in parser_execute()
1395 parser->method = HTTP_REBIND; in parser_execute()
1398 parser->method = HTTP_PROPFIND; in parser_execute()
1401 parser->method = HTTP_PROPPATCH; in parser_execute()
1404 parser->method = HTTP_PURGE; in parser_execute()
1407 parser->method = HTTP_LINK; in parser_execute()
1410 parser->method = HTTP_UNSUBSCRIBE; in parser_execute()
1413 parser->method = HTTP_UNBIND; in parser_execute()
1416 parser->method = HTTP_UNLINK; in parser_execute()
1419 parser->http_errno = HPE_INVALID_METHOD; in parser_execute()
1423 parser->index == 1U && in parser_execute()
1424 parser->method == HTTP_MKCOL) { in parser_execute()
1425 parser->method = HTTP_MSEARCH; in parser_execute()
1431 ++parser->index; in parser_execute()
1441 if (parser->method == HTTP_CONNECT) { in parser_execute()
1487 rc = cb_data(parser, settings->on_url, in parser_execute()
1498 parser->http_major = 0U; in parser_execute()
1499 parser->http_minor = 9U; in parser_execute()
1503 rc = cb_data(parser, settings->on_url, in parser_execute()
1537 rc = strict_check(parser, ch != 'T'); in parser_execute()
1545 rc = strict_check(parser, ch != 'T'); in parser_execute()
1553 rc = strict_check(parser, ch != 'P'); in parser_execute()
1561 rc = strict_check(parser, ch != '/'); in parser_execute()
1575 parser->http_major = ch - '0'; in parser_execute()
1591 parser->http_major *= 10U; in parser_execute()
1592 parser->http_major += ch - '0'; in parser_execute()
1594 if (UNLIKELY(parser->http_major > 999)) { in parser_execute()
1609 parser->http_minor = ch - '0'; in parser_execute()
1632 parser->http_minor *= 10U; in parser_execute()
1633 parser->http_minor += ch - '0'; in parser_execute()
1635 if (UNLIKELY(parser->http_minor > 999)) { in parser_execute()
1678 parser->index = 0U; in parser_execute()
1683 parser->header_state = h_C; in parser_execute()
1687 parser->header_state = in parser_execute()
1692 parser->header_state = in parser_execute()
1697 parser->header_state = h_matching_upgrade; in parser_execute()
1701 parser->header_state = h_general; in parser_execute()
1717 parser_header_state(parser, ch, c); in parser_execute()
1720 rc = count_header_size(parser, p - start); in parser_execute()
1732 rc = cb_data(parser, settings->on_header_field, in parser_execute()
1770 parser->index = 0U; in parser_execute()
1774 switch (parser->header_state) { in parser_execute()
1776 parser->flags |= F_UPGRADE; in parser_execute()
1777 parser->header_state = h_general; in parser_execute()
1783 parser->header_state = in parser_execute()
1786 parser->header_state = h_general; in parser_execute()
1796 if (parser->flags & F_CONTENTLENGTH) { in parser_execute()
1802 parser->flags |= F_CONTENTLENGTH; in parser_execute()
1803 parser->content_length = ch - '0'; in parser_execute()
1807 if (parser->content_range_present) { in parser_execute()
1812 parser->content_range_present = true; in parser_execute()
1813 parser->content_range.start = 0; in parser_execute()
1819 parser->header_state = in parser_execute()
1823 parser->header_state = in parser_execute()
1826 parser->header_state = in parser_execute()
1829 parser->header_state = in parser_execute()
1839 parser->header_state = h_general; in parser_execute()
1848 (enum header_states)parser->header_state; in parser_execute()
1854 parser->header_state = h_state; in parser_execute()
1855 rc = cb_data(parser, in parser_execute()
1871 rc = count_header_size(parser, in parser_execute()
1876 parser->header_state = h_state; in parser_execute()
1877 rc = cb_data(parser, in parser_execute()
1897 rc = header_states(parser, data, len, &p, in parser_execute()
1904 parser->header_state = h_state; in parser_execute()
1906 rc = count_header_size(parser, p - start); in parser_execute()
1934 switch (parser->header_state) { in parser_execute()
1936 parser->flags |= F_CONNECTION_KEEP_ALIVE; in parser_execute()
1939 parser->flags |= F_CONNECTION_CLOSE; in parser_execute()
1942 parser->flags |= F_CHUNKED; in parser_execute()
1945 parser->flags |= F_CONNECTION_UPGRADE; in parser_execute()
1956 rc = strict_check(parser, ch != LF); in parser_execute()
1969 switch (parser->header_state) { in parser_execute()
1971 parser->flags |= in parser_execute()
1975 parser->flags |= F_CONNECTION_CLOSE; in parser_execute()
1978 parser->flags |= F_CONNECTION_UPGRADE; in parser_execute()
1981 parser->flags |= F_CHUNKED; in parser_execute()
1990 rc = cb_data(parser, settings->on_header_value, in parser_execute()
2002 rc = strict_check(parser, ch != LF); in parser_execute()
2007 if (parser->flags & F_TRAILING) { in parser_execute()
2011 rc = cb_notify(parser, &p_state, in parser_execute()
2024 if ((parser->flags & F_CHUNKED) && in parser_execute()
2025 (parser->flags & F_CONTENTLENGTH)) { in parser_execute()
2037 parser->upgrade = in parser_execute()
2038 ((parser->flags & flags) == flags || in parser_execute()
2039 parser->method == HTTP_CONNECT); in parser_execute()
2057 switch (settings->on_headers_complete(parser)) { in parser_execute()
2062 parser->upgrade = 1U; in parser_execute()
2066 parser->flags |= F_SKIPBODY; in parser_execute()
2072 parser->state = CURRENT_STATE(); in parser_execute()
2074 return -HTTP_PARSER_ERRNO(parser); in parser_execute()
2078 if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { in parser_execute()
2079 parser->state = CURRENT_STATE(); in parser_execute()
2081 return -HTTP_PARSER_ERRNO(parser); in parser_execute()
2090 rc = strict_check(parser, ch != LF); in parser_execute()
2095 parser->nread = 0U; in parser_execute()
2097 hasBody = parser->flags & F_CHUNKED || in parser_execute()
2098 (parser->content_length > 0 && in parser_execute()
2099 parser->content_length != ULLONG_MAX); in parser_execute()
2100 if (parser->upgrade && in parser_execute()
2101 (parser->method == HTTP_CONNECT || in parser_execute()
2102 (parser->flags & F_SKIPBODY) || !hasBody)) { in parser_execute()
2108 rc = cb_notify(parser, &p_state, in parser_execute()
2115 parser->state = CURRENT_STATE(); in parser_execute()
2120 if (parser->flags & F_SKIPBODY) { in parser_execute()
2123 rc = cb_notify(parser, &p_state, in parser_execute()
2131 } else if (parser->flags & F_CHUNKED) { in parser_execute()
2137 rc = zero_content_length(parser, settings, in parser_execute()
2149 uint64_t to_read = MIN(parser->content_length, in parser_execute()
2152 __ASSERT_NO_MSG(parser->content_length != 0U in parser_execute()
2153 && parser->content_length != ULLONG_MAX); in parser_execute()
2165 parser->content_length -= to_read; in parser_execute()
2168 if (parser->content_length == 0U) { in parser_execute()
2188 rc = cb_data(parser, settings->on_body, in parser_execute()
2212 rc = cb_notify(parser, &p_state, in parser_execute()
2219 if (parser->upgrade) { in parser_execute()
2223 parser->state = CURRENT_STATE(); in parser_execute()
2230 __ASSERT_NO_MSG(parser->nread == 1U); in parser_execute()
2231 __ASSERT_NO_MSG(parser->flags & F_CHUNKED); in parser_execute()
2239 parser->content_length = unhex_val; in parser_execute()
2247 __ASSERT_NO_MSG(parser->flags & F_CHUNKED); in parser_execute()
2266 t = parser->content_length; in parser_execute()
2275 if (UNLIKELY(ulong_value < parser->content_length)) { in parser_execute()
2280 parser->content_length = t; in parser_execute()
2285 __ASSERT_NO_MSG(parser->flags & F_CHUNKED); in parser_execute()
2295 __ASSERT_NO_MSG(parser->flags & F_CHUNKED); in parser_execute()
2297 rc = strict_check(parser, ch != LF); in parser_execute()
2302 parser->nread = 0U; in parser_execute()
2304 if (parser->content_length == 0U) { in parser_execute()
2305 parser->flags |= F_TRAILING; in parser_execute()
2311 rc = cb_notify(parser, &p_state, in parser_execute()
2322 uint64_t to_read = MIN(parser->content_length, in parser_execute()
2325 __ASSERT_NO_MSG(parser->flags & F_CHUNKED); in parser_execute()
2326 __ASSERT_NO_MSG(parser->content_length != 0U in parser_execute()
2327 && parser->content_length != ULLONG_MAX); in parser_execute()
2334 parser->content_length -= to_read; in parser_execute()
2337 if (parser->content_length == 0U) { in parser_execute()
2345 __ASSERT_NO_MSG(parser->flags & F_CHUNKED); in parser_execute()
2346 __ASSERT_NO_MSG(parser->content_length == 0U); in parser_execute()
2347 rc = strict_check(parser, ch != CR); in parser_execute()
2352 rc = cb_data(parser, settings->on_body, HPE_CB_body, in parser_execute()
2362 __ASSERT_NO_MSG(parser->flags & F_CHUNKED); in parser_execute()
2363 rc = strict_check(parser, ch != LF); in parser_execute()
2367 parser->nread = 0U; in parser_execute()
2370 rc = cb_notify(parser, &p_state, in parser_execute()
2405 rc = cb_data(parser, settings->on_header_field, HPE_CB_header_field, in parser_execute()
2411 rc = cb_data(parser, settings->on_header_value, HPE_CB_header_value, in parser_execute()
2417 rc = cb_data(parser, settings->on_url, HPE_CB_url, &p_state, parsed, in parser_execute()
2422 rc = cb_data(parser, settings->on_body, HPE_CB_body, &p_state, parsed, in parser_execute()
2427 rc = cb_data(parser, settings->on_status, HPE_CB_status, &p_state, in parser_execute()
2433 parser->state = CURRENT_STATE(); in parser_execute()
2438 if (HTTP_PARSER_ERRNO(parser) == HPE_OK) { in parser_execute()
2442 parser->state = CURRENT_STATE(); in parser_execute()
2444 return -HTTP_PARSER_ERRNO(parser); in parser_execute()
2447 size_t http_parser_execute(struct http_parser *parser, in http_parser_execute() argument
2453 parser_execute(parser, settings, data, len, &parsed); in http_parser_execute()
2458 int http_message_needs_eof(const struct http_parser *parser) in http_message_needs_eof() argument
2460 if (parser->type == HTTP_REQUEST) { in http_message_needs_eof()
2465 if (parser->status_code / 100 == 1U || /* 1xx e.g. Continue */ in http_message_needs_eof()
2466 parser->status_code == 204U || /* No Content */ in http_message_needs_eof()
2467 parser->status_code == 304U || /* Not Modified */ in http_message_needs_eof()
2468 parser->flags & F_SKIPBODY) { /* response to a HEAD in http_message_needs_eof()
2474 if ((parser->flags & F_CHUNKED) || in http_message_needs_eof()
2475 parser->content_length != ULLONG_MAX) { in http_message_needs_eof()
2483 int http_should_keep_alive(const struct http_parser *parser) in http_should_keep_alive() argument
2485 if (parser->http_major > 0 && parser->http_minor > 0) { in http_should_keep_alive()
2487 if (parser->flags & F_CONNECTION_CLOSE) { in http_should_keep_alive()
2492 if (!(parser->flags & F_CONNECTION_KEEP_ALIVE)) { in http_should_keep_alive()
2497 return !http_message_needs_eof(parser); in http_should_keep_alive()
2507 void http_parser_init(struct http_parser *parser, enum http_parser_type t) in http_parser_init() argument
2509 void *data = parser->data; /* preserve application data */ in http_parser_init()
2511 (void)memset(parser, 0, sizeof(*parser)); in http_parser_init()
2512 parser->data = data; in http_parser_init()
2513 parser->type = t; in http_parser_init()
2514 parser->state = in http_parser_init()
2517 parser->http_errno = HPE_OK; in http_parser_init()
2539 void http_parser_pause(struct http_parser *parser, int paused) in http_parser_pause() argument
2547 if (HTTP_PARSER_ERRNO(parser) == HPE_OK || in http_parser_pause()
2548 HTTP_PARSER_ERRNO(parser) == HPE_PAUSED) { in http_parser_pause()
2555 int http_body_is_final(const struct http_parser *parser) in http_body_is_final() argument
2557 return parser->state == s_message_done; in http_body_is_final()