annotate src/http/ngx_http_upstream.c @ 196:8759b346e431 NGINX_0_3_45

nginx 0.3.45 *) Feature: the "ssl_verify_client", "ssl_verify_depth", and "ssl_client_certificate" directives. *) Change: the $request_method variable now returns the main request method. *) Change: the ° symbol codes were changed in koi-win conversion table. *) Feature: the euro É N symbols were added to koi-win conversion table. *) Bugfix: if nginx distributed the requests among several backends and some backend failed, then requests intended for this backend was directed to one live backend only instead of being distributed among the rest.
author Igor Sysoev <http://sysoev.ru>
date Sat, 06 May 2006 00:00:00 +0400
parents 3689cd4e3228
children e6da4931e0e0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
12 static void ngx_http_upstream_rd_check_broken_connection(ngx_http_request_t *r);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
13 static void ngx_http_upstream_wr_check_broken_connection(ngx_http_request_t *r);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
14 static void ngx_http_upstream_check_broken_connection(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
15 ngx_event_t *ev);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
16 static void ngx_http_upstream_connect(ngx_http_request_t *r,
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
17 ngx_http_upstream_t *u);
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
18 static ngx_int_t ngx_http_upstream_reinit(ngx_http_request_t *r,
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
19 ngx_http_upstream_t *u);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
20 static void ngx_http_upstream_send_request(ngx_http_request_t *r,
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
21 ngx_http_upstream_t *u);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
22 static void ngx_http_upstream_send_request_handler(ngx_event_t *wev);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23 static void ngx_http_upstream_process_header(ngx_event_t *rev);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24 static void ngx_http_upstream_send_response(ngx_http_request_t *r,
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
25 ngx_http_upstream_t *u);
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
26 static void
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
27 ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
28 static void ngx_http_upstream_process_non_buffered_body(ngx_event_t *ev);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
29 static ngx_int_t ngx_http_upstream_non_buffered_filter_init(void *data);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
30 static ngx_int_t ngx_http_upstream_non_buffered_filter(void *data,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
31 ssize_t bytes);
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
32 static void ngx_http_upstream_process_downstream(ngx_http_request_t *r);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
33 static void ngx_http_upstream_process_body(ngx_event_t *ev);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
34 static void ngx_http_upstream_dummy_handler(ngx_event_t *wev);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35 static void ngx_http_upstream_next(ngx_http_request_t *r,
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
36 ngx_http_upstream_t *u, ngx_uint_t ft_type);
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
37 static void ngx_http_upstream_cleanup(void *data);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38 static void ngx_http_upstream_finalize_request(ngx_http_request_t *r,
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
39 ngx_http_upstream_t *u, ngx_int_t rc);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
40
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
41 static ngx_int_t ngx_http_upstream_process_header_line(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
42 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
43 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
44 ngx_http_upstream_process_multi_header_lines(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
45 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
46 static ngx_int_t ngx_http_upstream_ignore_header_line(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
47 ngx_table_elt_t *h, ngx_uint_t offset);
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
48 static ngx_int_t ngx_http_upstream_process_limit_rate(ngx_http_request_t *r,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
49 ngx_table_elt_t *h, ngx_uint_t offset);
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
50 static ngx_int_t ngx_http_upstream_copy_header_line(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
51 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
52 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
53 ngx_http_upstream_conditional_copy_header_line(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
54 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
55 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
56 ngx_http_upstream_copy_multi_header_lines(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
57 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
58 static ngx_int_t ngx_http_upstream_copy_content_type(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
59 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
60 static ngx_int_t ngx_http_upstream_copy_content_length(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
61 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
62 static ngx_int_t ngx_http_upstream_rewrite_location(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
63 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
64 static ngx_int_t ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
65 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
66 #if (NGX_HTTP_GZIP)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
67 static ngx_int_t ngx_http_upstream_copy_content_encoding(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
68 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
69 #endif
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
70
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71 static size_t ngx_http_upstream_log_status_getlen(ngx_http_request_t *r,
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
72 uintptr_t data);
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
73 static u_char *ngx_http_upstream_log_status(ngx_http_request_t *r,
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
74 u_char *buf, ngx_http_log_op_t *op);
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
75 static size_t ngx_http_upstream_log_response_time_getlen(ngx_http_request_t *r,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
76 uintptr_t data);
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
77 static u_char *ngx_http_upstream_log_response_time(ngx_http_request_t *r,
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
78 u_char *buf, ngx_http_log_op_t *op);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
79
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
80 static u_char *ngx_http_upstream_log_error(ngx_http_request_t *r, u_char *buf,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
81 size_t len);
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
82
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
83 static ngx_int_t ngx_http_upstream_add_variables(ngx_conf_t *cf);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
84 static ngx_int_t ngx_http_upstream_status_variable(ngx_http_request_t *r,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
85 ngx_http_variable_value_t *v, uintptr_t data);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
86 static ngx_int_t ngx_http_upstream_response_time_variable(ngx_http_request_t *r,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
87 ngx_http_variable_value_t *v, uintptr_t data);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
88
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
89 static void *ngx_http_upstream_create_main_conf(ngx_conf_t *cf);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
90 static char *ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
91
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
92 #if (NGX_HTTP_SSL)
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
93 static void ngx_http_upstream_ssl_init_connection(ngx_http_request_t *,
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
94 ngx_http_upstream_t *u, ngx_connection_t *c);
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
95 static void ngx_http_upstream_ssl_handshake(ngx_connection_t *c);
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
96 static void ngx_http_upstream_ssl_shutdown(ngx_connection_t *c,
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
97 ngx_peer_t *peer);
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
98 #endif
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
99
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
100
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
101 ngx_http_upstream_header_t ngx_http_upstream_headers_in[] = {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
102
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
103 { ngx_string("Status"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
104 ngx_http_upstream_process_header_line,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
105 offsetof(ngx_http_upstream_headers_in_t, status),
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
106 /* STUB */ ngx_http_upstream_ignore_header_line, 0, 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
107
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
108 { ngx_string("Content-Type"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
109 ngx_http_upstream_process_header_line,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
110 offsetof(ngx_http_upstream_headers_in_t, content_type),
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
111 ngx_http_upstream_copy_content_type, 0, 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
112
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
113 { ngx_string("Content-Length"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
114 ngx_http_upstream_process_header_line,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
115 offsetof(ngx_http_upstream_headers_in_t, content_length),
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
116 ngx_http_upstream_copy_content_length, 0, 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
117
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
118 { ngx_string("Date"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
119 ngx_http_upstream_process_header_line,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
120 offsetof(ngx_http_upstream_headers_in_t, date),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
121 ngx_http_upstream_conditional_copy_header_line,
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
122 offsetof(ngx_http_upstream_conf_t, pass_date), 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
123
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
124 { ngx_string("Server"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
125 ngx_http_upstream_process_header_line,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
126 offsetof(ngx_http_upstream_headers_in_t, server),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
127 ngx_http_upstream_conditional_copy_header_line,
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
128 offsetof(ngx_http_upstream_conf_t, pass_server), 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
129
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
130 { ngx_string("WWW-Authenticate"),
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
131 ngx_http_upstream_process_header_line,
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
132 offsetof(ngx_http_upstream_headers_in_t, www_authenticate),
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
133 ngx_http_upstream_copy_header_line, 0, 0 },
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
134
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
135 { ngx_string("Location"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
136 ngx_http_upstream_ignore_header_line, 0,
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
137 ngx_http_upstream_rewrite_location, 0, 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
138
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
139 { ngx_string("Refresh"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
140 ngx_http_upstream_ignore_header_line, 0,
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
141 ngx_http_upstream_rewrite_refresh, 0, 0 },
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
142
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
143 { ngx_string("Set-Cookie"),
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
144 ngx_http_upstream_ignore_header_line, 0,
80
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
145 ngx_http_upstream_copy_header_line, 0, 1 },
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
146
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
147 { ngx_string("Content-Disposition"),
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
148 ngx_http_upstream_ignore_header_line, 0,
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
149 ngx_http_upstream_copy_header_line, 0, 1 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
150
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
151 { ngx_string("Cache-Control"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
152 ngx_http_upstream_process_multi_header_lines,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
153 offsetof(ngx_http_upstream_headers_in_t, cache_control),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
154 ngx_http_upstream_copy_multi_header_lines,
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
155 offsetof(ngx_http_headers_out_t, cache_control), 1 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
156
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
157 { ngx_string("Expires"),
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
158 ngx_http_upstream_process_header_line,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
159 offsetof(ngx_http_upstream_headers_in_t, expires),
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
160 ngx_http_upstream_copy_header_line,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
161 offsetof(ngx_http_headers_out_t, expires), 1 },
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
162
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
163 { ngx_string("Accept-Ranges"),
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
164 ngx_http_upstream_process_header_line,
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
165 offsetof(ngx_http_upstream_headers_in_t, accept_ranges),
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
166 ngx_http_upstream_copy_header_line,
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
167 offsetof(ngx_http_headers_out_t, accept_ranges), 1 },
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
168
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
169 { ngx_string("Connection"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
170 ngx_http_upstream_ignore_header_line, 0,
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
171 ngx_http_upstream_ignore_header_line, 0, 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
172
190
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
173 { ngx_string("Keep-Alive"),
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
174 ngx_http_upstream_ignore_header_line, 0,
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
175 ngx_http_upstream_ignore_header_line, 0, 0 },
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
176
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
177 { ngx_string("X-Pad"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
178 ngx_http_upstream_ignore_header_line, 0,
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
179 ngx_http_upstream_ignore_header_line, 0, 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
180
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
181 { ngx_string("X-Powered-By"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
182 ngx_http_upstream_ignore_header_line, 0,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
183 ngx_http_upstream_conditional_copy_header_line,
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
184 offsetof(ngx_http_upstream_conf_t, pass_x_powered_by), 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
185
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
186 { ngx_string("X-Accel-Expires"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
187 ngx_http_upstream_process_header_line,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
188 offsetof(ngx_http_upstream_headers_in_t, x_accel_expires),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
189 ngx_http_upstream_conditional_copy_header_line,
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
190 offsetof(ngx_http_upstream_conf_t, pass_x_accel_expires), 0 },
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
191
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
192 { ngx_string("X-Accel-Redirect"),
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
193 ngx_http_upstream_process_header_line,
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
194 offsetof(ngx_http_upstream_headers_in_t, x_accel_redirect),
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
195 ngx_http_upstream_ignore_header_line, 0, 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
196
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
197 { ngx_string("X-Accel-Limit-Rate"),
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
198 ngx_http_upstream_process_limit_rate, 0,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
199 ngx_http_upstream_ignore_header_line, 0, 0 },
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
200
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
201 #if (NGX_HTTP_GZIP)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
202 { ngx_string("Content-Encoding"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
203 ngx_http_upstream_process_header_line,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
204 offsetof(ngx_http_upstream_headers_in_t, content_encoding),
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
205 ngx_http_upstream_copy_content_encoding, 0, 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
206 #endif
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
207
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
208 { ngx_null_string, NULL, 0, NULL, 0, 0 }
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
209 };
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
210
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
211
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
212 ngx_http_module_t ngx_http_upstream_module_ctx = {
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
213 ngx_http_upstream_add_variables, /* preconfiguration */
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
214 NULL, /* postconfiguration */
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
215
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
216 ngx_http_upstream_create_main_conf, /* create main configuration */
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
217 ngx_http_core_init_main_conf, /* init main configuration */
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
218
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
219 NULL, /* create server configuration */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
220 NULL, /* merge server configuration */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
221
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
222 NULL, /* create location configuration */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
223 NULL /* merge location configuration */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
224 };
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
225
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
226
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
227 ngx_module_t ngx_http_upstream_module = {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
228 NGX_MODULE_V1,
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
229 &ngx_http_upstream_module_ctx, /* module context */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
230 NULL, /* module directives */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
231 NGX_HTTP_MODULE, /* module type */
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
232 NULL, /* init master */
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
233 NULL, /* init module */
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
234 NULL, /* init process */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
235 NULL, /* init thread */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
236 NULL, /* exit thread */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
237 NULL, /* exit process */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
238 NULL, /* exit master */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
239 NGX_MODULE_V1_PADDING
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
240 };
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
241
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
242
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
243 static ngx_http_log_op_name_t ngx_http_upstream_log_fmt_ops[] = {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
244 { ngx_string("upstream_status"), 0, NULL,
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
245 ngx_http_upstream_log_status_getlen,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
246 ngx_http_upstream_log_status },
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
247 { ngx_string("upstream_response_time"), 0, NULL,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
248 ngx_http_upstream_log_response_time_getlen,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
249 ngx_http_upstream_log_response_time },
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
250 { ngx_null_string, 0, NULL, NULL, NULL }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
251 };
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
254 static ngx_http_variable_t ngx_http_upstream_vars[] = {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
255
186
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 178
diff changeset
256 { ngx_string("upstream_status"), NULL,
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
257 ngx_http_upstream_status_variable, 0, NGX_HTTP_VAR_NOHASH, 0 },
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
258
186
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 178
diff changeset
259 { ngx_string("upstream_response_time"), NULL,
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
260 ngx_http_upstream_response_time_variable, 0, NGX_HTTP_VAR_NOHASH, 0 },
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
261
186
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 178
diff changeset
262 { ngx_null_string, NULL, NULL, 0, 0, 0 }
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
263 };
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
264
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
265
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
266 void
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
267 ngx_http_upstream_init(ngx_http_request_t *r)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
268 {
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
269 ngx_time_t *tp;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
270 ngx_connection_t *c;
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
271 ngx_http_cleanup_t *cln;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
272 ngx_http_upstream_t *u;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
273 ngx_http_core_loc_conf_t *clcf;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
274
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
275 c = r->connection;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
276
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
277 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
278 "http init upstream, client timer: %d", c->read->timer_set);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
279
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
280 if (c->read->timer_set) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
281 ngx_del_timer(c->read);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
282 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
283
178
87699398f955 nginx 0.3.36
Igor Sysoev <http://sysoev.ru>
parents: 172
diff changeset
284 u = r->upstream;
87699398f955 nginx 0.3.36
Igor Sysoev <http://sysoev.ru>
parents: 172
diff changeset
285
87699398f955 nginx 0.3.36
Igor Sysoev <http://sysoev.ru>
parents: 172
diff changeset
286 if (!r->post_action && !u->conf->ignore_client_abort) {
164
b922c231a392 nginx 0.3.29
Igor Sysoev <http://sysoev.ru>
parents: 162
diff changeset
287 r->read_event_handler = ngx_http_upstream_rd_check_broken_connection;
b922c231a392 nginx 0.3.29
Igor Sysoev <http://sysoev.ru>
parents: 162
diff changeset
288 r->write_event_handler = ngx_http_upstream_wr_check_broken_connection;
b922c231a392 nginx 0.3.29
Igor Sysoev <http://sysoev.ru>
parents: 162
diff changeset
289 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
290
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
291 if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
292
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
293 if (!c->write->active) {
80
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
294 if (ngx_add_event(c->write, NGX_WRITE_EVENT, NGX_CLEAR_EVENT)
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
295 == NGX_ERROR)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
296 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
297 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
298 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
299 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
300 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
301 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
302
86
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
303 if (r->request_body) {
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
304 u->request_bufs = r->request_body->bufs;
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
305 }
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
306
86
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
307 if (u->create_request(r) != NGX_OK) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
308 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
309 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
310 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
311
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
312 u->peer.log = r->connection->log;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
313 u->saved_log_handler = r->log_handler;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
314 r->log_handler = ngx_http_upstream_log_error;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
315
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
316 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
317
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
318 u->output.sendfile = r->connection->sendfile;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
319 u->output.pool = r->pool;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
320 u->output.bufs.num = 1;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
321 u->output.bufs.size = clcf->client_body_buffer_size;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
322 u->output.output_filter = ngx_chain_writer;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
323 u->output.filter_ctx = &u->writer;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
324
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
325 u->writer.pool = r->pool;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
326
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
327 if (ngx_array_init(&u->states, r->pool, u->peer.peers->number,
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
328 sizeof(ngx_http_upstream_state_t))
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
329 != NGX_OK)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
330 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
331 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
332 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
333 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
334
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
335 u->state = ngx_array_push(&u->states);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
336 if (u->state == NULL) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
337 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
338 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
339 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
340
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
341 ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
342
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
343 tp = ngx_timeofday();
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
344
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
345 u->state->response_time = tp->sec * 1000 + tp->msec;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
346
142
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 140
diff changeset
347 cln = ngx_http_cleanup_add(r, 0);
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
348 if (cln == NULL) {
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
349 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
350 return;
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
351 }
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
352
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
353 cln->handler = ngx_http_upstream_cleanup;
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
354 cln->data = r;
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
355 u->cleanup = &cln->handler;
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
356
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
357 ngx_http_upstream_connect(r, u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
358 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
359
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
360
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
361 static void
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
362 ngx_http_upstream_rd_check_broken_connection(ngx_http_request_t *r)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
363 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
364 ngx_http_upstream_check_broken_connection(r, r->connection->read);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
365 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
366
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
367
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
368 static void
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
369 ngx_http_upstream_wr_check_broken_connection(ngx_http_request_t *r)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
370 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
371 ngx_http_upstream_check_broken_connection(r, r->connection->write);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
372 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
373
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
374
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
375 static void
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
376 ngx_http_upstream_check_broken_connection(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
377 ngx_event_t *ev)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
378 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
379 int n;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
380 char buf[1];
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
381 ngx_err_t err;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
382 ngx_connection_t *c;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
383 ngx_http_upstream_t *u;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
384
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
385 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ev->log, 0,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
386 "http upstream check client, write event:%d, \"%V\"",
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
387 ev->write, &r->uri);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
388
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
389 c = r->connection;
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
390 u = r->upstream;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
391
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
392 if (c->error) {
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
393 ngx_http_upstream_finalize_request(r, u,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
394 NGX_HTTP_CLIENT_CLOSED_REQUEST);
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
395 return;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
396 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
397
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
398 if (u->peer.connection == NULL) {
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
399 return;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
400 }
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
401
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
402 #if (NGX_HAVE_KQUEUE)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
403
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
404 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
405
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
406 if (!ev->pending_eof) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
407 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
408 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
409
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
410 ev->eof = 1;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
411 c->error = 1;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
412
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
413 if (ev->kq_errno) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
414 ev->error = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
415 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
416
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
417 if (!u->cachable && u->peer.connection) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
418 ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
419 "kevent() reported that client closed prematurely "
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
420 "connection, so upstream connection is closed too");
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
421 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
422 NGX_HTTP_CLIENT_CLOSED_REQUEST);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
423 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
424 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
425
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
426 ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
427 "kevent() reported that client closed "
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
428 "prematurely connection");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
429
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
430 if (u->peer.connection == NULL) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
431 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
432 NGX_HTTP_CLIENT_CLOSED_REQUEST);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
433 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
434 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
435
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
436 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
437 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
438
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
439 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
440
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
441 n = recv(c->fd, buf, 1, MSG_PEEK);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
442
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
443 err = ngx_socket_errno;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
444
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
445 /*
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
446 * we do not need to disable the write event because
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
447 * that event has NGX_USE_CLEAR_EVENT type
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
448 */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
449
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
450 if (ev->write && (n >= 0 || err == NGX_EAGAIN)) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
451 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
452 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
453
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
454 if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
455 if (ngx_del_event(ev, NGX_READ_EVENT, 0) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
456 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
457 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
458 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
459 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
460 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
461
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
462 if (n > 0) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
463 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
464 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
465
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
466 if (n == -1) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
467 if (err == NGX_EAGAIN) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
468 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
469 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
470
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
471 ev->error = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
472
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
473 } else { /* n == 0 */
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
474 err = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
475 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
476
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
477 ev->eof = 1;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
478 c->error = 1;
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
479
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
480 if (!u->cachable && u->peer.connection) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
481 ngx_log_error(NGX_LOG_INFO, ev->log, err,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
482 "client closed prematurely connection, "
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
483 "so upstream connection is closed too");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
484 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
485 NGX_HTTP_CLIENT_CLOSED_REQUEST);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
486 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
487 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
488
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
489 ngx_log_error(NGX_LOG_INFO, ev->log, err,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
490 "client closed prematurely connection");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
491
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
492 if (u->peer.connection == NULL) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
493 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
494 NGX_HTTP_CLIENT_CLOSED_REQUEST);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
495 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
496 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
497 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
498
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
499
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
500 static void
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
501 ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
502 {
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
503 ngx_int_t rc;
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
504 ngx_connection_t *c;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
505
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
506 r->connection->log->action = "connecting to upstream";
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
507
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
508 r->connection->single_connection = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
509
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
510 rc = ngx_event_connect_peer(&u->peer);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
511
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
512 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
513 "http upstream connect: %i", rc);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
514
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
515 if (rc == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
516 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
517 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
518 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
519 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
520
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
521 u->state->peer = &u->peer.peers->peer[u->peer.cur_peer].name;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
522
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
523 if (rc == NGX_BUSY) {
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
524 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no live upstreams");
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
525 }
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
526
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
527 if (rc == NGX_BUSY || rc == NGX_DECLINED) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
528 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
529 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
530 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
531
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
532 /* rc == NGX_OK || rc == NGX_AGAIN */
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
533
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
534 c = u->peer.connection;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
535
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
536 c->data = r;
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
537
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
538 c->write->handler = ngx_http_upstream_send_request_handler;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
539 c->read->handler = ngx_http_upstream_process_header;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
540
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
541 c->sendfile = r->connection->sendfile;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
542
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
543 c->pool = r->pool;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
544 c->read->log = c->write->log = c->log = r->connection->log;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
545
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
546 /* init or reinit the ngx_output_chain() and ngx_chain_writer() contexts */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
547
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
548 u->writer.out = NULL;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
549 u->writer.last = &u->writer.out;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
550 u->writer.connection = c;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
551 u->writer.limit = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
552
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
553 if (u->request_sent) {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
554 if (ngx_http_upstream_reinit(r, u) != NGX_OK) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
555 ngx_http_upstream_finalize_request(r, u,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
556 NGX_HTTP_INTERNAL_SERVER_ERROR);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
557 return;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
558 }
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
559 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
560
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
561 if (r->request_body && r->request_body->temp_file && r == r->main) {
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
562
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
563 /*
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
564 * the r->request_body->buf can be reused for one request only,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
565 * the subrequests should allocate their own temporay bufs
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
566 */
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
567
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
568 u->output.free = ngx_alloc_chain_link(r->pool);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
569 if (u->output.free == NULL) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
570 ngx_http_upstream_finalize_request(r, u,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
571 NGX_HTTP_INTERNAL_SERVER_ERROR);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
572 return;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
573 }
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
574
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
575 u->output.free->buf = r->request_body->buf;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
576 u->output.free->next = NULL;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
577 u->output.allocated = 1;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
578
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
579 r->request_body->buf->pos = r->request_body->buf->start;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
580 r->request_body->buf->last = r->request_body->buf->start;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
581 r->request_body->buf->tag = u->output.tag;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
582 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
583
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
584 u->request_sent = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
585
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
586 if (rc == NGX_AGAIN) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
587 ngx_add_timer(c->write, u->conf->connect_timeout);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
588 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
589 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
590
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
591 #if (NGX_HTTP_SSL)
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
592
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
593 if (u->conf->ssl && c->ssl == NULL) {
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
594 ngx_http_upstream_ssl_init_connection(r, u, c);
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
595 return;
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
596 }
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
597
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
598 #endif
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
599
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
600 ngx_http_upstream_send_request(r, u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
601 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
602
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
603
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
604 #if (NGX_HTTP_SSL)
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
605
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
606 static void
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
607 ngx_http_upstream_ssl_init_connection(ngx_http_request_t *r,
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
608 ngx_http_upstream_t *u, ngx_connection_t *c)
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
609 {
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
610 ngx_int_t rc;
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
611 ngx_peer_t *peer;
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
612
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
613 if (ngx_ssl_create_connection(u->conf->ssl, c,
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
614 NGX_SSL_BUFFER|NGX_SSL_CLIENT)
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
615 == NGX_ERROR)
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
616 {
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
617 ngx_http_upstream_finalize_request(r, u,
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
618 NGX_HTTP_INTERNAL_SERVER_ERROR);
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
619 return;
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
620 }
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
621
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
622 c->sendfile = 0;
168
3314be145cb9 nginx 0.3.31
Igor Sysoev <http://sysoev.ru>
parents: 164
diff changeset
623 u->output.sendfile = 0;
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
624
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
625 peer = &u->peer.peers->peer[u->peer.cur_peer];
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
626
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
627 if (ngx_ssl_set_session(c, peer->ssl_session) != NGX_OK) {
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
628 ngx_http_upstream_finalize_request(r, u,
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
629 NGX_HTTP_INTERNAL_SERVER_ERROR);
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
630 return;
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
631 }
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
632
190
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
633 r->connection->log->action = "SSL handshaking to upstream";
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
634
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
635 rc = ngx_ssl_handshake(c);
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
636
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
637 if (rc == NGX_AGAIN) {
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
638 c->ssl->handler = ngx_http_upstream_ssl_handshake;
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
639 return;
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
640 }
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
641
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
642 ngx_http_upstream_ssl_handshake(c);
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
643 }
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
644
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
645
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
646 static void
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
647 ngx_http_upstream_ssl_handshake(ngx_connection_t *c)
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
648 {
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
649 ngx_http_request_t *r;
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
650 ngx_http_upstream_t *u;
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
651
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
652 r = c->data;
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
653 u = r->upstream;
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
654
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
655 if (c->ssl->handshaked) {
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
656
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
657 c->write->handler = ngx_http_upstream_send_request_handler;
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
658 c->read->handler = ngx_http_upstream_process_header;
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
659
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
660 ngx_http_upstream_send_request(r, u);
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
661
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
662 return;
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
663 }
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
664
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
665 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
666
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
667 }
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
668
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
669 #endif
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
670
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
671
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
672 static ngx_int_t
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
673 ngx_http_upstream_reinit(ngx_http_request_t *r, ngx_http_upstream_t *u)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
674 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
675 ngx_chain_t *cl;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
676
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
677 if (u->reinit_request(r) != NGX_OK) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
678 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
679 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
680
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
681 ngx_memzero(&r->upstream->headers_in,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
682 sizeof(ngx_http_upstream_headers_in_t));
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
683
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
684 if (ngx_list_init(&r->upstream->headers_in.headers, r->pool, 8,
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
685 sizeof(ngx_table_elt_t))
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
686 != NGX_OK)
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
687 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
688 return NGX_ERROR;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
689 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
690
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
691 /* reinit the request chain */
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
692
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
693 for (cl = u->request_bufs; cl; cl = cl->next) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
694 cl->buf->pos = cl->buf->start;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
695 cl->buf->file_pos = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
696 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
697
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
698 /* reinit the subrequest's ngx_output_chain() context */
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
699
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
700 if (r->request_body && r->request_body->temp_file
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
701 && r != r->main && u->output.buf)
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
702 {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
703 u->output.free = ngx_alloc_chain_link(r->pool);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
704 if (u->output.free == NULL) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
705 return NGX_ERROR;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
706 }
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
707
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
708 u->output.free->buf = u->output.buf;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
709 u->output.free->next = NULL;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
710
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
711 u->output.buf->pos = u->output.buf->start;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
712 u->output.buf->last = u->output.buf->start;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
713 }
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
714
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
715 u->output.buf = NULL;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
716 u->output.in = NULL;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
717 u->output.busy = NULL;
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
718
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
719 /* reinit u->buffer */
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
720
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
721 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
722 if (u->cache) {
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
723 u->buffer.pos = u->buffer.start + u->cache->ctx.header_size;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
724 u->buffer.last = u->buffer.pos;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
725
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
726 } else {
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
727 u->buffer.pos = u->buffer.start;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
728 u->buffer.last = u->buffer.start;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
729 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
730 #else
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
731
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
732 u->buffer.pos = u->buffer.start;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
733 u->buffer.last = u->buffer.start;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
734
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
735 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
736
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
737 /* add one more state */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
738
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
739 u->state = ngx_array_push(&u->states);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
740 if (u->state == NULL) {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
741 return NGX_ERROR;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
742 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
743
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
744 ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
745
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
746 return NGX_OK;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
747 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
748
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
749
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
750 static void
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
751 ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
752 {
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
753 int rc;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
754 ngx_connection_t *c;
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
755
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
756 c = u->peer.connection;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
757
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
758 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
759 "http upstream send request");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
760
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
761 #if (NGX_HAVE_KQUEUE)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
762
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
763 if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
764 && !u->request_sent
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
765 && c->write->pending_eof)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
766 {
86
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
767 (void) ngx_connection_error(c, c->write->kq_errno,
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
768 "kevent() reported that connect() failed");
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
769 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
770 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
771 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
772
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
773 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
774
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
775 c->log->action = "sending request to upstream";
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
776
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
777 rc = ngx_output_chain(&u->output, u->request_sent ? NULL : u->request_bufs);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
778
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
779 u->request_sent = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
780
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
781 if (rc == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
782 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
783 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
784 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
785
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
786 if (c->write->timer_set) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
787 ngx_del_timer(c->write);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
788 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
789
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
790 if (rc == NGX_AGAIN) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
791 ngx_add_timer(c->write, u->conf->send_timeout);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
792
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
793 if (ngx_handle_write_event(c->write, u->conf->send_lowat) == NGX_ERROR)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
794 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
795 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
796 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
797 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
798 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
799
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
800 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
801 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
802
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
803 /* rc == NGX_OK */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
804
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
805 if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
806 if (ngx_tcp_push(c->fd) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
807 ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
808 ngx_tcp_push_n " failed");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
809 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
810 NGX_HTTP_INTERNAL_SERVER_ERROR);
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
811 return;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
812 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
813
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
814 c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
815 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
816
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
817 ngx_add_timer(c->read, u->conf->read_timeout);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
818
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
819 #if 1
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
820 if (c->read->ready) {
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
821
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
822 /* post aio operation */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
823
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
824 /*
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
825 * TODO comment
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
826 * although we can post aio operation just in the end
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
827 * of ngx_http_upstream_connect() CHECK IT !!!
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
828 * it's better to do here because we postpone header buffer allocation
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
829 */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
830
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
831 ngx_http_upstream_process_header(c->read);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
832 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
833 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
834 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
835
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
836 c->write->handler = ngx_http_upstream_dummy_handler;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
837
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
838 if (ngx_handle_write_event(c->write, 0) == NGX_ERROR) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
839 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
840 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
841 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
842 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
843 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
844
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
845
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
846 static void
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
847 ngx_http_upstream_send_request_handler(ngx_event_t *wev)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
848 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
849 ngx_connection_t *c;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
850 ngx_http_request_t *r;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
851 ngx_http_upstream_t *u;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
852
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
853 c = wev->data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
854 r = c->data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
855 u = r->upstream;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
856
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
857 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
858 "http upstream send request handler");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
859
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
860 if (wev->timedout) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
861 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
862 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
863 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
864
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
865 #if (NGX_HTTP_SSL)
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
866
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
867 if (u->conf->ssl && c->ssl == NULL) {
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
868 ngx_http_upstream_ssl_init_connection(r, u, c);
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
869 return;
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
870 }
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
871
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
872 #endif
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
873
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
874 ngx_http_upstream_send_request(r, u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
875 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
876
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
877
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
878 static void
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
879 ngx_http_upstream_process_header(ngx_event_t *rev)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
880 {
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
881 ssize_t n;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
882 ngx_int_t rc;
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
883 ngx_str_t *uri, args;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
884 ngx_uint_t i, key, flags;
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
885 ngx_list_part_t *part;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
886 ngx_table_elt_t *h;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
887 ngx_connection_t *c;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
888 ngx_http_request_t *r;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
889 ngx_http_upstream_t *u;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
890 ngx_http_err_page_t *err_page;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
891 ngx_http_core_loc_conf_t *clcf;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
892 ngx_http_upstream_header_t *hh;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
893 ngx_http_upstream_main_conf_t *umcf;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
894
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
895 c = rev->data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
896 r = c->data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
897 u = r->upstream;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
898
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
899 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
900 "http upstream process header");
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
901
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
902 c->log->action = "reading response header from upstream";
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
903
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
904 if (rev->timedout) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
905 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
906 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
907 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
908
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
909 if (u->buffer.start == NULL) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
910 u->buffer.start = ngx_palloc(r->pool, u->conf->buffer_size);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
911 if (u->buffer.start == NULL) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
912 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
913 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
914 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
915 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
916
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
917 u->buffer.pos = u->buffer.start;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
918 u->buffer.last = u->buffer.start;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
919 u->buffer.end = u->buffer.start + u->conf->buffer_size;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
920 u->buffer.temporary = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
921
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
922 u->buffer.tag = u->output.tag;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
923
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
924 if (ngx_list_init(&r->upstream->headers_in.headers, r->pool, 8,
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
925 sizeof(ngx_table_elt_t))
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
926 != NGX_OK)
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
927 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
928 ngx_http_upstream_finalize_request(r, u,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
929 NGX_HTTP_INTERNAL_SERVER_ERROR);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
930 return;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
931 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
932
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
933 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
934 if (u->cache) {
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
935 u->buffer.pos += u->cache->ctx.header_size;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
936 u->buffer.last = u->buffer.pos;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
937 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
938 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
939 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
940
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
941 n = u->peer.connection->recv(u->peer.connection, u->buffer.last,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
942 u->buffer.end - u->buffer.last);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
943
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
944 if (n == NGX_AGAIN) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
945 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
946 ngx_add_timer(rev, u->read_timeout);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
947 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
948
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
949 if (ngx_handle_read_event(rev, 0) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
950 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
951 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
952 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
953 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
954
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
955 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
956 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
957
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
958 if (n == 0) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
959 ngx_log_error(NGX_LOG_ERR, rev->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
960 "upstream prematurely closed connection");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
961 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
962
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
963 if (n == NGX_ERROR || n == 0) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
964 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
965 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
966 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
967
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
968 u->buffer.last += n;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
969
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
970 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
971 u->valid_header_in = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
972
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
973 u->peer.cached = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
974 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
975
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
976 rc = u->process_header(r);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
977
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
978 if (rc == NGX_AGAIN) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
979 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
980 ngx_add_timer(rev, u->read_timeout);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
981 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
982
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
983 if (u->buffer.pos == u->buffer.end) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
984 ngx_log_error(NGX_LOG_ERR, rev->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
985 "upstream sent too big header");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
986
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
987 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
988 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
989 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
990
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
991 if (ngx_handle_read_event(rev, 0) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
992 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
993 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
994 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
995 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
996
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
997 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
998 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
999
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1000 if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1001 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1002 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1003 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1004
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1005 if (rc == NGX_ERROR || rc == NGX_HTTP_INTERNAL_SERVER_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1006 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1007 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1008 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1009 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1010
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1011 /* rc == NGX_OK */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1012
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1013 if (u->headers_in.status_n == NGX_HTTP_INTERNAL_SERVER_ERROR) {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1014
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1015 if (u->peer.tries > 1
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1016 && (u->conf->next_upstream & NGX_HTTP_UPSTREAM_FT_HTTP_500))
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1017 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1018 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_HTTP_500);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1019 return;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1020 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1021
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1022 #if (NGX_HTTP_CACHE)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1023
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1024 if (u->peer.tries == 0
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1025 && u->stale
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1026 && (u->conf->use_stale & NGX_HTTP_UPSTREAM_FT_HTTP_500))
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1027 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1028 ngx_http_upstream_finalize_request(r, u,
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1029 ngx_http_send_cached_response(r));
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1030 return;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1031 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1032
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1033 #endif
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1034 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1035
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1036 if (u->headers_in.status_n == NGX_HTTP_NOT_FOUND) {
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1037
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1038 if (u->peer.tries > 1
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1039 && u->conf->next_upstream & NGX_HTTP_UPSTREAM_FT_HTTP_404)
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1040 {
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1041 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_HTTP_404);
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1042 return;
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1043 }
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1044
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1045 if (u->conf->redirect_404) {
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1046 rc = (r->err_ctx == NULL) ? 404 : 204;
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1047 ngx_http_upstream_finalize_request(r, u, rc);
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1048 return;
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1049 }
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1050 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1051
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1052
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1053 if (u->headers_in.status_n >= NGX_HTTP_BAD_REQUEST
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1054 && u->conf->redirect_errors
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1055 && r->err_ctx == NULL)
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1056 {
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1057 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1058
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1059 if (clcf->error_pages) {
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1060
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1061 err_page = clcf->error_pages->elts;
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1062 for (i = 0; i < clcf->error_pages->nelts; i++) {
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1063 if (err_page[i].status == (ngx_int_t) u->headers_in.status_n) {
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1064
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1065 if (u->headers_in.status_n == NGX_HTTP_UNAUTHORIZED) {
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1066
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1067 r->headers_out.www_authenticate =
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1068 ngx_list_push(&r->headers_out.headers);
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1069
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1070 if (r->headers_out.www_authenticate == NULL) {
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1071 ngx_http_upstream_finalize_request(r, u,
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1072 NGX_HTTP_INTERNAL_SERVER_ERROR);
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1073 return;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1074 }
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1075
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1076 *r->headers_out.www_authenticate =
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1077 *u->headers_in.www_authenticate;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1078 }
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1079
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1080 ngx_http_upstream_finalize_request(r, u,
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1081 u->headers_in.status_n);
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1082 return;
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1083 }
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1084 }
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1085 }
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1086 }
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1087
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1088 if (r->upstream->headers_in.x_accel_redirect) {
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1089 ngx_http_upstream_finalize_request(r, u, NGX_DECLINED);
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1090
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1091 umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1092 hh = (ngx_http_upstream_header_t *) umcf->headers_in_hash.buckets;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1093
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1094 part = &r->upstream->headers_in.headers.part;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1095 h = part->elts;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1096
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1097 for (i = 0; /* void */; i++) {
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1098
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1099 if (i >= part->nelts) {
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1100 if (part->next == NULL) {
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1101 break;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1102 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1103
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1104 part = part->next;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1105 h = part->elts;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1106 i = 0;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1107 }
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1108
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1109 key = h[i].hash % umcf->headers_in_hash.hash_size;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1110
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1111 if (hh[key].redirect
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1112 && hh[key].name.len == h[i].key.len
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1113 && ngx_strcasecmp(hh[key].name.data, h[i].key.data) == 0)
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1114 {
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1115 if (hh[key].copy_handler(r, &h[i], hh[key].conf) != NGX_OK) {
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1116 ngx_http_upstream_finalize_request(r, u,
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1117 NGX_HTTP_INTERNAL_SERVER_ERROR);
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1118 return;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1119 }
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1120
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1121 }
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1122 }
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1123
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1124 uri = &r->upstream->headers_in.x_accel_redirect->value;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1125 args.len = 0;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1126 args.data = NULL;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1127 flags = 0;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1128
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1129 if (ngx_http_parse_unsafe_uri(r, uri, &args, &flags) != NGX_OK) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1130 ngx_http_upstream_finalize_request(r, u, NGX_HTTP_NOT_FOUND);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1131 return;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1132 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1133
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1134 if (flags & NGX_HTTP_ZERO_IN_URI) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1135 r->zero_in_uri = 1;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1136 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1137
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1138 ngx_http_internal_redirect(r, uri, &args);
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1139 return;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1140 }
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1141
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1142 ngx_http_upstream_send_response(r, u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1143 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1144
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1145
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1146 static void
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1147 ngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1148 {
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1149 int tcp_nodelay;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1150 ssize_t size;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1151 ngx_int_t rc;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1152 ngx_uint_t i, key;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1153 ngx_list_part_t *part;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1154 ngx_table_elt_t *h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1155 ngx_event_pipe_t *p;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1156 ngx_connection_t *c;
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1157 ngx_pool_cleanup_t *cl;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1158 ngx_pool_cleanup_file_t *clf;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1159 ngx_http_core_loc_conf_t *clcf;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1160 ngx_http_upstream_header_t *hh;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1161 ngx_http_upstream_main_conf_t *umcf;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1162
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1163 umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1164 hh = (ngx_http_upstream_header_t *) umcf->headers_in_hash.buckets;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1165
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1166 part = &r->upstream->headers_in.headers.part;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1167 h = part->elts;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1168
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1169 for (i = 0; /* void */; i++) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1170
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1171 if (i >= part->nelts) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1172 if (part->next == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1173 break;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1174 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1175
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1176 part = part->next;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1177 h = part->elts;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1178 i = 0;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1179 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1180
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1181 key = h[i].hash % umcf->headers_in_hash.hash_size;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1182
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1183 if (hh[key].name.len == h[i].key.len
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1184 && ngx_strcasecmp(hh[key].name.data, h[i].key.data) == 0)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1185 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1186 if (hh[key].copy_handler(r, &h[i], hh[key].conf) != NGX_OK) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1187 ngx_http_upstream_finalize_request(r, u,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1188 NGX_HTTP_INTERNAL_SERVER_ERROR);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1189 return;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1190 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1191
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1192 continue;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1193 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1194
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1195 if (ngx_http_upstream_copy_header_line(r, &h[i], 0) != NGX_OK) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1196 ngx_http_upstream_finalize_request(r, u,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1197 NGX_HTTP_INTERNAL_SERVER_ERROR);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1198 return;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1199 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1200 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1201
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1202 r->headers_out.status = u->headers_in.status_n;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1203 r->headers_out.status_line = u->headers_in.status_line;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1204
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1205 if (r->headers_out.content_length_n != -1) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1206 u->length = (size_t) r->headers_out.content_length_n;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1207
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1208 } else {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1209 u->length = NGX_MAX_SIZE_T_VALUE;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1210 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1211
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1212 rc = ngx_http_send_header(r);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1213
178
87699398f955 nginx 0.3.36
Igor Sysoev <http://sysoev.ru>
parents: 172
diff changeset
1214 if (rc == NGX_ERROR || rc > NGX_OK || r->post_action) {
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
1215 ngx_http_upstream_finalize_request(r, u, rc);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1216 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1217 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1218
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1219 u->header_sent = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1220
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1221 if (r->request_body && r->request_body->temp_file) {
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1222 for (cl = r->pool->cleanup; cl; cl = cl->next) {
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1223 if (cl->handler == ngx_pool_cleanup_file) {
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1224 clf = cl->data;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1225
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1226 if (clf->fd == r->request_body->temp_file->file.fd) {
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1227 cl->handler(clf);
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1228 cl->handler = NULL;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1229 break;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1230 }
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1231 }
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1232 }
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1233 }
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1234
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1235 c = r->connection;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1236
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1237 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1238
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1239 if (u->pipe == NULL) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1240
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1241 if (u->input_filter == NULL) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1242 u->input_filter_init = ngx_http_upstream_non_buffered_filter_init;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1243 u->input_filter = ngx_http_upstream_non_buffered_filter;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1244 u->input_filter_ctx = r;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1245 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1246
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1247 u->peer.connection->read->handler =
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1248 ngx_http_upstream_process_non_buffered_body;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1249 r->write_event_handler =
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1250 ngx_http_upstream_process_non_buffered_downstream;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1251
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1252 r->limit_rate = 0;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1253
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1254 if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1255 ngx_http_upstream_finalize_request(r, u, 0);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1256 return;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1257 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1258
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1259 if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1260 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1261
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1262 tcp_nodelay = 1;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1263
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1264 if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1265 (const void *) &tcp_nodelay, sizeof(int)) == -1)
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1266 {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1267 ngx_connection_error(c, ngx_socket_errno,
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1268 "setsockopt(TCP_NODELAY) failed");
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1269 ngx_http_upstream_finalize_request(r, u, 0);
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1270 return;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1271 }
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1272
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1273 c->tcp_nodelay = NGX_TCP_NODELAY_SET;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1274 }
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1275
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1276 size = u->buffer.last - u->buffer.pos;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1277
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1278 if (size) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1279 u->buffer.last = u->buffer.pos;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1280
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1281 if (u->input_filter(u->input_filter_ctx, size) == NGX_ERROR) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1282 ngx_http_upstream_finalize_request(r, u, 0);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1283 return;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1284 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1285
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1286 ngx_http_upstream_process_non_buffered_body(c->write);
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1287
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1288 } else {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1289 u->buffer.pos = u->buffer.start;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1290 u->buffer.last = u->buffer.start;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1291
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1292 if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1293 ngx_http_upstream_finalize_request(r, u, 0);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1294 return;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1295 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1296 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1297
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1298 return;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1299 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1300
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1301 /* TODO: preallocate event_pipe bufs, look "Content-Length" */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1302
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1303 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1304
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1305 if (u->cache && u->cache->ctx.file.fd != NGX_INVALID_FILE) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1306 if (ngx_close_file(u->cache->ctx.file.fd) == NGX_FILE_ERROR) {
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1307 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1308 ngx_close_file_n " \"%s\" failed",
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1309 u->cache->ctx.file.name.data);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1310 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1311 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1312
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1313 if (u->cachable) {
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1314 header = (ngx_http_cache_header_t *) u->buffer->start;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1315
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1316 header->expires = u->cache->ctx.expires;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1317 header->last_modified = u->cache->ctx.last_modified;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1318 header->date = u->cache->ctx.date;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1319 header->length = r->headers_out.content_length_n;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1320 u->cache->ctx.length = r->headers_out.content_length_n;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1321
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1322 header->key_len = u->cache->ctx.key0.len;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1323 ngx_memcpy(&header->key, u->cache->ctx.key0.data, header->key_len);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1324 header->key[header->key_len] = LF;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1325 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1326
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1327 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1328
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1329 p = u->pipe;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1330
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1331 p->output_filter = (ngx_event_pipe_output_filter_pt) ngx_http_output_filter;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1332 p->output_ctx = r;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1333 p->tag = u->output.tag;
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1334 p->bufs = u->conf->bufs;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1335 p->busy_size = u->conf->busy_buffers_size;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1336 p->upstream = u->peer.connection;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1337 p->downstream = c;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1338 p->pool = r->pool;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1339 p->log = c->log;
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1340
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1341 p->cachable = u->cachable;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1342
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
1343 p->temp_file = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
1344 if (p->temp_file == NULL) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1345 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1346 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1347 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1348
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1349 p->temp_file->file.fd = NGX_INVALID_FILE;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1350 p->temp_file->file.log = c->log;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1351 p->temp_file->path = u->conf->temp_path;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1352 p->temp_file->pool = r->pool;
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1353
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1354 if (u->cachable) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1355 p->temp_file->persistent = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1356 } else {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1357 p->temp_file->warn = "an upstream response is buffered "
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1358 "to a temporary file";
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1359 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1360
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1361 p->max_temp_file_size = u->conf->max_temp_file_size;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1362 p->temp_file_write_size = u->conf->temp_file_write_size;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1363
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
1364 p->preread_bufs = ngx_alloc_chain_link(r->pool);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
1365 if (p->preread_bufs == NULL) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1366 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1367 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1368 }
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1369 p->preread_bufs->buf = &u->buffer;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1370 p->preread_bufs->next = NULL;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1371 u->buffer.recycled = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1372
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1373 p->preread_size = u->buffer.last - u->buffer.pos;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1374
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1375 if (u->cachable) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1376 p->buf_to_file = ngx_calloc_buf(r->pool);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1377 if (p->buf_to_file == NULL) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1378 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1379 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1380 }
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1381 p->buf_to_file->pos = u->buffer.start;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1382 p->buf_to_file->last = u->buffer.pos;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1383 p->buf_to_file->temporary = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1384 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1385
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1386 if (ngx_event_flags & NGX_USE_AIO_EVENT) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1387 /* the posted aio operation may currupt a shadow buffer */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1388 p->single_buf = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1389 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1390
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1391 /* TODO: p->free_bufs = 0 if use ngx_create_chain_of_bufs() */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1392 p->free_bufs = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1393
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1394 /*
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1395 * event_pipe would do u->buffer.last += p->preread_size
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1396 * as though these bytes were read
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1397 */
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1398 u->buffer.last = u->buffer.pos;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1399
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1400 if (u->conf->cyclic_temp_file) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1401
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1402 /*
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1403 * we need to disable the use of sendfile() if we use cyclic temp file
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1404 * because the writing a new data may interfere with sendfile()
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1405 * that uses the same kernel file pages (at least on FreeBSD)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1406 */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1407
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1408 p->cyclic_temp_file = 1;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1409 c->sendfile = 0;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1410
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1411 } else {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1412 p->cyclic_temp_file = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1413 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1414
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1415 p->read_timeout = u->conf->read_timeout;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1416 p->send_timeout = clcf->send_timeout;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1417 p->send_lowat = clcf->send_lowat;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1418
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1419 u->peer.connection->read->handler = ngx_http_upstream_process_body;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1420 r->write_event_handler = ngx_http_upstream_process_downstream;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1421
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1422 ngx_http_upstream_process_body(u->peer.connection->read);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1423 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1424
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1425
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1426 static void
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1427 ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1428 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1429 ngx_http_upstream_process_non_buffered_body(r->connection->write);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1430 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1431
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1432
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1433 static void
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1434 ngx_http_upstream_process_non_buffered_body(ngx_event_t *ev)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1435 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1436 size_t size;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1437 ssize_t n;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1438 ngx_buf_t *b;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1439 ngx_int_t rc;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1440 ngx_uint_t do_write;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1441 ngx_connection_t *c, *client;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1442 ngx_http_request_t *r;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1443 ngx_http_upstream_t *u;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1444 ngx_http_core_loc_conf_t *clcf;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1445
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1446 c = ev->data;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1447
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1448 if (ev->write) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1449 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1450 "http upstream process non buffered downstream");
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1451 c->log->action = "sending to client";
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1452
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1453 } else {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1454 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1455 "http upstream process non buffered upstream");
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1456 c->log->action = "reading upstream";
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1457 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1458
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1459 if (ev->timedout) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1460 if (ev->write) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1461 c->timedout = 1;
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
1462 ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
1463
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1464 } else {
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
1465 ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1466 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1467 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1468
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1469 r = c->data;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1470 u = r->upstream;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1471 client = r->connection;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1472
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1473 b = &u->buffer;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1474
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1475 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1476
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1477 do_write = ev->write;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1478
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1479 for ( ;; ) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1480
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1481 if (do_write) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1482
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1483 if (u->out_bufs || u->busy_bufs) {
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1484 rc = ngx_http_output_filter(r, u->out_bufs);
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1485
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1486 if (client->destroyed) {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1487 return;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1488 }
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1489
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1490 if (rc == NGX_ERROR) {
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1491 ngx_http_upstream_finalize_request(r, u, 0);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1492 return;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1493 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1494
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1495 ngx_chain_update_chains(&u->free_bufs, &u->busy_bufs,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1496 &u->out_bufs, u->output.tag);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1497 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1498
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1499 if (u->busy_bufs == NULL) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1500
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1501 if (u->length == 0
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1502 || u->peer.connection->read->eof
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1503 || u->peer.connection->read->error)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1504 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1505 ngx_http_upstream_finalize_request(r, u, 0);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1506 return;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1507 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1508
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1509 b->pos = b->start;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1510 b->last = b->start;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1511 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1512 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1513
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1514 size = b->end - b->last;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1515
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1516 if (size > u->length) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1517 size = u->length;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1518 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1519
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1520 if (size && u->peer.connection->read->ready) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1521 n = u->peer.connection->recv(u->peer.connection, b->last, size);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1522
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1523 if (n == NGX_AGAIN) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1524 break;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1525 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1526
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1527 if (n > 0) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1528 if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1529 ngx_http_upstream_finalize_request(r, u, 0);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1530 return;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1531 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1532 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1533
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1534 do_write = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1535
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1536 continue;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1537 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1538
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1539 break;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1540 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1541
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1542 if (client->data == r) {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1543 if (ngx_handle_write_event(client->write, clcf->send_lowat)
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1544 == NGX_ERROR)
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1545 {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1546 ngx_http_upstream_finalize_request(r, u, 0);
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1547 return;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1548 }
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1549 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1550
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1551 if (client->write->active) {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1552 ngx_add_timer(client->write, clcf->send_timeout);
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1553
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1554 } else if (client->write->timer_set) {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1555 ngx_del_timer(client->write);
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1556 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1557
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1558 if (ngx_handle_read_event(u->peer.connection->read, 0) == NGX_ERROR) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1559 ngx_http_upstream_finalize_request(r, u, 0);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1560 return;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1561 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1562
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1563 if (u->peer.connection->read->active) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1564 ngx_add_timer(u->peer.connection->read, u->conf->read_timeout);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1565
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1566 } else if (u->peer.connection->read->timer_set) {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1567 ngx_del_timer(u->peer.connection->read);
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1568 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1569 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1570
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1571
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1572 static ngx_int_t
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1573 ngx_http_upstream_non_buffered_filter_init(void *data)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1574 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1575 return NGX_OK;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1576 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1577
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1578
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1579 static ngx_int_t
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1580 ngx_http_upstream_non_buffered_filter(void *data, ssize_t bytes)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1581 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1582 ngx_http_request_t *r = data;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1583
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1584 ngx_buf_t *b;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1585 ngx_chain_t *cl, **ll;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1586 ngx_http_upstream_t *u;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1587
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1588 u = r->upstream;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1589
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1590 for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1591 ll = &cl->next;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1592 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1593
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1594 cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1595 if (cl == NULL) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1596 return NGX_ERROR;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1597 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1598
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1599 *ll = cl;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1600
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1601 cl->buf->flush = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1602 cl->buf->memory = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1603
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1604 b = &u->buffer;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1605
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1606 cl->buf->pos = b->last;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1607 b->last += bytes;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1608 cl->buf->last = b->last;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1609
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1610 if (u->length == NGX_MAX_SIZE_T_VALUE) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1611 return NGX_OK;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1612 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1613
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1614 u->length -= bytes;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1615
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1616 return NGX_OK;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1617 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1618
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1619
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1620 static void
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1621 ngx_http_upstream_process_downstream(ngx_http_request_t *r)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1622 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1623 ngx_http_upstream_process_body(r->connection->write);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1624 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1625
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1626
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1627 static void
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1628 ngx_http_upstream_process_body(ngx_event_t *ev)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1629 {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1630 ngx_event_pipe_t *p;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1631 ngx_connection_t *c, *downstream;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1632 ngx_http_request_t *r;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1633 ngx_http_upstream_t *u;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1634
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1635 c = ev->data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1636 r = c->data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1637 u = r->upstream;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1638 downstream = r->connection;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1639
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1640 if (ev->write) {
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1641 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1642 "http upstream process downstream");
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1643 c->log->action = "sending to client";
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1644
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1645 } else {
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1646 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1647 "http upstream process upstream");
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1648 c->log->action = "reading upstream";
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1649 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1650
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1651 p = u->pipe;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1652
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1653 if (ev->timedout) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1654 if (ev->write) {
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1655 if (ev->delayed) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1656
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1657 ev->timedout = 0;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1658 ev->delayed = 0;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1659
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1660 if (!ev->ready) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1661 ngx_add_timer(ev, p->send_timeout);
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1662
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1663 if (ngx_handle_write_event(ev, p->send_lowat) == NGX_ERROR)
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1664 {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1665 ngx_http_upstream_finalize_request(r, u, 0);
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1666 return;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1667 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1668
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1669 return;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1670 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1671
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1672 if (ngx_event_pipe(p, ev->write) == NGX_ABORT) {
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1673
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1674 if (downstream->destroyed) {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1675 return;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1676 }
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1677
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1678 ngx_http_upstream_finalize_request(r, u, 0);
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1679 return;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1680 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1681
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1682 } else {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1683 p->downstream_error = 1;
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1684 c->timedout = 1;
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
1685 ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1686 }
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1687
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1688 } else {
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1689 p->upstream_error = 1;
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
1690 ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1691 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1692
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1693 } else {
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1694 if (ev->write && ev->delayed) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1695 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1696 "http downstream delayed");
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1697
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1698 if (ngx_handle_write_event(ev, p->send_lowat) == NGX_ERROR) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1699 return;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1700 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1701
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1702 return;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1703 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1704
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1705 if (ngx_event_pipe(p, ev->write) == NGX_ABORT) {
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1706
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1707 if (downstream->destroyed) {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1708 return;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1709 }
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1710
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1711 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1712 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1713 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1714 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1715
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1716 if (u->peer.connection) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1717
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1718 #if (NGX_HTTP_FILE_CACHE)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1719
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1720 if (p->upstream_done && u->cachable) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1721 if (ngx_http_cache_update(r) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1722 ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1723 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1724 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1725 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1726
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1727 } else if (p->upstream_eof && u->cachable) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1728
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1729 /* TODO: check length & update cache */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1730
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1731 if (ngx_http_cache_update(r) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1732 ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1733 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1734 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1735 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1736 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1737
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1738 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1739
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1740 if (p->upstream_done || p->upstream_eof || p->upstream_error) {
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1741 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1742 "http upstream exit: %p", p->out);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1743 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1744 ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1745 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1746 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1747 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1748 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1749 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1750
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1751 if (p->downstream_error) {
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1752 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1753 "http upstream downstream error");
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1754
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1755 if (!u->cachable && u->peer.connection) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1756 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1757 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1758 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1759 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1760
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1761
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1762 static void
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1763 ngx_http_upstream_dummy_handler(ngx_event_t *wev)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1764 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1765 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1766 "http upstream dummy handler");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1767 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1768
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1769
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1770 static void
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1771 ngx_http_upstream_next(ngx_http_request_t *r, ngx_http_upstream_t *u,
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1772 ngx_uint_t ft_type)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1773 {
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 64
diff changeset
1774 ngx_uint_t status, down;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1775
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1776 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1777 "http next upstream, %xD", ft_type);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1778
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1779 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1780 ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1781 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1782
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 64
diff changeset
1783 if (ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_404) {
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 64
diff changeset
1784 down = 0;
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 64
diff changeset
1785 } else {
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 64
diff changeset
1786 down = 1;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1787 }
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 64
diff changeset
1788
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 64
diff changeset
1789 ngx_event_connect_peer_failed(&u->peer, down);
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 64
diff changeset
1790
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1791 if (ft_type == NGX_HTTP_UPSTREAM_FT_TIMEOUT) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1792 ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ETIMEDOUT,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1793 "upstream timed out");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1794 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1795
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1796 if (u->peer.cached && ft_type == NGX_HTTP_UPSTREAM_FT_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1797 status = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1798
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1799 } else {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1800 switch(ft_type) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1801
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1802 case NGX_HTTP_UPSTREAM_FT_TIMEOUT:
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1803 status = NGX_HTTP_GATEWAY_TIME_OUT;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1804 break;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1805
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1806 case NGX_HTTP_UPSTREAM_FT_HTTP_500:
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1807 status = NGX_HTTP_INTERNAL_SERVER_ERROR;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1808 break;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1809
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1810 case NGX_HTTP_UPSTREAM_FT_HTTP_404:
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1811 status = NGX_HTTP_NOT_FOUND;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1812 break;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1813
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1814 /*
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1815 * NGX_HTTP_UPSTREAM_FT_BUSY_LOCK and NGX_HTTP_UPSTREAM_FT_MAX_WAITING
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1816 * never reach here
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1817 */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1818
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1819 default:
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1820 status = NGX_HTTP_BAD_GATEWAY;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1821 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1822 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1823
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1824 if (r->connection->error) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1825 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1826 NGX_HTTP_CLIENT_CLOSED_REQUEST);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1827 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1828 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1829
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1830 if (status) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1831 u->state->status = status;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1832
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 64
diff changeset
1833 if (u->peer.tries == 0 || !(u->conf->next_upstream & ft_type)) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1834
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1835 #if (NGX_HTTP_CACHE)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1836
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1837 if (u->stale && (u->conf->use_stale & ft_type)) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1838 ngx_http_upstream_finalize_request(r, u,
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 64
diff changeset
1839 ngx_http_send_cached_response(r));
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1840 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1841 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1842
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1843 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1844
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1845 ngx_http_upstream_finalize_request(r, u, status);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1846 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1847 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1848 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1849
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1850 if (u->peer.connection) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1851 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1852 "close http upstream connection: %d",
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1853 u->peer.connection->fd);
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1854 #if (NGX_HTTP_SSL)
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1855 if (u->peer.connection->ssl) {
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1856 ngx_http_upstream_ssl_shutdown(u->peer.connection,
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1857 &u->peer.peers->peer[u->peer.cur_peer]);
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1858 }
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1859 #endif
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1860 ngx_close_connection(u->peer.connection);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1861 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1862
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1863 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1864 if (u->conf->busy_lock && !u->busy_locked) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1865 ngx_http_upstream_busy_lock(p);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1866 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1867 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1868 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1869
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1870 ngx_http_upstream_connect(r, u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1871 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1872
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1873
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1874 static void
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1875 ngx_http_upstream_cleanup(void *data)
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1876 {
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1877 ngx_http_request_t *r = data;
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1878
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1879 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1880 "cleanup http upstream request: \"%V\"", &r->uri);
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1881
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1882 ngx_http_upstream_finalize_request(r, r->upstream, NGX_DONE);
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1883 }
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1884
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1885
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1886 static void
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1887 ngx_http_upstream_finalize_request(ngx_http_request_t *r,
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1888 ngx_http_upstream_t *u, ngx_int_t rc)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1889 {
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1890 ngx_time_t *tp;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1891
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1892 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1893 "finalize http upstream request: %i", rc);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1894
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1895 *u->cleanup = NULL;
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1896
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1897 if (u->state->response_time) {
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1898 tp = ngx_timeofday();
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1899 u->state->response_time = tp->sec * 1000 + tp->msec
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1900 - u->state->response_time;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1901 }
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1902
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1903 u->finalize_request(r, rc);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1904
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1905 if (u->peer.connection) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1906 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1907 "close http upstream connection: %d",
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1908 u->peer.connection->fd);
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1909 #if (NGX_HTTP_SSL)
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1910
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1911 /* TODO: do not shutdown persistent connection */
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1912
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1913 if (u->peer.connection->ssl) {
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1914 ngx_http_upstream_ssl_shutdown(u->peer.connection,
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1915 &u->peer.peers->peer[u->peer.cur_peer]);
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1916 }
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1917 #endif
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1918 ngx_close_connection(u->peer.connection);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1919 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1920
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1921 u->peer.connection = NULL;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1922
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1923 if (u->header_sent && (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE))
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1924 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1925 rc = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1926 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1927
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1928 if (u->pipe && u->pipe->temp_file) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1929 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1930 "http upstream temp fd: %d",
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1931 u->pipe->temp_file->file.fd);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1932 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1933
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1934 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1935 if (u->cache) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1936 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1937 "http upstream cache fd: %d",
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1938 u->cache->ctx.file.fd);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1939 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1940 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1941
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1942 r->log_handler = u->saved_log_handler;
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1943
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1944 if (rc == NGX_DECLINED) {
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1945 return;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1946 }
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1947
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1948 r->connection->log->action = "sending to client";
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1949
178
87699398f955 nginx 0.3.36
Igor Sysoev <http://sysoev.ru>
parents: 172
diff changeset
1950 if (rc == 0 && r == r->main && !r->post_action) {
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1951 rc = ngx_http_send_special(r, NGX_HTTP_LAST);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1952 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1953
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1954 ngx_http_finalize_request(r, rc);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1955 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1956
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1957
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1958 #if (NGX_HTTP_SSL)
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1959
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1960 static void
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1961 ngx_http_upstream_ssl_shutdown(ngx_connection_t *c, ngx_peer_t *peer)
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1962 {
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1963 /* lock peer mutex */
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1964
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1965 if (peer->ssl_session) {
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1966 ngx_ssl_free_session(peer->ssl_session);
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1967 }
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1968
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1969 peer->ssl_session = ngx_ssl_get_session(c);
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1970
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1971 /* unlock peer mutex */
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1972
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1973 /*
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1974 * We send the "close notify" shutdown alert to the upstream only
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1975 * and do not wait its "close notify" shutdown alert.
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1976 * It is acceptable according to the TLS standard.
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1977 */
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1978
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1979 c->ssl->no_wait_shutdown = 1;
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1980
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1981 (void) ngx_ssl_shutdown(c);
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1982 }
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1983
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1984 #endif
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1985
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1986
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1987 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1988 ngx_http_upstream_process_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1989 ngx_uint_t offset)
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1990 {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1991 ngx_table_elt_t **ph;
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1992
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1993 ph = (ngx_table_elt_t **) ((char *) &r->upstream->headers_in + offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1994
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1995 if (*ph == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1996 *ph = h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1997 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1998
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1999 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2000 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2001
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2002
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2003 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2004 ngx_http_upstream_process_multi_header_lines(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2005 ngx_table_elt_t *h, ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2006 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2007 ngx_array_t *pa;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2008 ngx_table_elt_t **ph;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2009
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2010 pa = (ngx_array_t *) ((char *) &r->upstream->headers_in + offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2011
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2012 if (pa->elts == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2013 if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *)) != NGX_OK)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2014 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2015 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2016 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2017 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2018
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2019 ph = ngx_array_push(pa);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2020 if (ph == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2021 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2022 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2023
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2024 *ph = h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2025
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2026 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2027 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2028
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2029
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2030 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2031 ngx_http_upstream_ignore_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2032 ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2033 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2034 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2035 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2036
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2037
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2038 static ngx_int_t
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2039 ngx_http_upstream_process_limit_rate(ngx_http_request_t *r, ngx_table_elt_t *h,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2040 ngx_uint_t offset)
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2041 {
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2042 ngx_int_t n;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2043
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2044 r->upstream->headers_in.x_accel_limit_rate = h;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2045
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2046 n = ngx_atoi(h->value.data, h->value.len);
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2047
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2048 if (n != NGX_ERROR) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2049 r->limit_rate = (size_t) n;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2050 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2051
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2052 return NGX_OK;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2053 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2054
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2055
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2056 static ngx_int_t
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2057 ngx_http_upstream_copy_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2058 ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2059 {
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2060 ngx_table_elt_t *ho, **ph;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2061
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2062 ho = ngx_list_push(&r->headers_out.headers);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2063 if (ho == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2064 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2065 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2066
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2067 *ho = *h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2068
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2069 if (offset) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2070 ph = (ngx_table_elt_t **) ((char *) &r->headers_out + offset);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2071 *ph = ho;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2072 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2073
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2074 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2075 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2076
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2077
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2078 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2079 ngx_http_upstream_conditional_copy_header_line(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2080 ngx_table_elt_t *h, ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2081 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2082 ngx_flag_t *f;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2083 ngx_table_elt_t *ho;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2084
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2085 f = (ngx_flag_t *) ((char *) r->upstream->conf + offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2086
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2087 if (*f == 0) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2088 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2089 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2090
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2091 ho = ngx_list_push(&r->headers_out.headers);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2092 if (ho == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2093 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2094 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2095
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2096 *ho = *h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2097
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2098 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2099 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2100
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2101
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2102 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2103 ngx_http_upstream_copy_multi_header_lines(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2104 ngx_table_elt_t *h, ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2105 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2106 ngx_array_t *pa;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2107 ngx_table_elt_t *ho, **ph;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2108
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2109 pa = (ngx_array_t *) ((char *) &r->headers_out + offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2110
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2111 if (pa->elts == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2112 if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *)) != NGX_OK)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2113 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2114 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2115 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2116 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2117
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2118 ph = ngx_array_push(pa);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2119 if (ph == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2120 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2121 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2122
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2123 ho = ngx_list_push(&r->headers_out.headers);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2124 if (ho == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2125 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2126 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2127
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2128 *ho = *h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2129 *ph = ho;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2130
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2131 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2132 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2133
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2134
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2135 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2136 ngx_http_upstream_copy_content_type(ngx_http_request_t *r, ngx_table_elt_t *h,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2137 ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2138 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2139 r->headers_out.content_type = h->value;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2140
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2141 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2142 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2143
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2144
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2145 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2146 ngx_http_upstream_copy_content_length(ngx_http_request_t *r, ngx_table_elt_t *h,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2147 ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2148 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2149 ngx_table_elt_t *ho;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2150
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2151 ho = ngx_list_push(&r->headers_out.headers);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2152 if (ho == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2153 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2154 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2155
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2156 *ho = *h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2157
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2158 r->headers_out.content_length = ho;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2159 r->headers_out.content_length_n = ngx_atoof(h->value.data, h->value.len);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2160
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2161 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2162 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2163
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2164
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2165 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2166 ngx_http_upstream_rewrite_location(ngx_http_request_t *r, ngx_table_elt_t *h,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2167 ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2168 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2169 ngx_int_t rc;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2170 ngx_table_elt_t *ho;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2171
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2172 ho = ngx_list_push(&r->headers_out.headers);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2173 if (ho == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2174 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2175 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2176
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2177 *ho = *h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2178
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2179 if (r->upstream->rewrite_redirect) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2180 rc = r->upstream->rewrite_redirect(r, ho, 0);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2181
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
2182 if (rc == NGX_DECLINED) {
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
2183 return NGX_OK;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
2184 }
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
2185
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2186 if (rc == NGX_OK) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2187 r->headers_out.location = ho;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2188
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2189 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2190 "rewritten location: \"%V\"", &ho->value);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2191 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2192
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2193 return rc;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2194 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2195
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2196 /*
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2197 * we do not set r->headers_out.location here to avoid the handling
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2198 * the local redirects without a host name by ngx_http_header_filter()
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2199 */
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2200
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2201 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2202 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2203
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2204
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2205 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2206 ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r, ngx_table_elt_t *h,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2207 ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2208 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2209 u_char *p;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2210 ngx_int_t rc;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2211 ngx_table_elt_t *ho;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2212
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2213 ho = ngx_list_push(&r->headers_out.headers);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2214 if (ho == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2215 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2216 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2217
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2218 *ho = *h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2219
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2220 if (r->upstream->rewrite_redirect) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2221
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2222 p = (u_char *) ngx_strstr(ho->value.data, "url=");
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2223
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2224 if (p) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2225 rc = r->upstream->rewrite_redirect(r, ho, p + 4 - ho->value.data);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2226
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2227 } else {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2228 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2229 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2230
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
2231 if (rc == NGX_DECLINED) {
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
2232 return NGX_OK;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
2233 }
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
2234
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2235 #if (NGX_DEBUG)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2236 if (rc == NGX_OK) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2237 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2238 "rewritten refresh: \"%V\"", &ho->value);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2239 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2240 #endif
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2241
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2242 return rc;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2243 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2244
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2245 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2246 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2247
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2248
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2249 #if (NGX_HTTP_GZIP)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2250
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2251 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2252 ngx_http_upstream_copy_content_encoding(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2253 ngx_table_elt_t *h, ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2254 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2255 ngx_table_elt_t *ho;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2256
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2257 ho = ngx_list_push(&r->headers_out.headers);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2258 if (ho == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2259 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2260 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2261
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2262 *ho = *h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2263
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2264 r->headers_out.content_encoding = ho;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2265
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2266 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2267 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2268
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2269 #endif
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2270
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2271
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
2272 static size_t
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
2273 ngx_http_upstream_log_status_getlen(ngx_http_request_t *r, uintptr_t data)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2274 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2275 if (r->upstream) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2276 return r->upstream->states.nelts * (3 + 2);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2277 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2278
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2279 return 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2280 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2281
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2282
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
2283 static u_char *
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
2284 ngx_http_upstream_log_status(ngx_http_request_t *r, u_char *buf,
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
2285 ngx_http_log_op_t *op)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2286 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2287 ngx_uint_t i;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2288 ngx_http_upstream_t *u;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2289 ngx_http_upstream_state_t *state;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2290
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2291 u = r->upstream;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2292
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2293 if (u == NULL || u->states.nelts == 0) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2294 *buf = '-';
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2295 return buf + 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2296 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2297
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2298 i = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2299 state = u->states.elts;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2300
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2301 for ( ;; ) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2302 if (state[i].status == 0) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2303 *buf++ = '-';
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2304
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2305 } else {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2306 buf = ngx_sprintf(buf, "%ui", state[i].status);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2307 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2308
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2309 if (++i == u->states.nelts) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2310 return buf;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2311 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2312
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2313 *buf++ = ',';
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2314 *buf++ = ' ';
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2315 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2316 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2317
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2318
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2319 static size_t
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2320 ngx_http_upstream_log_response_time_getlen(ngx_http_request_t *r,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2321 uintptr_t data)
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2322 {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2323 if (r->upstream) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2324 return r->upstream->states.nelts * (NGX_TIME_T_LEN + 4 + 2);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2325 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2326
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2327 return 1;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2328 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2329
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2330
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2331 static u_char *
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2332 ngx_http_upstream_log_response_time(ngx_http_request_t *r, u_char *buf,
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2333 ngx_http_log_op_t *op)
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2334 {
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2335 ngx_uint_t i;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2336 ngx_http_upstream_t *u;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2337 ngx_http_upstream_state_t *state;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2338
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2339 u = r->upstream;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2340
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2341 if (u == NULL || u->states.nelts == 0) {
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2342 *buf = '-';
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2343 return buf + 1;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2344 }
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2345
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2346 i = 0;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2347 state = u->states.elts;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2348
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2349 for ( ;; ) {
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2350 if (state[i].status == 0) {
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2351 *buf++ = '-';
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2352
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2353 } else {
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2354 buf = ngx_sprintf(buf, "%d.%03d",
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2355 state[i].response_time / 1000,
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2356 state[i].response_time % 1000);
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2357 }
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2358
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2359 if (++i == u->states.nelts) {
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2360 return buf;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2361 }
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2362
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2363 *buf++ = ',';
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2364 *buf++ = ' ';
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2365 }
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2366 }
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2367
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2368
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2369 static u_char *
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2370 ngx_http_upstream_log_error(ngx_http_request_t *r, u_char *buf, size_t len)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2371 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2372 u_char *p;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2373 ngx_http_upstream_t *u;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2374 ngx_peer_connection_t *peer;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2375
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2376 u = r->upstream;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2377 peer = &u->peer;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2378
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2379 p = ngx_snprintf(buf, len,
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2380 ", server: %V, URL: \"%V\","
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2381 " upstream: \"%V%V%s%V\"",
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
2382 &r->server_name,
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2383 &r->unparsed_uri,
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2384 &u->conf->schema,
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2385 &peer->peers->peer[peer->cur_peer].name,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2386 peer->peers->peer[peer->cur_peer].uri_separator,
104
146eff53ab60 nginx 0.2.6
Igor Sysoev <http://sysoev.ru>
parents: 102
diff changeset
2387 &u->uri);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2388 len -= p - buf;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2389 buf = p;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2390
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2391 return ngx_http_log_error_info(r, buf, len);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2392 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2393
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2394
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
2395 static ngx_int_t
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2396 ngx_http_upstream_add_variables(ngx_conf_t *cf)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2397 {
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2398 ngx_http_variable_t *var, *v;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2399 ngx_http_log_op_name_t *op;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2400
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2401 for (v = ngx_http_upstream_vars; v->name.len; v++) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2402 var = ngx_http_add_variable(cf, &v->name, v->flags);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2403 if (var == NULL) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2404 return NGX_ERROR;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2405 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2406
186
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 178
diff changeset
2407 var->get_handler = v->get_handler;
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2408 var->data = v->data;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2409 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2410
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2411 for (op = ngx_http_upstream_log_fmt_ops; op->name.len; op++) { /* void */ }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2412 op->run = NULL;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2413
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2414 for (op = ngx_http_log_fmt_ops; op->run; op++) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2415 if (op->name.len == 0) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2416 op = (ngx_http_log_op_name_t *) op->run;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2417 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2418 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2419
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2420 op->run = (ngx_http_log_op_run_pt) ngx_http_upstream_log_fmt_ops;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2421
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2422 return NGX_OK;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2423 }
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2424
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2425
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2426 static ngx_int_t
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2427 ngx_http_upstream_status_variable(ngx_http_request_t *r,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2428 ngx_http_variable_value_t *v, uintptr_t data)
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2429 {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2430 u_char *p;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2431 size_t len;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2432 ngx_uint_t i;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2433 ngx_http_upstream_t *u;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2434 ngx_http_upstream_state_t *state;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2435
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2436 v->valid = 1;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2437 v->no_cachable = 0;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2438 v->not_found = 0;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2439
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2440 u = r->upstream;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2441
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2442 if (u == NULL || u->states.nelts == 0) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2443 v->not_found = 1;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2444 return NGX_OK;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2445 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2446
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2447 len = u->states.nelts * (3 + 2);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2448
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2449 p = ngx_palloc(r->pool, len);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2450 if (p == NULL) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2451 return NGX_ERROR;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2452 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2453
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2454 v->data = p;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2455
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2456 i = 0;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2457 state = u->states.elts;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2458
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2459 for ( ;; ) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2460 if (state[i].status == 0) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2461 *p++ = '-';
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2462
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2463 } else {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2464 p = ngx_sprintf(p, "%ui", state[i].status);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2465 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2466
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2467 if (++i == u->states.nelts) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2468 break;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2469 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2470
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2471 *p++ = ',';
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2472 *p++ = ' ';
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2473 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2474
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2475 v->len = p - v->data;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2476
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2477 return NGX_OK;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2478 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2479
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2480
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2481 static ngx_int_t
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2482 ngx_http_upstream_response_time_variable(ngx_http_request_t *r,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2483 ngx_http_variable_value_t *v, uintptr_t data)
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2484 {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2485 u_char *p;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2486 size_t len;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2487 ngx_uint_t i;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2488 ngx_http_upstream_t *u;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2489 ngx_http_upstream_state_t *state;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2490
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2491 v->valid = 1;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2492 v->no_cachable = 0;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2493 v->not_found = 0;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2494
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2495 u = r->upstream;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2496
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2497 if (u == NULL || u->states.nelts == 0) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2498 v->not_found = 1;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2499 return NGX_OK;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2500 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2501
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2502 len = u->states.nelts * (NGX_TIME_T_LEN + 4 + 2);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2503
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2504 p = ngx_palloc(r->pool, len);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2505 if (p == NULL) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2506 return NGX_ERROR;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2507 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2508
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2509 v->data = p;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2510
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2511 i = 0;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2512 state = u->states.elts;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2513
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2514 for ( ;; ) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2515 if (state[i].status == 0) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2516 *p++ = '-';
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2517
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2518 } else {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2519 p = ngx_sprintf(p, "%d.%03d",
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2520 state[i].response_time / 1000,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2521 state[i].response_time % 1000);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2522 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2523
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2524 if (++i == u->states.nelts) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2525 break;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2526 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2527
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2528 *p++ = ',';
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2529 *p++ = ' ';
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2530 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2531
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2532 v->len = p - v->data;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2533
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2534 return NGX_OK;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2535 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2536
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2537
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2538 static void *
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2539 ngx_http_upstream_create_main_conf(ngx_conf_t *cf)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2540 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2541 ngx_http_upstream_main_conf_t *umcf;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2542
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2543 umcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_main_conf_t));
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2544 if (umcf == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2545 return NULL;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2546 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2547
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2548 return umcf;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2549 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2550
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2551
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2552 static char *
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2553 ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2554 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2555 ngx_http_upstream_main_conf_t *umcf = conf;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2556
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2557 umcf->headers_in_hash.max_size = 100;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2558 umcf->headers_in_hash.bucket_limit = 1;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2559 umcf->headers_in_hash.bucket_size = sizeof(ngx_http_upstream_header_t);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2560 umcf->headers_in_hash.name = "upstream_headers_in";
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2561
138
8e6d4d96ec4c nginx 0.3.16
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
2562 if (ngx_hash0_init(&umcf->headers_in_hash, cf->pool,
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2563 ngx_http_upstream_headers_in, 0) != NGX_OK)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2564 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2565 return NGX_CONF_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2566 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2567
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2568 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, cf->log, 0,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2569 "http upstream headers_in hash size: %ui, "
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2570 "max buckets per entry: %ui",
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2571 umcf->headers_in_hash.hash_size,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2572 umcf->headers_in_hash.min_buckets);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2573
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2574 return NGX_CONF_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2575 }