Mercurial > hg > nginx-quic
comparison src/http/ngx_http_upstream.c @ 5295:a489c31c9783
Upstream: ngx_http_upstream_finalize_request(NGX_ERROR) on errors.
Previously, ngx_http_upstream_finalize_request(0) was used in most
cases after errors. While with current code there is no difference,
use of NGX_ERROR allows to pass a bit more information into
ngx_http_upstream_finalize_request().
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Thu, 25 Jul 2013 14:56:13 +0400 |
parents | d44c3b36c53f |
children | 1ccdda1f37f3 |
comparison
equal
deleted
inserted
replaced
5294:d44c3b36c53f | 5295:a489c31c9783 |
---|---|
2142 ngx_http_upstream_process_non_buffered_downstream; | 2142 ngx_http_upstream_process_non_buffered_downstream; |
2143 | 2143 |
2144 r->limit_rate = 0; | 2144 r->limit_rate = 0; |
2145 | 2145 |
2146 if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) { | 2146 if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) { |
2147 ngx_http_upstream_finalize_request(r, u, 0); | 2147 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2148 return; | 2148 return; |
2149 } | 2149 } |
2150 | 2150 |
2151 if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) { | 2151 if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) { |
2152 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay"); | 2152 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay"); |
2156 if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY, | 2156 if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY, |
2157 (const void *) &tcp_nodelay, sizeof(int)) == -1) | 2157 (const void *) &tcp_nodelay, sizeof(int)) == -1) |
2158 { | 2158 { |
2159 ngx_connection_error(c, ngx_socket_errno, | 2159 ngx_connection_error(c, ngx_socket_errno, |
2160 "setsockopt(TCP_NODELAY) failed"); | 2160 "setsockopt(TCP_NODELAY) failed"); |
2161 ngx_http_upstream_finalize_request(r, u, 0); | 2161 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2162 return; | 2162 return; |
2163 } | 2163 } |
2164 | 2164 |
2165 c->tcp_nodelay = NGX_TCP_NODELAY_SET; | 2165 c->tcp_nodelay = NGX_TCP_NODELAY_SET; |
2166 } | 2166 } |
2171 u->buffer.last = u->buffer.pos; | 2171 u->buffer.last = u->buffer.pos; |
2172 | 2172 |
2173 u->state->response_length += n; | 2173 u->state->response_length += n; |
2174 | 2174 |
2175 if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) { | 2175 if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) { |
2176 ngx_http_upstream_finalize_request(r, u, 0); | 2176 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2177 return; | 2177 return; |
2178 } | 2178 } |
2179 | 2179 |
2180 ngx_http_upstream_process_non_buffered_downstream(r); | 2180 ngx_http_upstream_process_non_buffered_downstream(r); |
2181 | 2181 |
2182 } else { | 2182 } else { |
2183 u->buffer.pos = u->buffer.start; | 2183 u->buffer.pos = u->buffer.start; |
2184 u->buffer.last = u->buffer.start; | 2184 u->buffer.last = u->buffer.start; |
2185 | 2185 |
2186 if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) { | 2186 if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) { |
2187 ngx_http_upstream_finalize_request(r, u, 0); | 2187 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2188 return; | 2188 return; |
2189 } | 2189 } |
2190 | 2190 |
2191 if (u->peer.connection->read->ready || u->length == 0) { | 2191 if (u->peer.connection->read->ready || u->length == 0) { |
2192 ngx_http_upstream_process_non_buffered_upstream(r, u); | 2192 ngx_http_upstream_process_non_buffered_upstream(r, u); |
2206 } | 2206 } |
2207 | 2207 |
2208 switch (ngx_http_test_predicates(r, u->conf->no_cache)) { | 2208 switch (ngx_http_test_predicates(r, u->conf->no_cache)) { |
2209 | 2209 |
2210 case NGX_ERROR: | 2210 case NGX_ERROR: |
2211 ngx_http_upstream_finalize_request(r, u, 0); | 2211 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2212 return; | 2212 return; |
2213 | 2213 |
2214 case NGX_DECLINED: | 2214 case NGX_DECLINED: |
2215 u->cacheable = 0; | 2215 u->cacheable = 0; |
2216 break; | 2216 break; |
2222 r->cache->min_uses = u->conf->cache_min_uses; | 2222 r->cache->min_uses = u->conf->cache_min_uses; |
2223 r->cache->body_start = u->conf->buffer_size; | 2223 r->cache->body_start = u->conf->buffer_size; |
2224 r->cache->file_cache = u->conf->cache->data; | 2224 r->cache->file_cache = u->conf->cache->data; |
2225 | 2225 |
2226 if (ngx_http_file_cache_create(r) != NGX_OK) { | 2226 if (ngx_http_file_cache_create(r) != NGX_OK) { |
2227 ngx_http_upstream_finalize_request(r, u, 0); | 2227 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2228 return; | 2228 return; |
2229 } | 2229 } |
2230 } | 2230 } |
2231 | 2231 |
2232 break; | 2232 break; |
2283 | 2283 |
2284 p->cacheable = u->cacheable || u->store; | 2284 p->cacheable = u->cacheable || u->store; |
2285 | 2285 |
2286 p->temp_file = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t)); | 2286 p->temp_file = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t)); |
2287 if (p->temp_file == NULL) { | 2287 if (p->temp_file == NULL) { |
2288 ngx_http_upstream_finalize_request(r, u, 0); | 2288 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2289 return; | 2289 return; |
2290 } | 2290 } |
2291 | 2291 |
2292 p->temp_file->file.fd = NGX_INVALID_FILE; | 2292 p->temp_file->file.fd = NGX_INVALID_FILE; |
2293 p->temp_file->file.log = c->log; | 2293 p->temp_file->file.log = c->log; |
2306 p->max_temp_file_size = u->conf->max_temp_file_size; | 2306 p->max_temp_file_size = u->conf->max_temp_file_size; |
2307 p->temp_file_write_size = u->conf->temp_file_write_size; | 2307 p->temp_file_write_size = u->conf->temp_file_write_size; |
2308 | 2308 |
2309 p->preread_bufs = ngx_alloc_chain_link(r->pool); | 2309 p->preread_bufs = ngx_alloc_chain_link(r->pool); |
2310 if (p->preread_bufs == NULL) { | 2310 if (p->preread_bufs == NULL) { |
2311 ngx_http_upstream_finalize_request(r, u, 0); | 2311 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2312 return; | 2312 return; |
2313 } | 2313 } |
2314 | 2314 |
2315 p->preread_bufs->buf = &u->buffer; | 2315 p->preread_bufs->buf = &u->buffer; |
2316 p->preread_bufs->next = NULL; | 2316 p->preread_bufs->next = NULL; |
2320 | 2320 |
2321 if (u->cacheable) { | 2321 if (u->cacheable) { |
2322 | 2322 |
2323 p->buf_to_file = ngx_calloc_buf(r->pool); | 2323 p->buf_to_file = ngx_calloc_buf(r->pool); |
2324 if (p->buf_to_file == NULL) { | 2324 if (p->buf_to_file == NULL) { |
2325 ngx_http_upstream_finalize_request(r, u, 0); | 2325 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2326 return; | 2326 return; |
2327 } | 2327 } |
2328 | 2328 |
2329 p->buf_to_file->start = u->buffer.start; | 2329 p->buf_to_file->start = u->buffer.start; |
2330 p->buf_to_file->pos = u->buffer.start; | 2330 p->buf_to_file->pos = u->buffer.start; |
2368 p->length = -1; | 2368 p->length = -1; |
2369 | 2369 |
2370 if (u->input_filter_init | 2370 if (u->input_filter_init |
2371 && u->input_filter_init(p->input_ctx) != NGX_OK) | 2371 && u->input_filter_init(p->input_ctx) != NGX_OK) |
2372 { | 2372 { |
2373 ngx_http_upstream_finalize_request(r, u, 0); | 2373 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2374 return; | 2374 return; |
2375 } | 2375 } |
2376 | 2376 |
2377 u->read_event_handler = ngx_http_upstream_process_upstream; | 2377 u->read_event_handler = ngx_http_upstream_process_upstream; |
2378 r->write_event_handler = ngx_http_upstream_process_downstream; | 2378 r->write_event_handler = ngx_http_upstream_process_downstream; |
2410 if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY, | 2410 if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY, |
2411 (const void *) &tcp_nodelay, sizeof(int)) == -1) | 2411 (const void *) &tcp_nodelay, sizeof(int)) == -1) |
2412 { | 2412 { |
2413 ngx_connection_error(c, ngx_socket_errno, | 2413 ngx_connection_error(c, ngx_socket_errno, |
2414 "setsockopt(TCP_NODELAY) failed"); | 2414 "setsockopt(TCP_NODELAY) failed"); |
2415 ngx_http_upstream_finalize_request(r, u, 0); | 2415 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2416 return; | 2416 return; |
2417 } | 2417 } |
2418 | 2418 |
2419 c->tcp_nodelay = NGX_TCP_NODELAY_SET; | 2419 c->tcp_nodelay = NGX_TCP_NODELAY_SET; |
2420 } | 2420 } |
2426 if (setsockopt(u->peer.connection->fd, IPPROTO_TCP, TCP_NODELAY, | 2426 if (setsockopt(u->peer.connection->fd, IPPROTO_TCP, TCP_NODELAY, |
2427 (const void *) &tcp_nodelay, sizeof(int)) == -1) | 2427 (const void *) &tcp_nodelay, sizeof(int)) == -1) |
2428 { | 2428 { |
2429 ngx_connection_error(u->peer.connection, ngx_socket_errno, | 2429 ngx_connection_error(u->peer.connection, ngx_socket_errno, |
2430 "setsockopt(TCP_NODELAY) failed"); | 2430 "setsockopt(TCP_NODELAY) failed"); |
2431 ngx_http_upstream_finalize_request(r, u, 0); | 2431 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2432 return; | 2432 return; |
2433 } | 2433 } |
2434 | 2434 |
2435 u->peer.connection->tcp_nodelay = NGX_TCP_NODELAY_SET; | 2435 u->peer.connection->tcp_nodelay = NGX_TCP_NODELAY_SET; |
2436 } | 2436 } |
2437 } | 2437 } |
2438 | 2438 |
2439 if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) { | 2439 if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) { |
2440 ngx_http_upstream_finalize_request(r, u, 0); | 2440 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2441 return; | 2441 return; |
2442 } | 2442 } |
2443 | 2443 |
2444 if (u->peer.connection->read->ready | 2444 if (u->peer.connection->read->ready |
2445 || u->buffer.pos != u->buffer.last) | 2445 || u->buffer.pos != u->buffer.last) |
2535 } | 2535 } |
2536 | 2536 |
2537 if (b->start == NULL) { | 2537 if (b->start == NULL) { |
2538 b->start = ngx_palloc(r->pool, u->conf->buffer_size); | 2538 b->start = ngx_palloc(r->pool, u->conf->buffer_size); |
2539 if (b->start == NULL) { | 2539 if (b->start == NULL) { |
2540 ngx_http_upstream_finalize_request(r, u, 0); | 2540 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2541 return; | 2541 return; |
2542 } | 2542 } |
2543 | 2543 |
2544 b->pos = b->start; | 2544 b->pos = b->start; |
2545 b->last = b->start; | 2545 b->last = b->start; |
2558 if (size && dst->write->ready) { | 2558 if (size && dst->write->ready) { |
2559 | 2559 |
2560 n = dst->send(dst, b->pos, size); | 2560 n = dst->send(dst, b->pos, size); |
2561 | 2561 |
2562 if (n == NGX_ERROR) { | 2562 if (n == NGX_ERROR) { |
2563 ngx_http_upstream_finalize_request(r, u, 0); | 2563 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2564 return; | 2564 return; |
2565 } | 2565 } |
2566 | 2566 |
2567 if (n > 0) { | 2567 if (n > 0) { |
2568 b->pos += n; | 2568 b->pos += n; |
2613 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); | 2613 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
2614 | 2614 |
2615 if (ngx_handle_write_event(upstream->write, u->conf->send_lowat) | 2615 if (ngx_handle_write_event(upstream->write, u->conf->send_lowat) |
2616 != NGX_OK) | 2616 != NGX_OK) |
2617 { | 2617 { |
2618 ngx_http_upstream_finalize_request(r, u, 0); | 2618 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2619 return; | 2619 return; |
2620 } | 2620 } |
2621 | 2621 |
2622 if (upstream->write->active && !upstream->write->ready) { | 2622 if (upstream->write->active && !upstream->write->ready) { |
2623 ngx_add_timer(upstream->write, u->conf->send_timeout); | 2623 ngx_add_timer(upstream->write, u->conf->send_timeout); |
2625 } else if (upstream->write->timer_set) { | 2625 } else if (upstream->write->timer_set) { |
2626 ngx_del_timer(upstream->write); | 2626 ngx_del_timer(upstream->write); |
2627 } | 2627 } |
2628 | 2628 |
2629 if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) { | 2629 if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) { |
2630 ngx_http_upstream_finalize_request(r, u, 0); | 2630 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2631 return; | 2631 return; |
2632 } | 2632 } |
2633 | 2633 |
2634 if (upstream->read->active && !upstream->read->ready) { | 2634 if (upstream->read->active && !upstream->read->ready) { |
2635 ngx_add_timer(upstream->read, u->conf->read_timeout); | 2635 ngx_add_timer(upstream->read, u->conf->read_timeout); |
2639 } | 2639 } |
2640 | 2640 |
2641 if (ngx_handle_write_event(downstream->write, clcf->send_lowat) | 2641 if (ngx_handle_write_event(downstream->write, clcf->send_lowat) |
2642 != NGX_OK) | 2642 != NGX_OK) |
2643 { | 2643 { |
2644 ngx_http_upstream_finalize_request(r, u, 0); | 2644 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2645 return; | 2645 return; |
2646 } | 2646 } |
2647 | 2647 |
2648 if (ngx_handle_read_event(downstream->read, 0) != NGX_OK) { | 2648 if (ngx_handle_read_event(downstream->read, 0) != NGX_OK) { |
2649 ngx_http_upstream_finalize_request(r, u, 0); | 2649 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2650 return; | 2650 return; |
2651 } | 2651 } |
2652 | 2652 |
2653 if (downstream->write->active && !downstream->write->ready) { | 2653 if (downstream->write->active && !downstream->write->ready) { |
2654 ngx_add_timer(downstream->write, clcf->send_timeout); | 2654 ngx_add_timer(downstream->write, clcf->send_timeout); |
2735 | 2735 |
2736 if (u->out_bufs || u->busy_bufs) { | 2736 if (u->out_bufs || u->busy_bufs) { |
2737 rc = ngx_http_output_filter(r, u->out_bufs); | 2737 rc = ngx_http_output_filter(r, u->out_bufs); |
2738 | 2738 |
2739 if (rc == NGX_ERROR) { | 2739 if (rc == NGX_ERROR) { |
2740 ngx_http_upstream_finalize_request(r, u, 0); | 2740 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2741 return; | 2741 return; |
2742 } | 2742 } |
2743 | 2743 |
2744 ngx_chain_update_chains(r->pool, &u->free_bufs, &u->busy_bufs, | 2744 ngx_chain_update_chains(r->pool, &u->free_bufs, &u->busy_bufs, |
2745 &u->out_bufs, u->output.tag); | 2745 &u->out_bufs, u->output.tag); |
2772 | 2772 |
2773 if (n > 0) { | 2773 if (n > 0) { |
2774 u->state->response_length += n; | 2774 u->state->response_length += n; |
2775 | 2775 |
2776 if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) { | 2776 if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) { |
2777 ngx_http_upstream_finalize_request(r, u, 0); | 2777 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2778 return; | 2778 return; |
2779 } | 2779 } |
2780 } | 2780 } |
2781 | 2781 |
2782 do_write = 1; | 2782 do_write = 1; |
2791 | 2791 |
2792 if (downstream->data == r) { | 2792 if (downstream->data == r) { |
2793 if (ngx_handle_write_event(downstream->write, clcf->send_lowat) | 2793 if (ngx_handle_write_event(downstream->write, clcf->send_lowat) |
2794 != NGX_OK) | 2794 != NGX_OK) |
2795 { | 2795 { |
2796 ngx_http_upstream_finalize_request(r, u, 0); | 2796 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2797 return; | 2797 return; |
2798 } | 2798 } |
2799 } | 2799 } |
2800 | 2800 |
2801 if (downstream->write->active && !downstream->write->ready) { | 2801 if (downstream->write->active && !downstream->write->ready) { |
2804 } else if (downstream->write->timer_set) { | 2804 } else if (downstream->write->timer_set) { |
2805 ngx_del_timer(downstream->write); | 2805 ngx_del_timer(downstream->write); |
2806 } | 2806 } |
2807 | 2807 |
2808 if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) { | 2808 if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) { |
2809 ngx_http_upstream_finalize_request(r, u, 0); | 2809 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2810 return; | 2810 return; |
2811 } | 2811 } |
2812 | 2812 |
2813 if (upstream->read->active && !upstream->read->ready) { | 2813 if (upstream->read->active && !upstream->read->ready) { |
2814 ngx_add_timer(upstream->read, u->conf->read_timeout); | 2814 ngx_add_timer(upstream->read, u->conf->read_timeout); |
2895 | 2895 |
2896 if (!wev->ready) { | 2896 if (!wev->ready) { |
2897 ngx_add_timer(wev, p->send_timeout); | 2897 ngx_add_timer(wev, p->send_timeout); |
2898 | 2898 |
2899 if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) { | 2899 if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) { |
2900 ngx_http_upstream_finalize_request(r, u, 0); | 2900 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2901 } | 2901 } |
2902 | 2902 |
2903 return; | 2903 return; |
2904 } | 2904 } |
2905 | 2905 |
2920 | 2920 |
2921 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, | 2921 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, |
2922 "http downstream delayed"); | 2922 "http downstream delayed"); |
2923 | 2923 |
2924 if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) { | 2924 if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) { |
2925 ngx_http_upstream_finalize_request(r, u, 0); | 2925 ngx_http_upstream_finalize_request(r, u, NGX_ERROR); |
2926 } | 2926 } |
2927 | 2927 |
2928 return; | 2928 return; |
2929 } | 2929 } |
2930 | 2930 |