Lines Matching refs:r

315 static int http_request_header_line_invalid(request_st * const restrict r, const int status, const …  in http_request_header_line_invalid()  argument
316 if (r->conf.log_request_header_on_error) { in http_request_header_line_invalid()
317 if (msg) log_error(r->conf.errh, __FILE__, __LINE__, "%s", msg); in http_request_header_line_invalid()
324 static int http_request_header_char_invalid(request_st * const restrict r, const char ch, const cha… in http_request_header_char_invalid() argument
325 if (r->conf.log_request_header_on_error) { in http_request_header_char_invalid()
327 log_error(r->conf.errh, __FILE__, __LINE__, "%s ('%c')", msg, ch); in http_request_header_char_invalid()
330 log_error(r->conf.errh, __FILE__, __LINE__, "%s (0x%x)", msg, ch); in http_request_header_char_invalid()
338 static void http_request_header_set_Host(request_st * const restrict r, const char * const h, size_… in http_request_header_set_Host() argument
340 r->http_host = http_header_request_set_ptr(r, HTTP_HEADER_HOST, in http_request_header_set_Host()
342 buffer_copy_string_len_lc(r->http_host, h, hlen); in http_request_header_set_Host()
369 static int http_request_parse_duplicate(request_st * const restrict r, const enum http_header_e id,… in http_request_parse_duplicate() argument
373 const buffer * const vb = http_header_request_get(r, id, k, klen); in http_request_parse_duplicate()
398 return http_request_header_line_invalid(r, 400, errmsg); in http_request_parse_duplicate()
408 static int http_request_parse_single_header(request_st * const restrict r, const enum http_header_e… in http_request_parse_single_header() argument
424 if (!light_btst(r->rqst_htags, HTTP_HEADER_HOST)) { in http_request_parse_single_header()
426 return http_request_header_line_invalid(r, 400, "uri-authority too long -> 400"); in http_request_parse_single_header()
429 http_request_header_set_Host(r, v, vlen); in http_request_parse_single_header()
432 else if (NULL != r->http_host in http_request_parse_single_header()
433 && __builtin_expect( buffer_eq_slen(r->http_host,v,vlen), 1)) { in http_request_parse_single_header()
444 if (light_btst(r->rqst_htags, id)) in http_request_parse_single_header()
445 return http_request_parse_duplicate(r, id, k, klen, v, vlen); in http_request_parse_single_header()
451 r->keep_alive = 0; in http_request_parse_single_header()
455 r->keep_alive = 1; in http_request_parse_single_header()
460 if (!light_btst(r->rqst_htags, HTTP_HEADER_CONTENT_LENGTH)) { in http_request_parse_single_header()
467 if (0 == r->reqbody_length) r->reqbody_length = clen; in http_request_parse_single_header()
470 … return http_request_header_line_invalid(r, 400, "invalid Content-Length header -> 400"); in http_request_parse_single_header()
474 … return http_request_header_line_invalid(r, 400, "duplicate Content-Length header -> 400"); in http_request_parse_single_header()
478 if (HTTP_VERSION_1_1 != r->http_version) { in http_request_parse_single_header()
479 return http_request_header_line_invalid(r, 400, in http_request_parse_single_header()
480 HTTP_VERSION_1_0 == r->http_version in http_request_parse_single_header()
488 return http_request_header_line_invalid(r, 501, NULL); /* Not Implemented */ in http_request_parse_single_header()
490 r->reqbody_length = -1; in http_request_parse_single_header()
497 http_header_request_append(r, id, k, klen, v, vlen); in http_request_parse_single_header()
502 static int http_request_parse_proto_loose(request_st * const restrict r, const char * const restric… in http_request_parse_proto_loose() argument
505 return http_request_header_line_invalid(r, 400, "incomplete request line -> 400"); in http_request_parse_proto_loose()
508 return http_request_header_line_invalid(r, 400, "incomplete request line -> 400"); in http_request_parse_proto_loose()
516 return http_request_header_line_invalid(r, 400, "incomplete request line -> 400"); in http_request_parse_proto_loose()
517 r->http_version = (proto[7] == '1') ? HTTP_VERSION_1_1 : HTTP_VERSION_1_0; in http_request_parse_proto_loose()
520 return http_request_header_line_invalid(r, 505, "unknown HTTP version -> 505"); in http_request_parse_proto_loose()
523 return http_request_header_line_invalid(r, 400, "unknown protocol -> 400"); in http_request_parse_proto_loose()
526 r->keep_alive = (HTTP_VERSION_1_0 != r->http_version); in http_request_parse_proto_loose()
532 static const char * http_request_parse_reqline_uri(request_st * const restrict r, const char * cons… in http_request_parse_reqline_uri() argument
542 http_request_header_line_invalid(r, 400, "uri-authority empty or too long -> 400"); in http_request_parse_reqline_uri()
546 http_request_header_set_Host(r, host, hostlen); in http_request_parse_reqline_uri()
549 || (HTTP_METHOD_CONNECT == r->http_method && (uri[0] == ':' || light_isdigit(uri[0]))) in http_request_parse_reqline_uri()
550 || (HTTP_METHOD_OPTIONS == r->http_method && uri[0] == '*' && 1 == len)) { in http_request_parse_reqline_uri()
554 http_request_header_line_invalid(r, 400, "request-URI parse error -> 400"); in http_request_parse_reqline_uri()
562 static int http_request_parse_header_other(request_st * const restrict r, const char * const restri…
566 http_request_validate_pseudohdrs (request_st * const restrict r, const int scheme, const unsigned i… in http_request_validate_pseudohdrs() argument
573 if (HTTP_METHOD_UNSET == r->http_method) in http_request_validate_pseudohdrs()
574 return http_request_header_line_invalid(r, 400, in http_request_validate_pseudohdrs()
577 if (HTTP_METHOD_CONNECT != r->http_method) in http_request_validate_pseudohdrs()
578 r->h2_connect_ext = 0; in http_request_validate_pseudohdrs()
580 if (__builtin_expect( (HTTP_METHOD_CONNECT != r->http_method), 1) in http_request_validate_pseudohdrs()
581 || __builtin_expect( (r->h2_connect_ext != 0), 0)) { in http_request_validate_pseudohdrs()
584 return http_request_header_line_invalid(r, 400, in http_request_validate_pseudohdrs()
587 if (buffer_is_blank(&r->target)) in http_request_validate_pseudohdrs()
588 return http_request_header_line_invalid(r, 400, in http_request_validate_pseudohdrs()
591 const char * const uri = r->target.ptr; in http_request_validate_pseudohdrs()
594 || HTTP_METHOD_OPTIONS != r->http_method) in http_request_validate_pseudohdrs()
595 return http_request_header_line_invalid(r, 400, in http_request_validate_pseudohdrs()
600 if (NULL == r->http_host) in http_request_validate_pseudohdrs()
601 return http_request_header_line_invalid(r, 400, in http_request_validate_pseudohdrs()
603 if (!buffer_is_blank(&r->target) || scheme) in http_request_validate_pseudohdrs()
604 return http_request_header_line_invalid(r, 400, in http_request_validate_pseudohdrs()
609 buffer_copy_buffer(&r->target, r->http_host); in http_request_validate_pseudohdrs()
611 buffer_copy_buffer(&r->target_orig, &r->target); in http_request_validate_pseudohdrs()
619 const uint32_t len = buffer_clen(&r->target);/*(http_header_strict)*/ in http_request_validate_pseudohdrs()
623 : http_request_check_uri_strict((const uint8_t *)r->target.ptr, len) in http_request_validate_pseudohdrs()
624 : http_request_check_line_minimal(r->target.ptr, len); in http_request_validate_pseudohdrs()
627 : http_request_header_char_invalid(r, *x, in http_request_validate_pseudohdrs()
633 http_request_parse_header (request_st * const restrict r, http_header_parse_ctx * const restrict hp… in http_request_parse_header() argument
643 return http_request_header_line_invalid(r, 400, in http_request_parse_header()
649 log_error(r->conf.errh, __FILE__, __LINE__, in http_request_parse_header()
654 return http_request_header_line_invalid(r, 431, in http_request_parse_header()
663 return http_request_header_line_invalid(r, 400, in http_request_parse_header()
666 return http_request_header_line_invalid(r, 400, in http_request_parse_header()
698 return http_request_header_line_invalid(r, 400, in http_request_parse_header()
704 if (__builtin_expect( (r->http_host != NULL), 0)) in http_request_parse_header()
707 return http_request_header_line_invalid(r, 400, in http_request_parse_header()
710 http_request_header_set_Host(r, v, vlen); in http_request_parse_header()
714 if (__builtin_expect( (HTTP_METHOD_UNSET != r->http_method), 0)) in http_request_parse_header()
716 r->http_method = get_http_method_key(v, vlen); in http_request_parse_header()
717 if (HTTP_METHOD_UNSET >= r->http_method) in http_request_parse_header()
718 return http_request_header_line_invalid(r, 501, in http_request_parse_header()
723 if (__builtin_expect( (!buffer_is_blank(&r->target)), 0)) in http_request_parse_header()
725 buffer_copy_string_len(&r->target, v, vlen); in http_request_parse_header()
747 return http_request_header_line_invalid(r, 400, in http_request_parse_header()
753 return http_request_header_line_invalid(r, 405, in http_request_parse_header()
756 r->h2_connect_ext = 1; in http_request_parse_header()
759 return http_request_header_line_invalid(r, 400, in http_request_parse_header()
762 return http_request_header_line_invalid(r, 400, in http_request_parse_header()
769 http_request_validate_pseudohdrs(r, hpctx->scheme, in http_request_parse_header()
783 return http_request_header_char_invalid(r, *x, in http_request_parse_header()
804 if (0 != http_request_parse_header_other(r, k+j, klen-j, in http_request_parse_header()
816 return http_request_header_line_invalid(r, 400, in http_request_parse_header()
819 return http_request_parse_single_header(r, id, k, klen, v, vlen); in http_request_parse_header()
824 return http_request_header_line_invalid(r, 400, in http_request_parse_header()
832 if (r->conf.stream_request_body & FDEVENT_STREAM_REQUEST) in http_request_parse_header()
860 static int http_request_parse_reqline(request_st * const restrict r, const char * const restrict pt… in http_request_parse_reqline() argument
867 return http_request_header_line_invalid(r, 400, "invalid request line (too short) -> 400"); in http_request_parse_reqline()
873 return http_request_header_line_invalid(r, 400, "missing CR before LF in header -> 400"); in http_request_parse_reqline()
893 r->http_version = HTTP_VERSION_1_1; in http_request_parse_reqline()
894 r->keep_alive = 1; /* keep-alive default: HTTP/1.1 -> true */ in http_request_parse_reqline()
897 r->http_version = HTTP_VERSION_1_0; in http_request_parse_reqline()
898 r->keep_alive = 0; /* keep-alive default: HTTP/1.0 -> false */ in http_request_parse_reqline()
901 int status = http_request_parse_proto_loose(r,ptr,len,http_parseopts); in http_request_parse_reqline()
913 return http_request_header_line_invalid(r, 400, "incomplete request line -> 400"); in http_request_parse_reqline()
916 r->http_method = get_http_method_key(ptr, i); in http_request_parse_reqline()
917 if (HTTP_METHOD_UNSET >= r->http_method) in http_request_parse_reqline()
918 return http_request_header_line_invalid(r, 501, "unknown http-method -> 501"); in http_request_parse_reqline()
923 return http_request_header_line_invalid(r, 400, "no uri specified -> 400"); in http_request_parse_reqline()
927 uri = http_request_parse_reqline_uri(r, uri, len, http_parseopts); in http_request_parse_reqline()
933 return http_request_header_line_invalid(r, 400, "no uri specified -> 400"); in http_request_parse_reqline()
942 http_request_header_char_invalid(r, *x, "invalid character in URI -> 400"); in http_request_parse_reqline()
944 buffer_copy_string_len(&r->target, uri, len); in http_request_parse_reqline()
945 buffer_copy_string_len(&r->target_orig, uri, len); in http_request_parse_reqline()
949 int http_request_parse_target(request_st * const r, int scheme_port) { in http_request_parse_target() argument
980 buffer_copy_string_len(&r->uri.scheme, "https", scheme_port == 443 ? 5 : 4); in http_request_parse_target()
982 buffer * const target = &r->target; in http_request_parse_target()
983 if ((r->http_method == HTTP_METHOD_CONNECT && !r->h2_connect_ext) in http_request_parse_target()
984 || (r->http_method == HTTP_METHOD_OPTIONS in http_request_parse_target()
988 buffer_copy_buffer(&r->uri.path, target); in http_request_parse_target()
989 buffer_clear(&r->uri.query); in http_request_parse_target()
994 if (r->conf.http_parseopts & HTTP_PARSEOPT_URL_NORMALIZE) { in http_request_parse_target()
996 int qs = burl_normalize(target, r->tmp_buf, r->conf.http_parseopts); in http_request_parse_target()
998 return http_request_header_line_invalid(r, 400, in http_request_parse_target()
1006 r->rqst_header_len -= len; in http_request_parse_target()
1008 r->rqst_header_len += len; in http_request_parse_target()
1012 if (r->rqst_header_len > MAX_HTTP_REQUEST_HEADER) { in http_request_parse_target()
1013 log_error(r->conf.errh, __FILE__, __LINE__, in http_request_parse_target()
1015 r->rqst_header_len); in http_request_parse_target()
1036 buffer_copy_string_len(&r->uri.query, qstr + 1, rlen - plen - 1); in http_request_parse_target()
1040 buffer_clear(&r->uri.query); in http_request_parse_target()
1042 buffer_copy_string_len(&r->uri.path, pstr, plen); in http_request_parse_target()
1050 buffer_urldecode_path(&r->uri.path); in http_request_parse_target()
1051 buffer_path_simplify(&r->uri.path); in http_request_parse_target()
1052 if (r->uri.path.ptr[0] != '/') in http_request_parse_target()
1053 return http_request_header_line_invalid(r, 400, in http_request_parse_target()
1061 static int http_request_parse_header_other(request_st * const restrict r, const char * const restri… in http_request_parse_header_other() argument
1072 return http_request_header_line_invalid(r, 400, "WS character in key -> 400"); in http_request_parse_header_other()
1092 … return http_request_header_char_invalid(r, k[i], "invalid character in header key -> 400"); in http_request_parse_header_other()
1095 … return http_request_header_char_invalid(r, k[i], "invalid character in header key -> 400"); in http_request_parse_header_other()
1102 static int http_request_parse_headers(request_st * const restrict r, char * const restrict ptr, con… in http_request_parse_headers() argument
1109 return http_request_header_line_invalid(r, 400, "WS at the start of first line -> 400"); in http_request_parse_headers()
1120 return http_request_header_line_invalid(r, 400, "invalid header missing ':' -> 400"); in http_request_parse_headers()
1140 …return http_request_header_line_invalid(r, 400, "invalid whitespace between field-name and colon -… in http_request_parse_headers()
1150 return http_request_header_line_invalid(r, 400, "invalid header key -> 400"); in http_request_parse_headers()
1156 if (0 != http_request_parse_header_other(r, k+j, klen-j, http_header_strict)) in http_request_parse_headers()
1176 … return http_request_header_line_invalid(r, 400, "missing CR before LF in header -> 400"); in http_request_parse_headers()
1186 … return http_request_header_line_invalid(r, 400, "missing CR before LF in header -> 400"); in http_request_parse_headers()
1200 return http_request_header_char_invalid(r, *x, in http_request_parse_headers()
1204 int status = http_request_parse_single_header(r, id, k, (size_t)klen, v, (size_t)vlen); in http_request_parse_headers()
1213 http_request_parse (request_st * const restrict r, const int scheme_port) in http_request_parse() argument
1215 int status = http_request_parse_target(r, scheme_port); in http_request_parse()
1219 const unsigned int http_parseopts = r->conf.http_parseopts; in http_request_parse()
1223 if (__builtin_expect( (r->http_host != NULL), 1)) { in http_request_parse()
1224 if (0 != http_request_host_policy(r->http_host, in http_request_parse()
1226 return http_request_header_line_invalid(r, 400, "Invalid Hostname -> 400"); in http_request_parse()
1227 buffer_copy_buffer(&r->uri.authority, r->http_host); in http_request_parse()
1230 buffer_copy_string_len(&r->uri.authority, CONST_STR_LEN("")); in http_request_parse()
1231 if (r->http_version >= HTTP_VERSION_1_1) in http_request_parse()
1232 return http_request_header_line_invalid(r, 400, "HTTP/1.1 but Host missing -> 400"); in http_request_parse()
1235 if (HTTP_VERSION_1_1 != r->http_version in http_request_parse()
1236 && (r->rqst_htags in http_request_parse()
1239 … return http_request_header_line_invalid(r, 400, "invalid hop-by-hop header w/o HTTP/1.1 -> 400"); in http_request_parse()
1242 if (0 == r->reqbody_length) { in http_request_parse()
1245 if (HTTP_METHOD_POST == r->http_method in http_request_parse()
1246 && !light_btst(r->rqst_htags, HTTP_HEADER_CONTENT_LENGTH)) { in http_request_parse()
1247 …return http_request_header_line_invalid(r, 411, "POST-request, but content-length missing -> 411"); in http_request_parse()
1252 if (-1 == r->reqbody_length in http_request_parse()
1253 && light_btst(r->rqst_htags, HTTP_HEADER_CONTENT_LENGTH)) { in http_request_parse()
1268 …return http_request_header_line_invalid(r, 400, "invalid Transfer-Encoding + Content-Length -> 400… in http_request_parse()
1272 … http_header_request_unset(r, HTTP_HEADER_CONTENT_LENGTH, CONST_STR_LEN("Content-Length")); in http_request_parse()
1275 if (http_method_get_or_head(r->http_method) in http_request_parse()
1277 return http_request_header_line_invalid(r, 400, "GET/HEAD with content-length -> 400"); in http_request_parse()
1286 http_request_parse_hoff (request_st * const restrict r, char * const restrict hdrs, const unsigned … in http_request_parse_hoff() argument
1295 const unsigned int http_parseopts = r->conf.http_parseopts; in http_request_parse_hoff()
1297 status = http_request_parse_reqline(r, hdrs, hoff, http_parseopts); in http_request_parse_hoff()
1300 status = http_request_parse_headers(r, hdrs, hoff, http_parseopts); in http_request_parse_hoff()
1303 return http_request_parse(r, scheme_port); in http_request_parse_hoff()
1308 http_request_headers_fin (request_st * const restrict r) in http_request_headers_fin() argument
1310 if (0 == r->http_status) { in http_request_headers_fin()
1312 r->conditional_is_valid = (1 << COMP_SERVER_SOCKET) in http_request_headers_fin()
1323 r->conditional_is_valid = ~0u; in http_request_headers_fin()
1327 r->keep_alive = 0; in http_request_headers_fin()
1328 r->reqbody_length = 0; in http_request_headers_fin()
1334 http_request_headers_process (request_st * const restrict r, char * const restrict hdrs, const unsi… in http_request_headers_process() argument
1336 r->http_status = http_request_parse_hoff(r, hdrs, hoff, scheme_port); in http_request_headers_process()
1338 http_request_headers_fin(r); in http_request_headers_process()
1340 if (__builtin_expect( (0 != r->http_status), 0)) { in http_request_headers_process()
1341 if (r->conf.log_request_header_on_error) { in http_request_headers_process()
1344 log_error_multiline(r->conf.errh, __FILE__, __LINE__, in http_request_headers_process()
1345 hdrs, r->rqst_header_len, "rqst: "); in http_request_headers_process()
1352 http_request_headers_process_h2 (request_st * const restrict r, const int scheme_port) in http_request_headers_process_h2() argument
1354 if (0 == r->http_status) in http_request_headers_process_h2()
1355 r->http_status = http_request_parse(r, scheme_port); in http_request_headers_process_h2()
1357 if (0 == r->http_status) { in http_request_headers_process_h2()
1358 if (light_btst(r->rqst_htags, HTTP_HEADER_CONNECTION)) in http_request_headers_process_h2()
1359 r->http_status = http_request_header_line_invalid(r, 400, in http_request_headers_process_h2()
1363 http_request_headers_fin(r); in http_request_headers_process_h2()
1366 if (__builtin_expect( (0 != r->http_status), 0)) { in http_request_headers_process_h2()
1367 if (r->conf.log_request_header_on_error) { in http_request_headers_process_h2()
1368 log_error(r->conf.errh, __FILE__, __LINE__, in http_request_headers_process_h2()
1370 r->http_host ? r->http_host->ptr : "", in http_request_headers_process_h2()
1371 http_method_buf(r->http_method)->ptr, in http_request_headers_process_h2()
1372 !buffer_is_blank(&r->target) ? r->target.ptr : ""); in http_request_headers_process_h2()
1377 if (light_btst(r->rqst_htags, HTTP_HEADER_UPGRADE)) in http_request_headers_process_h2()
1378 http_header_request_unset(r, HTTP_HEADER_UPGRADE, in http_request_headers_process_h2()