Lines Matching refs:r

43 http_response_omit_header (request_st * const r, const data_string * const ds)  in http_response_omit_header()  argument
57 && (limit < r->conf.bytes_per_second in http_response_omit_header()
58 || 0 == r->conf.bytes_per_second)) { in http_response_omit_header()
59 r->conf.bytes_per_second = limit; in http_response_omit_header()
70 http_response_write_header_partial_1xx (request_st * const r, buffer * const b) in http_response_write_header_partial_1xx() argument
74 connection * const con = r->con; in http_response_write_header_partial_1xx()
77 con->write_queue = &r->write_queue; in http_response_write_header_partial_1xx()
83 len, r->conf.errh) < 0) in http_response_write_header_partial_1xx()
91 http_response_write_header (request_st * const r) in http_response_write_header() argument
95 r->con->keep_alive_idle = r->conf.max_keep_alive_idle; in http_response_write_header()
96 if (__builtin_expect( (0 == r->conf.max_keep_alive_idle), 0) in http_response_write_header()
97 || r->con->request_count > r->conf.max_keep_alive_requests) { in http_response_write_header()
98 r->keep_alive = 0; in http_response_write_header()
99 } else if (0 != r->reqbody_length in http_response_write_header()
100 && r->reqbody_length != r->reqbody_queue.bytes_in in http_response_write_header()
101 && (NULL == r->handler_module in http_response_write_header()
102 || 0 == (r->conf.stream_request_body in http_response_write_header()
105 r->keep_alive = 0; in http_response_write_header()
108 if (light_btst(r->resp_htags, HTTP_HEADER_UPGRADE) in http_response_write_header()
109 && r->http_version == HTTP_VERSION_1_1) { in http_response_write_header()
110 …http_header_response_set(r, HTTP_HEADER_CONNECTION, CONST_STR_LEN("Connection"), CONST_STR_LEN("up… in http_response_write_header()
111 } else if (r->keep_alive <= 0) { in http_response_write_header()
112 if (r->keep_alive < 0) in http_response_write_header()
113 http_response_delay(r->con); in http_response_write_header()
114 …http_header_response_set(r, HTTP_HEADER_CONNECTION, CONST_STR_LEN("Connection"), CONST_STR_LEN("cl… in http_response_write_header()
115 } else if (r->http_version == HTTP_VERSION_1_0) {/*(&& r->keep_alive > 0)*/ in http_response_write_header()
116 …http_header_response_set(r, HTTP_HEADER_CONNECTION, CONST_STR_LEN("Connection"), CONST_STR_LEN("ke… in http_response_write_header()
119 if (304 == r->http_status in http_response_write_header()
120 && light_btst(r->resp_htags, HTTP_HEADER_CONTENT_ENCODING)) { in http_response_write_header()
121 http_header_response_unset(r, HTTP_HEADER_CONTENT_ENCODING, CONST_STR_LEN("Content-Encoding")); in http_response_write_header()
124 chunkqueue * const cq = &r->write_queue; in http_response_write_header()
127 if (cq != r->con->write_queue) in http_response_write_header()
128 http_response_write_header_partial_1xx(r, b); in http_response_write_header()
131 (r->http_version == HTTP_VERSION_1_1) in http_response_write_header()
135 http_status_append(b, r->http_status); in http_response_write_header()
138 for (size_t i = 0, used = r->resp_headers.used; i < used; ++i) { in http_response_write_header()
139 const data_string * const ds = (data_string *)r->resp_headers.data[i]; in http_response_write_header()
144 if ((ds->key.ptr[0] & 0xdf) == 'X' && http_response_omit_header(r, ds)) in http_response_write_header()
156 if (!light_btst(r->resp_htags, HTTP_HEADER_DATE)) { in http_response_write_header()
170 if (!light_btst(r->resp_htags, HTTP_HEADER_SERVER) && r->conf.server_tag) in http_response_write_header()
172 BUF_PTR_LEN(r->conf.server_tag)); in http_response_write_header()
176 r->resp_header_len = buffer_clen(b); in http_response_write_header()
178 if (r->conf.log_response_header) { in http_response_write_header()
179 log_error_multiline(r->conf.errh, __FILE__, __LINE__, in http_response_write_header()
180 BUF_PTR_LEN(b), "fd:%d resp: ", r->con->fd); in http_response_write_header()
187 if (r->resp_body_finished in http_response_write_header()
188 && light_btst(r->resp_htags, HTTP_HEADER_CONTENT_LENGTH) in http_response_write_header()
189 && (cqlen = chunkqueue_length(cq) - r->resp_header_len) > 0 in http_response_write_header()
197 http_response_physical_path_error (request_st * const r, const int code, const char * const msg) in http_response_physical_path_error() argument
199 r->http_status = code; in http_response_physical_path_error()
200 if ((code == 404 && r->conf.log_file_not_found) in http_response_physical_path_error()
201 || r->conf.log_request_handling) { in http_response_physical_path_error()
203 log_perror(r->conf.errh, __FILE__, __LINE__, "-- "); in http_response_physical_path_error()
205 log_error(r->conf.errh, __FILE__, __LINE__, "%s", msg); in http_response_physical_path_error()
206 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_physical_path_error()
207 "Path : %s", r->physical.path.ptr); in http_response_physical_path_error()
208 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_physical_path_error()
209 "URI : %s", r->uri.path.ptr); in http_response_physical_path_error()
215 static handler_t http_response_physical_path_check(request_st * const r) { in http_response_physical_path_check() argument
216 stat_cache_entry *sce = stat_cache_get_entry(&r->physical.path); in http_response_physical_path_check()
226 return http_response_physical_path_error(r, 403, NULL); in http_response_physical_path_check()
230 if (r->http_method == HTTP_METHOD_OPTIONS in http_response_physical_path_check()
231 && light_btst(r->resp_htags, HTTP_HEADER_ALLOW)) { in http_response_physical_path_check()
232 r->http_status = 200; in http_response_physical_path_check()
235 return http_response_physical_path_error(r, 404, NULL); in http_response_physical_path_check()
238 return http_response_physical_path_error(r, 500, NULL); in http_response_physical_path_check()
246 size_t len = buffer_clen(&r->physical.basedir) in http_response_physical_path_check()
247 - (buffer_has_pathsep_suffix(&r->physical.basedir)); in http_response_physical_path_check()
248 pathinfo = r->physical.path.ptr + len; in http_response_physical_path_check()
252 else if (pathinfo == r->physical.path.ptr) { /*(basedir is "/")*/ in http_response_physical_path_check()
257 const uint32_t pathused = r->physical.path.used; in http_response_physical_path_check()
260 r->physical.path.used = pathinfo - r->physical.path.ptr + 1; in http_response_physical_path_check()
262 stat_cache_entry * const nsce = stat_cache_get_entry(&r->physical.path); in http_response_physical_path_check()
264 r->physical.path.used = pathused; in http_response_physical_path_check()
275 return http_response_physical_path_error(r, 404, "-- file not found"); in http_response_physical_path_check()
282 size_t len = r->physical.path.ptr+pathused-1-pathinfo, reqlen; in http_response_physical_path_check()
283 if (r->conf.force_lowercase_filenames in http_response_physical_path_check()
284 && len <= (reqlen = buffer_clen(&r->target)) in http_response_physical_path_check()
285 && buffer_eq_icase_ssn(r->target.ptr + reqlen - len, pathinfo, len)) { in http_response_physical_path_check()
290 buffer_copy_string_len(&r->pathinfo, r->target.ptr + reqlen - len, len); in http_response_physical_path_check()
292 buffer_copy_string_len(&r->pathinfo, pathinfo, len); in http_response_physical_path_check()
299 buffer_truncate(&r->uri.path, buffer_clen(&r->uri.path) - len); in http_response_physical_path_check()
300 buffer_truncate(&r->physical.path, (size_t)(pathinfo - r->physical.path.ptr)); in http_response_physical_path_check()
304 if (!r->conf.follow_symlink in http_response_physical_path_check()
305 && 0 != stat_cache_path_contains_symlink(&r->physical.path, r->conf.errh)) { in http_response_physical_path_check()
306 return http_response_physical_path_error(r, 403, "-- access denied due to symlink restriction"); in http_response_physical_path_check()
313 r->tmp_sce = sce; in http_response_physical_path_check()
319 if (!buffer_has_slash_suffix(&r->uri.path)) { in http_response_physical_path_check()
320 http_response_redirect_to_directory(r, 301); in http_response_physical_path_check()
332 static handler_t http_status_set_error_close (request_st * const r, int status) { in http_status_set_error_close() argument
333 r->keep_alive = 0; in http_status_set_error_close()
334 r->resp_body_finished = 1; in http_status_set_error_close()
335 r->handler_module = NULL; in http_status_set_error_close()
336 r->http_status = status; in http_status_set_error_close()
341 static handler_t http_response_prepare_options_star (request_st * const r) { in http_response_prepare_options_star() argument
342 r->http_status = 200; in http_response_prepare_options_star()
343 r->resp_body_finished = 1; in http_response_prepare_options_star()
344 http_header_response_append(r, HTTP_HEADER_ALLOW, CONST_STR_LEN("Allow"), in http_response_prepare_options_star()
351 static handler_t http_response_prepare_connect (request_st * const r) { in http_response_prepare_connect() argument
352 return (r->handler_module) in http_response_prepare_connect()
354 : http_status_set_error_close(r, 405);/* 405 Method Not Allowed */ in http_response_prepare_connect()
358 static handler_t http_response_config (request_st * const r) { in http_response_config() argument
359 config_cond_cache_reset(r); in http_response_config()
360 config_patch_config(r); in http_response_config()
362 r->server_name = r->conf.server_name in http_response_config()
363 ? r->conf.server_name in http_response_config()
364 : &r->uri.authority; in http_response_config()
367 if (__builtin_expect( (!r->conf.allow_http11), 0) in http_response_config()
368 && r->http_version == HTTP_VERSION_1_1) { in http_response_config()
369 r->http_version = HTTP_VERSION_1_0; in http_response_config()
371 r->keep_alive = 0; in http_response_config()
374 if (__builtin_expect( (r->reqbody_length > 0), 0) in http_response_config()
375 && 0 != r->conf.max_request_size /* r->conf.max_request_size in kB */ in http_response_config()
376 && (off_t)r->reqbody_length > ((off_t)r->conf.max_request_size << 10)) { in http_response_config()
377 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_config()
378 "request-size too long: %lld -> 413", (long long) r->reqbody_length); in http_response_config()
380 http_status_set_error_close(r, 413); in http_response_config()
389 http_response_prepare (request_st * const r) in http_response_prepare() argument
394 if (__builtin_expect( (r->http_status > 200), 0)) { /* yes, > 200 */ in http_response_prepare()
395 if (0 == r->resp_body_finished) in http_response_prepare()
396 http_response_body_clear(r, 0); in http_response_prepare()
401 if (buffer_is_unset(&r->physical.path)) { in http_response_prepare()
403 if (__builtin_expect( (!r->async_callback), 1)) { in http_response_prepare()
404 rc = http_response_config(r); in http_response_prepare()
408 r->async_callback = 0; /* reset */ in http_response_prepare()
419 if (r->conf.log_request_handling) { in http_response_prepare()
420 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_prepare()
422 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_prepare()
423 "Request-URI : %s", r->target.ptr); in http_response_prepare()
424 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_prepare()
425 "URI-scheme : %s", r->uri.scheme.ptr); in http_response_prepare()
426 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_prepare()
427 "URI-authority : %s", r->uri.authority.ptr); in http_response_prepare()
428 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_prepare()
429 "URI-path (clean): %s", r->uri.path.ptr); in http_response_prepare()
430 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_prepare()
432 BUFFER_INTLEN_PTR(&r->uri.query)); in http_response_prepare()
436 rc = plugins_call_handle_uri_clean(r); in http_response_prepare()
439 if (__builtin_expect( (r->http_method == HTTP_METHOD_OPTIONS), 0) in http_response_prepare()
440 && r->uri.path.ptr[0] == '*' && r->uri.path.ptr[1] == '\0') in http_response_prepare()
441 return http_response_prepare_options_star(r); in http_response_prepare()
443 if (__builtin_expect( (r->http_method == HTTP_METHOD_CONNECT), 0) in http_response_prepare()
444 && (r->handler_module || !r->h2_connect_ext)) in http_response_prepare()
445 return http_response_prepare_connect(r); in http_response_prepare()
455 buffer_clear(&r->physical.doc_root); in http_response_prepare()
457 rc = plugins_call_handle_docroot(r); in http_response_prepare()
462 buffer_copy_buffer(&r->physical.rel_path, &r->uri.path); in http_response_prepare()
477 buffer *b = &r->physical.rel_path; in http_response_prepare()
492 if (r->conf.force_lowercase_filenames) { in http_response_prepare()
493 buffer_to_lower(&r->physical.rel_path); in http_response_prepare()
498 if (buffer_is_unset(&r->physical.doc_root)) in http_response_prepare()
499 buffer_copy_buffer(&r->physical.doc_root, r->conf.document_root); in http_response_prepare()
500 buffer_copy_buffer(&r->physical.basedir, &r->physical.doc_root); in http_response_prepare()
501 buffer_copy_path_len2(&r->physical.path, in http_response_prepare()
502 BUF_PTR_LEN(&r->physical.doc_root), in http_response_prepare()
503 BUF_PTR_LEN(&r->physical.rel_path)); in http_response_prepare()
505 rc = plugins_call_handle_physical(r); in http_response_prepare()
508 if (r->conf.log_request_handling) { in http_response_prepare()
509 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_prepare()
511 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_prepare()
512 "Doc-Root : %s", r->physical.doc_root.ptr); in http_response_prepare()
513 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_prepare()
514 "Basedir : %s", r->physical.basedir.ptr); in http_response_prepare()
515 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_prepare()
516 "Rel-Path : %s", r->physical.rel_path.ptr); in http_response_prepare()
517 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_prepare()
518 "Path : %s", r->physical.path.ptr); in http_response_prepare()
522 if (NULL != r->handler_module) return HANDLER_GO_ON; in http_response_prepare()
530 rc = http_response_physical_path_check(r); in http_response_prepare()
535 if (r->conf.log_request_handling) { in http_response_prepare()
536 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_prepare()
538 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_prepare()
539 "Path : %s", r->physical.path.ptr); in http_response_prepare()
540 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_prepare()
541 "URI : %s", r->uri.path.ptr); in http_response_prepare()
542 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_prepare()
544 BUFFER_INTLEN_PTR(&r->pathinfo)); in http_response_prepare()
548 rc = plugins_call_handle_subrequest_start(r); in http_response_prepare()
551 if (__builtin_expect( (NULL == r->handler_module), 0)) { in http_response_prepare()
553 if (__builtin_expect( (0 == r->http_status), 0)) { in http_response_prepare()
554 if (r->http_method == HTTP_METHOD_OPTIONS) { in http_response_prepare()
555 http_response_body_clear(r, 0); in http_response_prepare()
556 http_response_prepare_options_star(r); /*(treat like "*")*/ in http_response_prepare()
558 else if (r->http_method == HTTP_METHOD_CONNECT) in http_response_prepare()
560 return http_status_set_error_close(r, 405); in http_response_prepare()
562 else if (!http_method_get_head_query_post(r->http_method)) in http_response_prepare()
563 r->http_status = 501; in http_response_prepare()
565 r->http_status = 403; in http_response_prepare()
576 static handler_t http_response_comeback (request_st * const r) in http_response_comeback() argument
578 if (NULL != r->handler_module || !buffer_is_unset(&r->physical.path)) in http_response_comeback()
581 request_config_reset(r); in http_response_comeback()
583 if (__builtin_expect( (r->http_host != NULL), 1)) in http_response_comeback()
584 buffer_copy_string_len_lc(&r->uri.authority, BUF_PTR_LEN(r->http_host)); in http_response_comeback()
586 buffer_copy_string_len(&r->uri.authority, CONST_STR_LEN("")); in http_response_comeback()
588 int status = http_request_parse_target(r, r->con->proto_default_port); in http_response_comeback()
590 r->conditional_is_valid = (1 << COMP_SERVER_SOCKET) in http_response_comeback()
601 r->conditional_is_valid = (1 << COMP_SERVER_SOCKET) in http_response_comeback()
603 config_cond_cache_reset(r); in http_response_comeback()
604 return http_status_set_error_close(r, status); in http_response_comeback()
611 http_response_errdoc_init (request_st * const r) in http_response_errdoc_init() argument
617 if (401 == r->http_status) { in http_response_errdoc_init()
619 http_header_response_get(r, HTTP_HEADER_WWW_AUTHENTICATE, in http_response_errdoc_init()
624 buffer_reset(&r->physical.path); in http_response_errdoc_init()
625 r->resp_htags = 0; in http_response_errdoc_init()
626 array_reset_data_strings(&r->resp_headers); in http_response_errdoc_init()
627 http_response_body_clear(r, 0); in http_response_errdoc_init()
630 http_header_response_set(r, HTTP_HEADER_WWW_AUTHENTICATE, in http_response_errdoc_init()
640 http_response_static_errdoc (request_st * const r) in http_response_static_errdoc() argument
642 if (NULL == r->handler_module in http_response_static_errdoc()
643 ? r->error_handler_saved_status >= 65535 in http_response_static_errdoc()
644 : (!r->conf.error_intercept || r->error_handler_saved_status)) in http_response_static_errdoc()
647 http_response_errdoc_init(r); in http_response_static_errdoc()
648 r->resp_body_finished = 1; in http_response_static_errdoc()
651 if (r->conf.errorfile_prefix) { in http_response_static_errdoc()
652 buffer_copy_buffer(&r->physical.path, r->conf.errorfile_prefix); in http_response_static_errdoc()
653 buffer_append_int(&r->physical.path, r->http_status); in http_response_static_errdoc()
654 buffer_append_string_len(&r->physical.path, CONST_STR_LEN(".html")); in http_response_static_errdoc()
656 stat_cache_get_entry_open(&r->physical.path, r->conf.follow_symlink); in http_response_static_errdoc()
657 if (sce && 0 == http_chunk_append_file_ref(r, sce)) { in http_response_static_errdoc()
658 const buffer *content_type = stat_cache_content_type_get(sce, r); in http_response_static_errdoc()
660 http_header_response_set(r, HTTP_HEADER_CONTENT_TYPE, in http_response_static_errdoc()
665 buffer_clear(&r->physical.path); in http_response_static_errdoc()
669 buffer * const b = chunkqueue_append_buffer_open(&r->write_queue); in http_response_static_errdoc()
677 http_status_append(b, r->http_status); in http_response_static_errdoc()
683 http_status_append(b, r->http_status); in http_response_static_errdoc()
688 chunkqueue_append_buffer_commit(&r->write_queue); in http_response_static_errdoc()
690 http_header_response_set(r, HTTP_HEADER_CONTENT_TYPE, in http_response_static_errdoc()
698 http_response_merge_trailers (request_st * const r) in http_response_merge_trailers() argument
701 if (buffer_is_blank(&r->gw_dechunk->b)) return; in http_response_merge_trailers()
702 const int done = r->gw_dechunk->done; in http_response_merge_trailers()
709 if (done < 400 && r->http_status >= 400) return; in http_response_merge_trailers()
718 const char *k = strchr(r->gw_dechunk->b.ptr, '\n'); /*(skip final chunk)*/ in http_response_merge_trailers()
728 http_header_response_insert(r, id, k, klen, v, (size_t)(e - v)); in http_response_merge_trailers()
730 http_header_response_unset(r, HTTP_HEADER_OTHER, CONST_STR_LEN("Trailer")); in http_response_merge_trailers()
731 buffer_clear(&r->gw_dechunk->b); in http_response_merge_trailers()
737 http_response_write_prepare(request_st * const r) in http_response_write_prepare() argument
739 switch (r->http_status) { in http_response_write_prepare()
746 http_response_body_clear(r, 1); in http_response_write_prepare()
748 http_header_response_unset(r, HTTP_HEADER_CONTENT_LENGTH, in http_response_write_prepare()
750 r->resp_body_finished = 1; in http_response_write_prepare()
754 if (r->http_status >= 400 && r->http_status < 600) in http_response_write_prepare()
755 http_response_static_errdoc(r); in http_response_write_prepare()
759 if (r->gw_dechunk) in http_response_write_prepare()
760 http_response_merge_trailers(r); in http_response_write_prepare()
763 switch (plugins_call_handle_response_start(r)) { in http_response_write_prepare()
768 log_error(r->conf.errh, __FILE__, __LINE__, in http_response_write_prepare()
773 if (r->resp_body_finished) { in http_response_write_prepare()
775 if (r->conf.range_requests && r->http_status == 200 in http_response_write_prepare()
776 && http_range_rfc7233(r) >= 400) in http_response_write_prepare()
777 http_response_static_errdoc(r); /* 416 Range Not Satisfiable */ in http_response_write_prepare()
780 if (!(r->resp_htags in http_response_write_prepare()
783 off_t qlen = chunkqueue_length(&r->write_queue); in http_response_write_prepare()
797 http_header_response_set_ptr(r, HTTP_HEADER_CONTENT_LENGTH, in http_response_write_prepare()
801 else if (r->http_method != HTTP_METHOD_HEAD in http_response_write_prepare()
802 && r->http_status != 204 && r->http_status != 304) { in http_response_write_prepare()
805 http_header_response_set(r, HTTP_HEADER_CONTENT_LENGTH, in http_response_write_prepare()
811 else if (r->http_version == HTTP_VERSION_2) { in http_response_write_prepare()
824 if (!(r->resp_htags in http_response_write_prepare()
828 if (r->http_method == HTTP_METHOD_CONNECT && r->http_status == 200){ in http_response_write_prepare()
831 else if (r->http_version == HTTP_VERSION_1_1) { in http_response_write_prepare()
832 off_t qlen = chunkqueue_length(&r->write_queue); in http_response_write_prepare()
833 r->resp_send_chunked = 1; in http_response_write_prepare()
834 if (r->resp_decode_chunked) { in http_response_write_prepare()
836 off_t gw_chunked = r->gw_dechunk->gw_chunked; in http_response_write_prepare()
840 chunkqueue_append_mem(&r->write_queue, in http_response_write_prepare()
844 chunkqueue_append_mem(&r->write_queue, in http_response_write_prepare()
846 const buffer * const hdr = &r->gw_dechunk->b; in http_response_write_prepare()
848 chunkqueue_append_mem(&r->write_queue, in http_response_write_prepare()
853 chunkqueue_append_mem(&r->write_queue, in http_response_write_prepare()
859 chunkqueue_prepend_buffer_open(&r->write_queue); in http_response_write_prepare()
862 chunkqueue_prepend_buffer_commit(&r->write_queue); in http_response_write_prepare()
864 http_header_response_append(r, HTTP_HEADER_TRANSFER_ENCODING, in http_response_write_prepare()
869 r->keep_alive = 0; in http_response_write_prepare()
874 if (r->http_method == HTTP_METHOD_HEAD) { in http_response_write_prepare()
876 http_response_body_clear(r, 1); in http_response_write_prepare()
877 r->resp_body_finished = 1; in http_response_write_prepare()
886 http_response_call_error_handler (request_st * const r, const buffer * const error_handler) in http_response_call_error_handler() argument
894 http_header_env_set_ptr(r, CONST_STR_LEN("REDIRECT_STATUS")), in http_response_call_error_handler()
895 r->http_status); in http_response_call_error_handler()
897 if (error_handler == r->conf.error_handler) { in http_response_call_error_handler()
898 plugins_call_handle_request_reset(r); in http_response_call_error_handler()
900 if (r->reqbody_length) { in http_response_call_error_handler()
901 if (r->reqbody_length != r->reqbody_queue.bytes_in) in http_response_call_error_handler()
902 r->keep_alive = 0; in http_response_call_error_handler()
903 r->reqbody_length = 0; in http_response_call_error_handler()
904 chunkqueue_reset(&r->reqbody_queue); in http_response_call_error_handler()
907 r->con->is_writable = 1; in http_response_call_error_handler()
908 r->error_handler_saved_status = r->http_status; in http_response_call_error_handler()
909 r->error_handler_saved_method = r->http_method; in http_response_call_error_handler()
910 r->http_method = HTTP_METHOD_GET; in http_response_call_error_handler()
914 r->error_handler_saved_status = -r->http_status; in http_response_call_error_handler()
917 if (r->http_version == HTTP_VERSION_UNSET) in http_response_call_error_handler()
918 r->http_version = HTTP_VERSION_1_0; in http_response_call_error_handler()
920 buffer_copy_buffer(&r->target, error_handler); in http_response_call_error_handler()
921 http_response_errdoc_init(r); in http_response_call_error_handler()
922 r->http_status = 0; /*(after http_response_errdoc_init())*/ in http_response_call_error_handler()
930 http_response_has_error_handler (request_st * const r) in http_response_has_error_handler() argument
932 if (r->error_handler_saved_status > 0) in http_response_has_error_handler()
933 r->http_method = r->error_handler_saved_method; in http_response_has_error_handler()
934 if (NULL == r->handler_module || r->conf.error_intercept) { in http_response_has_error_handler()
935 if (__builtin_expect( (r->error_handler_saved_status), 0)) { in http_response_has_error_handler()
936 const int subreq_status = r->http_status; in http_response_has_error_handler()
937 if (r->error_handler_saved_status > 0) in http_response_has_error_handler()
938 r->http_status = r->error_handler_saved_status; in http_response_has_error_handler()
939 else if (r->http_status == 404 || r->http_status == 403) in http_response_has_error_handler()
941 r->http_status = -r->error_handler_saved_status; in http_response_has_error_handler()
949 r->error_handler_saved_status = 65535; /* >= 1000 */ in http_response_has_error_handler()
952 else if (__builtin_expect( (r->http_status >= 400), 0)) { in http_response_has_error_handler()
954 if (r->conf.error_handler) in http_response_has_error_handler()
955 error_handler = r->conf.error_handler; in http_response_has_error_handler()
956 else if ((r->http_status == 404 || r->http_status == 403) in http_response_has_error_handler()
957 && r->conf.error_handler_404) in http_response_has_error_handler()
958 error_handler = r->conf.error_handler_404; in http_response_has_error_handler()
961 return http_response_call_error_handler(r, error_handler); in http_response_has_error_handler()
969 http_response_handler (request_st * const r) in http_response_handler() argument
973 const plugin *p = r->handler_module; in http_response_handler()
975 || ((rc = http_response_prepare(r)) == HANDLER_GO_ON in http_response_handler()
976 && NULL != (p = r->handler_module))) in http_response_handler()
977 rc = p->handle_subrequest(r, p->data); in http_response_handler()
981 if (!r->resp_body_finished in http_response_handler()
982 && (!r->resp_body_started in http_response_handler()
983 || 0 == (r->conf.stream_response_body in http_response_handler()
991 if (r->http_status == 0) r->http_status = 200; in http_response_handler()
992 if ((__builtin_expect( (r->http_status < 400), 1) in http_response_handler()
993 && __builtin_expect( (0 == r->error_handler_saved_status), 1)) in http_response_handler()
994 || __builtin_expect( (!http_response_has_error_handler(r)), 1)) in http_response_handler()
997 return http_response_write_prepare(r); in http_response_handler()
1000 http_response_comeback(r); in http_response_handler()