1*3da8d17dSfengbojiang(姜凤波)
2*3da8d17dSfengbojiang(姜凤波) /*
3*3da8d17dSfengbojiang(姜凤波) * Copyright (C) Igor Sysoev
4*3da8d17dSfengbojiang(姜凤波) * Copyright (C) Nginx, Inc.
5*3da8d17dSfengbojiang(姜凤波) */
6*3da8d17dSfengbojiang(姜凤波)
7*3da8d17dSfengbojiang(姜凤波)
8*3da8d17dSfengbojiang(姜凤波) #include <ngx_config.h>
9*3da8d17dSfengbojiang(姜凤波) #include <ngx_core.h>
10*3da8d17dSfengbojiang(姜凤波) #include <ngx_http.h>
11*3da8d17dSfengbojiang(姜凤波)
12*3da8d17dSfengbojiang(姜凤波)
13*3da8d17dSfengbojiang(姜凤波) typedef struct {
14*3da8d17dSfengbojiang(姜凤波) ngx_array_t caches; /* ngx_http_file_cache_t * */
15*3da8d17dSfengbojiang(姜凤波) } ngx_http_proxy_main_conf_t;
16*3da8d17dSfengbojiang(姜凤波)
17*3da8d17dSfengbojiang(姜凤波)
18*3da8d17dSfengbojiang(姜凤波) typedef struct ngx_http_proxy_rewrite_s ngx_http_proxy_rewrite_t;
19*3da8d17dSfengbojiang(姜凤波)
20*3da8d17dSfengbojiang(姜凤波) typedef ngx_int_t (*ngx_http_proxy_rewrite_pt)(ngx_http_request_t *r,
21*3da8d17dSfengbojiang(姜凤波) ngx_table_elt_t *h, size_t prefix, size_t len,
22*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_rewrite_t *pr);
23*3da8d17dSfengbojiang(姜凤波)
24*3da8d17dSfengbojiang(姜凤波) struct ngx_http_proxy_rewrite_s {
25*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_rewrite_pt handler;
26*3da8d17dSfengbojiang(姜凤波)
27*3da8d17dSfengbojiang(姜凤波) union {
28*3da8d17dSfengbojiang(姜凤波) ngx_http_complex_value_t complex;
29*3da8d17dSfengbojiang(姜凤波) #if (NGX_PCRE)
30*3da8d17dSfengbojiang(姜凤波) ngx_http_regex_t *regex;
31*3da8d17dSfengbojiang(姜凤波) #endif
32*3da8d17dSfengbojiang(姜凤波) } pattern;
33*3da8d17dSfengbojiang(姜凤波)
34*3da8d17dSfengbojiang(姜凤波) ngx_http_complex_value_t replacement;
35*3da8d17dSfengbojiang(姜凤波) };
36*3da8d17dSfengbojiang(姜凤波)
37*3da8d17dSfengbojiang(姜凤波)
38*3da8d17dSfengbojiang(姜凤波) typedef struct {
39*3da8d17dSfengbojiang(姜凤波) ngx_str_t key_start;
40*3da8d17dSfengbojiang(姜凤波) ngx_str_t schema;
41*3da8d17dSfengbojiang(姜凤波) ngx_str_t host_header;
42*3da8d17dSfengbojiang(姜凤波) ngx_str_t port;
43*3da8d17dSfengbojiang(姜凤波) ngx_str_t uri;
44*3da8d17dSfengbojiang(姜凤波) } ngx_http_proxy_vars_t;
45*3da8d17dSfengbojiang(姜凤波)
46*3da8d17dSfengbojiang(姜凤波)
47*3da8d17dSfengbojiang(姜凤波) typedef struct {
48*3da8d17dSfengbojiang(姜凤波) ngx_array_t *flushes;
49*3da8d17dSfengbojiang(姜凤波) ngx_array_t *lengths;
50*3da8d17dSfengbojiang(姜凤波) ngx_array_t *values;
51*3da8d17dSfengbojiang(姜凤波) ngx_hash_t hash;
52*3da8d17dSfengbojiang(姜凤波) } ngx_http_proxy_headers_t;
53*3da8d17dSfengbojiang(姜凤波)
54*3da8d17dSfengbojiang(姜凤波)
55*3da8d17dSfengbojiang(姜凤波) typedef struct {
56*3da8d17dSfengbojiang(姜凤波) ngx_http_upstream_conf_t upstream;
57*3da8d17dSfengbojiang(姜凤波)
58*3da8d17dSfengbojiang(姜凤波) ngx_array_t *body_flushes;
59*3da8d17dSfengbojiang(姜凤波) ngx_array_t *body_lengths;
60*3da8d17dSfengbojiang(姜凤波) ngx_array_t *body_values;
61*3da8d17dSfengbojiang(姜凤波) ngx_str_t body_source;
62*3da8d17dSfengbojiang(姜凤波)
63*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_headers_t headers;
64*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
65*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_headers_t headers_cache;
66*3da8d17dSfengbojiang(姜凤波) #endif
67*3da8d17dSfengbojiang(姜凤波) ngx_array_t *headers_source;
68*3da8d17dSfengbojiang(姜凤波)
69*3da8d17dSfengbojiang(姜凤波) ngx_array_t *proxy_lengths;
70*3da8d17dSfengbojiang(姜凤波) ngx_array_t *proxy_values;
71*3da8d17dSfengbojiang(姜凤波)
72*3da8d17dSfengbojiang(姜凤波) ngx_array_t *redirects;
73*3da8d17dSfengbojiang(姜凤波) ngx_array_t *cookie_domains;
74*3da8d17dSfengbojiang(姜凤波) ngx_array_t *cookie_paths;
75*3da8d17dSfengbojiang(姜凤波)
76*3da8d17dSfengbojiang(姜凤波) ngx_http_complex_value_t *method;
77*3da8d17dSfengbojiang(姜凤波) ngx_str_t location;
78*3da8d17dSfengbojiang(姜凤波) ngx_str_t url;
79*3da8d17dSfengbojiang(姜凤波)
80*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
81*3da8d17dSfengbojiang(姜凤波) ngx_http_complex_value_t cache_key;
82*3da8d17dSfengbojiang(姜凤波) #endif
83*3da8d17dSfengbojiang(姜凤波)
84*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_vars_t vars;
85*3da8d17dSfengbojiang(姜凤波)
86*3da8d17dSfengbojiang(姜凤波) ngx_flag_t redirect;
87*3da8d17dSfengbojiang(姜凤波)
88*3da8d17dSfengbojiang(姜凤波) ngx_uint_t http_version;
89*3da8d17dSfengbojiang(姜凤波)
90*3da8d17dSfengbojiang(姜凤波) ngx_uint_t headers_hash_max_size;
91*3da8d17dSfengbojiang(姜凤波) ngx_uint_t headers_hash_bucket_size;
92*3da8d17dSfengbojiang(姜凤波)
93*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_SSL)
94*3da8d17dSfengbojiang(姜凤波) ngx_uint_t ssl;
95*3da8d17dSfengbojiang(姜凤波) ngx_uint_t ssl_protocols;
96*3da8d17dSfengbojiang(姜凤波) ngx_str_t ssl_ciphers;
97*3da8d17dSfengbojiang(姜凤波) ngx_uint_t ssl_verify_depth;
98*3da8d17dSfengbojiang(姜凤波) ngx_str_t ssl_trusted_certificate;
99*3da8d17dSfengbojiang(姜凤波) ngx_str_t ssl_crl;
100*3da8d17dSfengbojiang(姜凤波) ngx_str_t ssl_certificate;
101*3da8d17dSfengbojiang(姜凤波) ngx_str_t ssl_certificate_key;
102*3da8d17dSfengbojiang(姜凤波) ngx_array_t *ssl_passwords;
103*3da8d17dSfengbojiang(姜凤波) #endif
104*3da8d17dSfengbojiang(姜凤波)
105*3da8d17dSfengbojiang(姜凤波) #if (NGX_HAVE_FSTACK)
106*3da8d17dSfengbojiang(姜凤波) ngx_flag_t kernel_network_stack;
107*3da8d17dSfengbojiang(姜凤波) #endif
108*3da8d17dSfengbojiang(姜凤波) } ngx_http_proxy_loc_conf_t;
109*3da8d17dSfengbojiang(姜凤波)
110*3da8d17dSfengbojiang(姜凤波)
111*3da8d17dSfengbojiang(姜凤波) typedef struct {
112*3da8d17dSfengbojiang(姜凤波) ngx_http_status_t status;
113*3da8d17dSfengbojiang(姜凤波) ngx_http_chunked_t chunked;
114*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_vars_t vars;
115*3da8d17dSfengbojiang(姜凤波) off_t internal_body_length;
116*3da8d17dSfengbojiang(姜凤波)
117*3da8d17dSfengbojiang(姜凤波) ngx_chain_t *free;
118*3da8d17dSfengbojiang(姜凤波) ngx_chain_t *busy;
119*3da8d17dSfengbojiang(姜凤波)
120*3da8d17dSfengbojiang(姜凤波) unsigned head:1;
121*3da8d17dSfengbojiang(姜凤波) unsigned internal_chunked:1;
122*3da8d17dSfengbojiang(姜凤波) unsigned header_sent:1;
123*3da8d17dSfengbojiang(姜凤波) } ngx_http_proxy_ctx_t;
124*3da8d17dSfengbojiang(姜凤波)
125*3da8d17dSfengbojiang(姜凤波)
126*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_eval(ngx_http_request_t *r,
127*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_ctx_t *ctx, ngx_http_proxy_loc_conf_t *plcf);
128*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
129*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_create_key(ngx_http_request_t *r);
130*3da8d17dSfengbojiang(姜凤波) #endif
131*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_create_request(ngx_http_request_t *r);
132*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_reinit_request(ngx_http_request_t *r);
133*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_body_output_filter(void *data, ngx_chain_t *in);
134*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_process_status_line(ngx_http_request_t *r);
135*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_process_header(ngx_http_request_t *r);
136*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_input_filter_init(void *data);
137*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_copy_filter(ngx_event_pipe_t *p,
138*3da8d17dSfengbojiang(姜凤波) ngx_buf_t *buf);
139*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_chunked_filter(ngx_event_pipe_t *p,
140*3da8d17dSfengbojiang(姜凤波) ngx_buf_t *buf);
141*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_non_buffered_copy_filter(void *data,
142*3da8d17dSfengbojiang(姜凤波) ssize_t bytes);
143*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_non_buffered_chunked_filter(void *data,
144*3da8d17dSfengbojiang(姜凤波) ssize_t bytes);
145*3da8d17dSfengbojiang(姜凤波) static void ngx_http_proxy_abort_request(ngx_http_request_t *r);
146*3da8d17dSfengbojiang(姜凤波) static void ngx_http_proxy_finalize_request(ngx_http_request_t *r,
147*3da8d17dSfengbojiang(姜凤波) ngx_int_t rc);
148*3da8d17dSfengbojiang(姜凤波)
149*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_host_variable(ngx_http_request_t *r,
150*3da8d17dSfengbojiang(姜凤波) ngx_http_variable_value_t *v, uintptr_t data);
151*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_port_variable(ngx_http_request_t *r,
152*3da8d17dSfengbojiang(姜凤波) ngx_http_variable_value_t *v, uintptr_t data);
153*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
154*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t *r,
155*3da8d17dSfengbojiang(姜凤波) ngx_http_variable_value_t *v, uintptr_t data);
156*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
157*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_internal_body_length_variable(ngx_http_request_t *r,
158*3da8d17dSfengbojiang(姜凤波) ngx_http_variable_value_t *v, uintptr_t data);
159*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_internal_chunked_variable(ngx_http_request_t *r,
160*3da8d17dSfengbojiang(姜凤波) ngx_http_variable_value_t *v, uintptr_t data);
161*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_rewrite_redirect(ngx_http_request_t *r,
162*3da8d17dSfengbojiang(姜凤波) ngx_table_elt_t *h, size_t prefix);
163*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_rewrite_cookie(ngx_http_request_t *r,
164*3da8d17dSfengbojiang(姜凤波) ngx_table_elt_t *h);
165*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_rewrite_cookie_value(ngx_http_request_t *r,
166*3da8d17dSfengbojiang(姜凤波) ngx_table_elt_t *h, u_char *value, ngx_array_t *rewrites);
167*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_rewrite(ngx_http_request_t *r,
168*3da8d17dSfengbojiang(姜凤波) ngx_table_elt_t *h, size_t prefix, size_t len, ngx_str_t *replacement);
169*3da8d17dSfengbojiang(姜凤波)
170*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_add_variables(ngx_conf_t *cf);
171*3da8d17dSfengbojiang(姜凤波) static void *ngx_http_proxy_create_main_conf(ngx_conf_t *cf);
172*3da8d17dSfengbojiang(姜凤波) static void *ngx_http_proxy_create_loc_conf(ngx_conf_t *cf);
173*3da8d17dSfengbojiang(姜凤波) static char *ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf,
174*3da8d17dSfengbojiang(姜凤波) void *parent, void *child);
175*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_init_headers(ngx_conf_t *cf,
176*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *conf, ngx_http_proxy_headers_t *headers,
177*3da8d17dSfengbojiang(姜凤波) ngx_keyval_t *default_headers);
178*3da8d17dSfengbojiang(姜凤波)
179*3da8d17dSfengbojiang(姜凤波) static char *ngx_http_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd,
180*3da8d17dSfengbojiang(姜凤波) void *conf);
181*3da8d17dSfengbojiang(姜凤波) static char *ngx_http_proxy_redirect(ngx_conf_t *cf, ngx_command_t *cmd,
182*3da8d17dSfengbojiang(姜凤波) void *conf);
183*3da8d17dSfengbojiang(姜凤波) static char *ngx_http_proxy_cookie_domain(ngx_conf_t *cf, ngx_command_t *cmd,
184*3da8d17dSfengbojiang(姜凤波) void *conf);
185*3da8d17dSfengbojiang(姜凤波) static char *ngx_http_proxy_cookie_path(ngx_conf_t *cf, ngx_command_t *cmd,
186*3da8d17dSfengbojiang(姜凤波) void *conf);
187*3da8d17dSfengbojiang(姜凤波) static char *ngx_http_proxy_store(ngx_conf_t *cf, ngx_command_t *cmd,
188*3da8d17dSfengbojiang(姜凤波) void *conf);
189*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
190*3da8d17dSfengbojiang(姜凤波) static char *ngx_http_proxy_cache(ngx_conf_t *cf, ngx_command_t *cmd,
191*3da8d17dSfengbojiang(姜凤波) void *conf);
192*3da8d17dSfengbojiang(姜凤波) static char *ngx_http_proxy_cache_key(ngx_conf_t *cf, ngx_command_t *cmd,
193*3da8d17dSfengbojiang(姜凤波) void *conf);
194*3da8d17dSfengbojiang(姜凤波) #endif
195*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_SSL)
196*3da8d17dSfengbojiang(姜凤波) static char *ngx_http_proxy_ssl_password_file(ngx_conf_t *cf,
197*3da8d17dSfengbojiang(姜凤波) ngx_command_t *cmd, void *conf);
198*3da8d17dSfengbojiang(姜凤波) #endif
199*3da8d17dSfengbojiang(姜凤波)
200*3da8d17dSfengbojiang(姜凤波) static char *ngx_http_proxy_lowat_check(ngx_conf_t *cf, void *post, void *data);
201*3da8d17dSfengbojiang(姜凤波)
202*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_rewrite_regex(ngx_conf_t *cf,
203*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_rewrite_t *pr, ngx_str_t *regex, ngx_uint_t caseless);
204*3da8d17dSfengbojiang(姜凤波)
205*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_SSL)
206*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_proxy_set_ssl(ngx_conf_t *cf,
207*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *plcf);
208*3da8d17dSfengbojiang(姜凤波) #endif
209*3da8d17dSfengbojiang(姜凤波) static void ngx_http_proxy_set_vars(ngx_url_t *u, ngx_http_proxy_vars_t *v);
210*3da8d17dSfengbojiang(姜凤波)
211*3da8d17dSfengbojiang(姜凤波)
212*3da8d17dSfengbojiang(姜凤波) static ngx_conf_post_t ngx_http_proxy_lowat_post =
213*3da8d17dSfengbojiang(姜凤波) { ngx_http_proxy_lowat_check };
214*3da8d17dSfengbojiang(姜凤波)
215*3da8d17dSfengbojiang(姜凤波)
216*3da8d17dSfengbojiang(姜凤波) static ngx_conf_bitmask_t ngx_http_proxy_next_upstream_masks[] = {
217*3da8d17dSfengbojiang(姜凤波) { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },
218*3da8d17dSfengbojiang(姜凤波) { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },
219*3da8d17dSfengbojiang(姜凤波) { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },
220*3da8d17dSfengbojiang(姜凤波) { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT },
221*3da8d17dSfengbojiang(姜凤波) { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },
222*3da8d17dSfengbojiang(姜凤波) { ngx_string("http_502"), NGX_HTTP_UPSTREAM_FT_HTTP_502 },
223*3da8d17dSfengbojiang(姜凤波) { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },
224*3da8d17dSfengbojiang(姜凤波) { ngx_string("http_504"), NGX_HTTP_UPSTREAM_FT_HTTP_504 },
225*3da8d17dSfengbojiang(姜凤波) { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },
226*3da8d17dSfengbojiang(姜凤波) { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },
227*3da8d17dSfengbojiang(姜凤波) { ngx_string("http_429"), NGX_HTTP_UPSTREAM_FT_HTTP_429 },
228*3da8d17dSfengbojiang(姜凤波) { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING },
229*3da8d17dSfengbojiang(姜凤波) { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },
230*3da8d17dSfengbojiang(姜凤波) { ngx_null_string, 0 }
231*3da8d17dSfengbojiang(姜凤波) };
232*3da8d17dSfengbojiang(姜凤波)
233*3da8d17dSfengbojiang(姜凤波)
234*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_SSL)
235*3da8d17dSfengbojiang(姜凤波)
236*3da8d17dSfengbojiang(姜凤波) static ngx_conf_bitmask_t ngx_http_proxy_ssl_protocols[] = {
237*3da8d17dSfengbojiang(姜凤波) { ngx_string("SSLv2"), NGX_SSL_SSLv2 },
238*3da8d17dSfengbojiang(姜凤波) { ngx_string("SSLv3"), NGX_SSL_SSLv3 },
239*3da8d17dSfengbojiang(姜凤波) { ngx_string("TLSv1"), NGX_SSL_TLSv1 },
240*3da8d17dSfengbojiang(姜凤波) { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },
241*3da8d17dSfengbojiang(姜凤波) { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },
242*3da8d17dSfengbojiang(姜凤波) { ngx_string("TLSv1.3"), NGX_SSL_TLSv1_3 },
243*3da8d17dSfengbojiang(姜凤波) { ngx_null_string, 0 }
244*3da8d17dSfengbojiang(姜凤波) };
245*3da8d17dSfengbojiang(姜凤波)
246*3da8d17dSfengbojiang(姜凤波) #endif
247*3da8d17dSfengbojiang(姜凤波)
248*3da8d17dSfengbojiang(姜凤波)
249*3da8d17dSfengbojiang(姜凤波) static ngx_conf_enum_t ngx_http_proxy_http_version[] = {
250*3da8d17dSfengbojiang(姜凤波) { ngx_string("1.0"), NGX_HTTP_VERSION_10 },
251*3da8d17dSfengbojiang(姜凤波) { ngx_string("1.1"), NGX_HTTP_VERSION_11 },
252*3da8d17dSfengbojiang(姜凤波) { ngx_null_string, 0 }
253*3da8d17dSfengbojiang(姜凤波) };
254*3da8d17dSfengbojiang(姜凤波)
255*3da8d17dSfengbojiang(姜凤波)
256*3da8d17dSfengbojiang(姜凤波) ngx_module_t ngx_http_proxy_module;
257*3da8d17dSfengbojiang(姜凤波)
258*3da8d17dSfengbojiang(姜凤波)
259*3da8d17dSfengbojiang(姜凤波) static ngx_command_t ngx_http_proxy_commands[] = {
260*3da8d17dSfengbojiang(姜凤波)
261*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_pass"),
262*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,
263*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_pass,
264*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
265*3da8d17dSfengbojiang(姜凤波) 0,
266*3da8d17dSfengbojiang(姜凤波) NULL },
267*3da8d17dSfengbojiang(姜凤波)
268*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_redirect"),
269*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
270*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_redirect,
271*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
272*3da8d17dSfengbojiang(姜凤波) 0,
273*3da8d17dSfengbojiang(姜凤波) NULL },
274*3da8d17dSfengbojiang(姜凤波)
275*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_cookie_domain"),
276*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
277*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_cookie_domain,
278*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
279*3da8d17dSfengbojiang(姜凤波) 0,
280*3da8d17dSfengbojiang(姜凤波) NULL },
281*3da8d17dSfengbojiang(姜凤波)
282*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_cookie_path"),
283*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
284*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_cookie_path,
285*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
286*3da8d17dSfengbojiang(姜凤波) 0,
287*3da8d17dSfengbojiang(姜凤波) NULL },
288*3da8d17dSfengbojiang(姜凤波)
289*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_store"),
290*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
291*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_store,
292*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
293*3da8d17dSfengbojiang(姜凤波) 0,
294*3da8d17dSfengbojiang(姜凤波) NULL },
295*3da8d17dSfengbojiang(姜凤波)
296*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_store_access"),
297*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,
298*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_access_slot,
299*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
300*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.store_access),
301*3da8d17dSfengbojiang(姜凤波) NULL },
302*3da8d17dSfengbojiang(姜凤波)
303*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_buffering"),
304*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
305*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_flag_slot,
306*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
307*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.buffering),
308*3da8d17dSfengbojiang(姜凤波) NULL },
309*3da8d17dSfengbojiang(姜凤波)
310*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_request_buffering"),
311*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
312*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_flag_slot,
313*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
314*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.request_buffering),
315*3da8d17dSfengbojiang(姜凤波) NULL },
316*3da8d17dSfengbojiang(姜凤波)
317*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_ignore_client_abort"),
318*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
319*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_flag_slot,
320*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
321*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.ignore_client_abort),
322*3da8d17dSfengbojiang(姜凤波) NULL },
323*3da8d17dSfengbojiang(姜凤波)
324*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_bind"),
325*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
326*3da8d17dSfengbojiang(姜凤波) ngx_http_upstream_bind_set_slot,
327*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
328*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.local),
329*3da8d17dSfengbojiang(姜凤波) NULL },
330*3da8d17dSfengbojiang(姜凤波)
331*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_socket_keepalive"),
332*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
333*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_flag_slot,
334*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
335*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.socket_keepalive),
336*3da8d17dSfengbojiang(姜凤波) NULL },
337*3da8d17dSfengbojiang(姜凤波)
338*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_connect_timeout"),
339*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
340*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_msec_slot,
341*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
342*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.connect_timeout),
343*3da8d17dSfengbojiang(姜凤波) NULL },
344*3da8d17dSfengbojiang(姜凤波)
345*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_send_timeout"),
346*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
347*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_msec_slot,
348*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
349*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.send_timeout),
350*3da8d17dSfengbojiang(姜凤波) NULL },
351*3da8d17dSfengbojiang(姜凤波)
352*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_send_lowat"),
353*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
354*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_size_slot,
355*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
356*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.send_lowat),
357*3da8d17dSfengbojiang(姜凤波) &ngx_http_proxy_lowat_post },
358*3da8d17dSfengbojiang(姜凤波)
359*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_intercept_errors"),
360*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
361*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_flag_slot,
362*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
363*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.intercept_errors),
364*3da8d17dSfengbojiang(姜凤波) NULL },
365*3da8d17dSfengbojiang(姜凤波)
366*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_set_header"),
367*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
368*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_keyval_slot,
369*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
370*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, headers_source),
371*3da8d17dSfengbojiang(姜凤波) NULL },
372*3da8d17dSfengbojiang(姜凤波)
373*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_headers_hash_max_size"),
374*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
375*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_num_slot,
376*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
377*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, headers_hash_max_size),
378*3da8d17dSfengbojiang(姜凤波) NULL },
379*3da8d17dSfengbojiang(姜凤波)
380*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_headers_hash_bucket_size"),
381*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
382*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_num_slot,
383*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
384*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, headers_hash_bucket_size),
385*3da8d17dSfengbojiang(姜凤波) NULL },
386*3da8d17dSfengbojiang(姜凤波)
387*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_set_body"),
388*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
389*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_str_slot,
390*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
391*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, body_source),
392*3da8d17dSfengbojiang(姜凤波) NULL },
393*3da8d17dSfengbojiang(姜凤波)
394*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_method"),
395*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
396*3da8d17dSfengbojiang(姜凤波) ngx_http_set_complex_value_slot,
397*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
398*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, method),
399*3da8d17dSfengbojiang(姜凤波) NULL },
400*3da8d17dSfengbojiang(姜凤波)
401*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_pass_request_headers"),
402*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
403*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_flag_slot,
404*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
405*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_request_headers),
406*3da8d17dSfengbojiang(姜凤波) NULL },
407*3da8d17dSfengbojiang(姜凤波)
408*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_pass_request_body"),
409*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
410*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_flag_slot,
411*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
412*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_request_body),
413*3da8d17dSfengbojiang(姜凤波) NULL },
414*3da8d17dSfengbojiang(姜凤波)
415*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_buffer_size"),
416*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
417*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_size_slot,
418*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
419*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.buffer_size),
420*3da8d17dSfengbojiang(姜凤波) NULL },
421*3da8d17dSfengbojiang(姜凤波)
422*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_read_timeout"),
423*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
424*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_msec_slot,
425*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
426*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.read_timeout),
427*3da8d17dSfengbojiang(姜凤波) NULL },
428*3da8d17dSfengbojiang(姜凤波)
429*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_buffers"),
430*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
431*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_bufs_slot,
432*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
433*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.bufs),
434*3da8d17dSfengbojiang(姜凤波) NULL },
435*3da8d17dSfengbojiang(姜凤波)
436*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_busy_buffers_size"),
437*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
438*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_size_slot,
439*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
440*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.busy_buffers_size_conf),
441*3da8d17dSfengbojiang(姜凤波) NULL },
442*3da8d17dSfengbojiang(姜凤波)
443*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_force_ranges"),
444*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
445*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_flag_slot,
446*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
447*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.force_ranges),
448*3da8d17dSfengbojiang(姜凤波) NULL },
449*3da8d17dSfengbojiang(姜凤波)
450*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_limit_rate"),
451*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
452*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_size_slot,
453*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
454*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.limit_rate),
455*3da8d17dSfengbojiang(姜凤波) NULL },
456*3da8d17dSfengbojiang(姜凤波)
457*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
458*3da8d17dSfengbojiang(姜凤波)
459*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_cache"),
460*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
461*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_cache,
462*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
463*3da8d17dSfengbojiang(姜凤波) 0,
464*3da8d17dSfengbojiang(姜凤波) NULL },
465*3da8d17dSfengbojiang(姜凤波)
466*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_cache_key"),
467*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
468*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_cache_key,
469*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
470*3da8d17dSfengbojiang(姜凤波) 0,
471*3da8d17dSfengbojiang(姜凤波) NULL },
472*3da8d17dSfengbojiang(姜凤波)
473*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_cache_path"),
474*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,
475*3da8d17dSfengbojiang(姜凤波) ngx_http_file_cache_set_slot,
476*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF_OFFSET,
477*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_main_conf_t, caches),
478*3da8d17dSfengbojiang(姜凤波) &ngx_http_proxy_module },
479*3da8d17dSfengbojiang(姜凤波)
480*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_cache_bypass"),
481*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
482*3da8d17dSfengbojiang(姜凤波) ngx_http_set_predicate_slot,
483*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
484*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_bypass),
485*3da8d17dSfengbojiang(姜凤波) NULL },
486*3da8d17dSfengbojiang(姜凤波)
487*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_no_cache"),
488*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
489*3da8d17dSfengbojiang(姜凤波) ngx_http_set_predicate_slot,
490*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
491*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.no_cache),
492*3da8d17dSfengbojiang(姜凤波) NULL },
493*3da8d17dSfengbojiang(姜凤波)
494*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_cache_valid"),
495*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
496*3da8d17dSfengbojiang(姜凤波) ngx_http_file_cache_valid_set_slot,
497*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
498*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_valid),
499*3da8d17dSfengbojiang(姜凤波) NULL },
500*3da8d17dSfengbojiang(姜凤波)
501*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_cache_min_uses"),
502*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
503*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_num_slot,
504*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
505*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_min_uses),
506*3da8d17dSfengbojiang(姜凤波) NULL },
507*3da8d17dSfengbojiang(姜凤波)
508*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_cache_max_range_offset"),
509*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
510*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_off_slot,
511*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
512*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_max_range_offset),
513*3da8d17dSfengbojiang(姜凤波) NULL },
514*3da8d17dSfengbojiang(姜凤波)
515*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_cache_use_stale"),
516*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
517*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_bitmask_slot,
518*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
519*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_use_stale),
520*3da8d17dSfengbojiang(姜凤波) &ngx_http_proxy_next_upstream_masks },
521*3da8d17dSfengbojiang(姜凤波)
522*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_cache_methods"),
523*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
524*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_bitmask_slot,
525*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
526*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_methods),
527*3da8d17dSfengbojiang(姜凤波) &ngx_http_upstream_cache_method_mask },
528*3da8d17dSfengbojiang(姜凤波)
529*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_cache_lock"),
530*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
531*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_flag_slot,
532*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
533*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_lock),
534*3da8d17dSfengbojiang(姜凤波) NULL },
535*3da8d17dSfengbojiang(姜凤波)
536*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_cache_lock_timeout"),
537*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
538*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_msec_slot,
539*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
540*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_lock_timeout),
541*3da8d17dSfengbojiang(姜凤波) NULL },
542*3da8d17dSfengbojiang(姜凤波)
543*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_cache_lock_age"),
544*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
545*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_msec_slot,
546*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
547*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_lock_age),
548*3da8d17dSfengbojiang(姜凤波) NULL },
549*3da8d17dSfengbojiang(姜凤波)
550*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_cache_revalidate"),
551*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
552*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_flag_slot,
553*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
554*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_revalidate),
555*3da8d17dSfengbojiang(姜凤波) NULL },
556*3da8d17dSfengbojiang(姜凤波)
557*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_cache_convert_head"),
558*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
559*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_flag_slot,
560*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
561*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_convert_head),
562*3da8d17dSfengbojiang(姜凤波) NULL },
563*3da8d17dSfengbojiang(姜凤波)
564*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_cache_background_update"),
565*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
566*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_flag_slot,
567*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
568*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_background_update),
569*3da8d17dSfengbojiang(姜凤波) NULL },
570*3da8d17dSfengbojiang(姜凤波)
571*3da8d17dSfengbojiang(姜凤波) #endif
572*3da8d17dSfengbojiang(姜凤波)
573*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_temp_path"),
574*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,
575*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_path_slot,
576*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
577*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.temp_path),
578*3da8d17dSfengbojiang(姜凤波) NULL },
579*3da8d17dSfengbojiang(姜凤波)
580*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_max_temp_file_size"),
581*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
582*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_size_slot,
583*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
584*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.max_temp_file_size_conf),
585*3da8d17dSfengbojiang(姜凤波) NULL },
586*3da8d17dSfengbojiang(姜凤波)
587*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_temp_file_write_size"),
588*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
589*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_size_slot,
590*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
591*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.temp_file_write_size_conf),
592*3da8d17dSfengbojiang(姜凤波) NULL },
593*3da8d17dSfengbojiang(姜凤波)
594*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_next_upstream"),
595*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
596*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_bitmask_slot,
597*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
598*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream),
599*3da8d17dSfengbojiang(姜凤波) &ngx_http_proxy_next_upstream_masks },
600*3da8d17dSfengbojiang(姜凤波)
601*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_next_upstream_tries"),
602*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
603*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_num_slot,
604*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
605*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream_tries),
606*3da8d17dSfengbojiang(姜凤波) NULL },
607*3da8d17dSfengbojiang(姜凤波)
608*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_next_upstream_timeout"),
609*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
610*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_msec_slot,
611*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
612*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream_timeout),
613*3da8d17dSfengbojiang(姜凤波) NULL },
614*3da8d17dSfengbojiang(姜凤波)
615*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_pass_header"),
616*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
617*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_str_array_slot,
618*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
619*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_headers),
620*3da8d17dSfengbojiang(姜凤波) NULL },
621*3da8d17dSfengbojiang(姜凤波)
622*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_hide_header"),
623*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
624*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_str_array_slot,
625*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
626*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.hide_headers),
627*3da8d17dSfengbojiang(姜凤波) NULL },
628*3da8d17dSfengbojiang(姜凤波)
629*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_ignore_headers"),
630*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
631*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_bitmask_slot,
632*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
633*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.ignore_headers),
634*3da8d17dSfengbojiang(姜凤波) &ngx_http_upstream_ignore_headers_masks },
635*3da8d17dSfengbojiang(姜凤波)
636*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_http_version"),
637*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
638*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_enum_slot,
639*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
640*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, http_version),
641*3da8d17dSfengbojiang(姜凤波) &ngx_http_proxy_http_version },
642*3da8d17dSfengbojiang(姜凤波)
643*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_SSL)
644*3da8d17dSfengbojiang(姜凤波)
645*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_ssl_session_reuse"),
646*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
647*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_flag_slot,
648*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
649*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_session_reuse),
650*3da8d17dSfengbojiang(姜凤波) NULL },
651*3da8d17dSfengbojiang(姜凤波)
652*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_ssl_protocols"),
653*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
654*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_bitmask_slot,
655*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
656*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, ssl_protocols),
657*3da8d17dSfengbojiang(姜凤波) &ngx_http_proxy_ssl_protocols },
658*3da8d17dSfengbojiang(姜凤波)
659*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_ssl_ciphers"),
660*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
661*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_str_slot,
662*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
663*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, ssl_ciphers),
664*3da8d17dSfengbojiang(姜凤波) NULL },
665*3da8d17dSfengbojiang(姜凤波)
666*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_ssl_name"),
667*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
668*3da8d17dSfengbojiang(姜凤波) ngx_http_set_complex_value_slot,
669*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
670*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_name),
671*3da8d17dSfengbojiang(姜凤波) NULL },
672*3da8d17dSfengbojiang(姜凤波)
673*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_ssl_server_name"),
674*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
675*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_flag_slot,
676*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
677*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_server_name),
678*3da8d17dSfengbojiang(姜凤波) NULL },
679*3da8d17dSfengbojiang(姜凤波)
680*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_ssl_verify"),
681*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
682*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_flag_slot,
683*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
684*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_verify),
685*3da8d17dSfengbojiang(姜凤波) NULL },
686*3da8d17dSfengbojiang(姜凤波)
687*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_ssl_verify_depth"),
688*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
689*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_num_slot,
690*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
691*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, ssl_verify_depth),
692*3da8d17dSfengbojiang(姜凤波) NULL },
693*3da8d17dSfengbojiang(姜凤波)
694*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_ssl_trusted_certificate"),
695*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
696*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_str_slot,
697*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
698*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, ssl_trusted_certificate),
699*3da8d17dSfengbojiang(姜凤波) NULL },
700*3da8d17dSfengbojiang(姜凤波)
701*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_ssl_crl"),
702*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
703*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_str_slot,
704*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
705*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, ssl_crl),
706*3da8d17dSfengbojiang(姜凤波) NULL },
707*3da8d17dSfengbojiang(姜凤波)
708*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_ssl_certificate"),
709*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
710*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_str_slot,
711*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
712*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, ssl_certificate),
713*3da8d17dSfengbojiang(姜凤波) NULL },
714*3da8d17dSfengbojiang(姜凤波)
715*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_ssl_certificate_key"),
716*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
717*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_str_slot,
718*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
719*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, ssl_certificate_key),
720*3da8d17dSfengbojiang(姜凤波) NULL },
721*3da8d17dSfengbojiang(姜凤波)
722*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_ssl_password_file"),
723*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
724*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_ssl_password_file,
725*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
726*3da8d17dSfengbojiang(姜凤波) 0,
727*3da8d17dSfengbojiang(姜凤波) NULL },
728*3da8d17dSfengbojiang(姜凤波)
729*3da8d17dSfengbojiang(姜凤波) #endif
730*3da8d17dSfengbojiang(姜凤波)
731*3da8d17dSfengbojiang(姜凤波) #if (NGX_HAVE_FSTACK)
732*3da8d17dSfengbojiang(姜凤波)
733*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_kernel_network_stack"),
734*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
735*3da8d17dSfengbojiang(姜凤波) ngx_conf_set_flag_slot,
736*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_LOC_CONF_OFFSET,
737*3da8d17dSfengbojiang(姜凤波) offsetof(ngx_http_proxy_loc_conf_t, kernel_network_stack),
738*3da8d17dSfengbojiang(姜凤波) NULL },
739*3da8d17dSfengbojiang(姜凤波)
740*3da8d17dSfengbojiang(姜凤波) #endif
741*3da8d17dSfengbojiang(姜凤波)
742*3da8d17dSfengbojiang(姜凤波) ngx_null_command
743*3da8d17dSfengbojiang(姜凤波) };
744*3da8d17dSfengbojiang(姜凤波)
745*3da8d17dSfengbojiang(姜凤波)
746*3da8d17dSfengbojiang(姜凤波) static ngx_http_module_t ngx_http_proxy_module_ctx = {
747*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_add_variables, /* preconfiguration */
748*3da8d17dSfengbojiang(姜凤波) NULL, /* postconfiguration */
749*3da8d17dSfengbojiang(姜凤波)
750*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_create_main_conf, /* create main configuration */
751*3da8d17dSfengbojiang(姜凤波) NULL, /* init main configuration */
752*3da8d17dSfengbojiang(姜凤波)
753*3da8d17dSfengbojiang(姜凤波) NULL, /* create server configuration */
754*3da8d17dSfengbojiang(姜凤波) NULL, /* merge server configuration */
755*3da8d17dSfengbojiang(姜凤波)
756*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_create_loc_conf, /* create location configuration */
757*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_merge_loc_conf /* merge location configuration */
758*3da8d17dSfengbojiang(姜凤波) };
759*3da8d17dSfengbojiang(姜凤波)
760*3da8d17dSfengbojiang(姜凤波)
761*3da8d17dSfengbojiang(姜凤波) ngx_module_t ngx_http_proxy_module = {
762*3da8d17dSfengbojiang(姜凤波) NGX_MODULE_V1,
763*3da8d17dSfengbojiang(姜凤波) &ngx_http_proxy_module_ctx, /* module context */
764*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_commands, /* module directives */
765*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_MODULE, /* module type */
766*3da8d17dSfengbojiang(姜凤波) NULL, /* init master */
767*3da8d17dSfengbojiang(姜凤波) NULL, /* init module */
768*3da8d17dSfengbojiang(姜凤波) NULL, /* init process */
769*3da8d17dSfengbojiang(姜凤波) NULL, /* init thread */
770*3da8d17dSfengbojiang(姜凤波) NULL, /* exit thread */
771*3da8d17dSfengbojiang(姜凤波) NULL, /* exit process */
772*3da8d17dSfengbojiang(姜凤波) NULL, /* exit master */
773*3da8d17dSfengbojiang(姜凤波) NGX_MODULE_V1_PADDING
774*3da8d17dSfengbojiang(姜凤波) };
775*3da8d17dSfengbojiang(姜凤波)
776*3da8d17dSfengbojiang(姜凤波)
777*3da8d17dSfengbojiang(姜凤波) static char ngx_http_proxy_version[] = " HTTP/1.0" CRLF;
778*3da8d17dSfengbojiang(姜凤波) static char ngx_http_proxy_version_11[] = " HTTP/1.1" CRLF;
779*3da8d17dSfengbojiang(姜凤波)
780*3da8d17dSfengbojiang(姜凤波)
781*3da8d17dSfengbojiang(姜凤波) static ngx_keyval_t ngx_http_proxy_headers[] = {
782*3da8d17dSfengbojiang(姜凤波) { ngx_string("Host"), ngx_string("$proxy_host") },
783*3da8d17dSfengbojiang(姜凤波) { ngx_string("Connection"), ngx_string("close") },
784*3da8d17dSfengbojiang(姜凤波) { ngx_string("Content-Length"), ngx_string("$proxy_internal_body_length") },
785*3da8d17dSfengbojiang(姜凤波) { ngx_string("Transfer-Encoding"), ngx_string("$proxy_internal_chunked") },
786*3da8d17dSfengbojiang(姜凤波) { ngx_string("TE"), ngx_string("") },
787*3da8d17dSfengbojiang(姜凤波) { ngx_string("Keep-Alive"), ngx_string("") },
788*3da8d17dSfengbojiang(姜凤波) { ngx_string("Expect"), ngx_string("") },
789*3da8d17dSfengbojiang(姜凤波) { ngx_string("Upgrade"), ngx_string("") },
790*3da8d17dSfengbojiang(姜凤波) { ngx_null_string, ngx_null_string }
791*3da8d17dSfengbojiang(姜凤波) };
792*3da8d17dSfengbojiang(姜凤波)
793*3da8d17dSfengbojiang(姜凤波)
794*3da8d17dSfengbojiang(姜凤波) static ngx_str_t ngx_http_proxy_hide_headers[] = {
795*3da8d17dSfengbojiang(姜凤波) ngx_string("Date"),
796*3da8d17dSfengbojiang(姜凤波) ngx_string("Server"),
797*3da8d17dSfengbojiang(姜凤波) ngx_string("X-Pad"),
798*3da8d17dSfengbojiang(姜凤波) ngx_string("X-Accel-Expires"),
799*3da8d17dSfengbojiang(姜凤波) ngx_string("X-Accel-Redirect"),
800*3da8d17dSfengbojiang(姜凤波) ngx_string("X-Accel-Limit-Rate"),
801*3da8d17dSfengbojiang(姜凤波) ngx_string("X-Accel-Buffering"),
802*3da8d17dSfengbojiang(姜凤波) ngx_string("X-Accel-Charset"),
803*3da8d17dSfengbojiang(姜凤波) ngx_null_string
804*3da8d17dSfengbojiang(姜凤波) };
805*3da8d17dSfengbojiang(姜凤波)
806*3da8d17dSfengbojiang(姜凤波)
807*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
808*3da8d17dSfengbojiang(姜凤波)
809*3da8d17dSfengbojiang(姜凤波) static ngx_keyval_t ngx_http_proxy_cache_headers[] = {
810*3da8d17dSfengbojiang(姜凤波) { ngx_string("Host"), ngx_string("$proxy_host") },
811*3da8d17dSfengbojiang(姜凤波) { ngx_string("Connection"), ngx_string("close") },
812*3da8d17dSfengbojiang(姜凤波) { ngx_string("Content-Length"), ngx_string("$proxy_internal_body_length") },
813*3da8d17dSfengbojiang(姜凤波) { ngx_string("Transfer-Encoding"), ngx_string("$proxy_internal_chunked") },
814*3da8d17dSfengbojiang(姜凤波) { ngx_string("TE"), ngx_string("") },
815*3da8d17dSfengbojiang(姜凤波) { ngx_string("Keep-Alive"), ngx_string("") },
816*3da8d17dSfengbojiang(姜凤波) { ngx_string("Expect"), ngx_string("") },
817*3da8d17dSfengbojiang(姜凤波) { ngx_string("Upgrade"), ngx_string("") },
818*3da8d17dSfengbojiang(姜凤波) { ngx_string("If-Modified-Since"),
819*3da8d17dSfengbojiang(姜凤波) ngx_string("$upstream_cache_last_modified") },
820*3da8d17dSfengbojiang(姜凤波) { ngx_string("If-Unmodified-Since"), ngx_string("") },
821*3da8d17dSfengbojiang(姜凤波) { ngx_string("If-None-Match"), ngx_string("$upstream_cache_etag") },
822*3da8d17dSfengbojiang(姜凤波) { ngx_string("If-Match"), ngx_string("") },
823*3da8d17dSfengbojiang(姜凤波) { ngx_string("Range"), ngx_string("") },
824*3da8d17dSfengbojiang(姜凤波) { ngx_string("If-Range"), ngx_string("") },
825*3da8d17dSfengbojiang(姜凤波) { ngx_null_string, ngx_null_string }
826*3da8d17dSfengbojiang(姜凤波) };
827*3da8d17dSfengbojiang(姜凤波)
828*3da8d17dSfengbojiang(姜凤波) #endif
829*3da8d17dSfengbojiang(姜凤波)
830*3da8d17dSfengbojiang(姜凤波)
831*3da8d17dSfengbojiang(姜凤波) static ngx_http_variable_t ngx_http_proxy_vars[] = {
832*3da8d17dSfengbojiang(姜凤波)
833*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_host"), NULL, ngx_http_proxy_host_variable, 0,
834*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },
835*3da8d17dSfengbojiang(姜凤波)
836*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_port"), NULL, ngx_http_proxy_port_variable, 0,
837*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },
838*3da8d17dSfengbojiang(姜凤波)
839*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_add_x_forwarded_for"), NULL,
840*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_add_x_forwarded_for_variable, 0, NGX_HTTP_VAR_NOHASH, 0 },
841*3da8d17dSfengbojiang(姜凤波)
842*3da8d17dSfengbojiang(姜凤波) #if 0
843*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_add_via"), NULL, NULL, 0, NGX_HTTP_VAR_NOHASH, 0 },
844*3da8d17dSfengbojiang(姜凤波) #endif
845*3da8d17dSfengbojiang(姜凤波)
846*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_internal_body_length"), NULL,
847*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_internal_body_length_variable, 0,
848*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },
849*3da8d17dSfengbojiang(姜凤波)
850*3da8d17dSfengbojiang(姜凤波) { ngx_string("proxy_internal_chunked"), NULL,
851*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_internal_chunked_variable, 0,
852*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },
853*3da8d17dSfengbojiang(姜凤波)
854*3da8d17dSfengbojiang(姜凤波) ngx_http_null_variable
855*3da8d17dSfengbojiang(姜凤波) };
856*3da8d17dSfengbojiang(姜凤波)
857*3da8d17dSfengbojiang(姜凤波)
858*3da8d17dSfengbojiang(姜凤波) static ngx_path_init_t ngx_http_proxy_temp_path = {
859*3da8d17dSfengbojiang(姜凤波) ngx_string(NGX_HTTP_PROXY_TEMP_PATH), { 1, 2, 0 }
860*3da8d17dSfengbojiang(姜凤波) };
861*3da8d17dSfengbojiang(姜凤波)
862*3da8d17dSfengbojiang(姜凤波)
863*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_handler(ngx_http_request_t * r)864*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_handler(ngx_http_request_t *r)
865*3da8d17dSfengbojiang(姜凤波) {
866*3da8d17dSfengbojiang(姜凤波) ngx_int_t rc;
867*3da8d17dSfengbojiang(姜凤波) ngx_http_upstream_t *u;
868*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_ctx_t *ctx;
869*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *plcf;
870*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
871*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_main_conf_t *pmcf;
872*3da8d17dSfengbojiang(姜凤波) #endif
873*3da8d17dSfengbojiang(姜凤波)
874*3da8d17dSfengbojiang(姜凤波) if (ngx_http_upstream_create(r) != NGX_OK) {
875*3da8d17dSfengbojiang(姜凤波) return NGX_HTTP_INTERNAL_SERVER_ERROR;
876*3da8d17dSfengbojiang(姜凤波) }
877*3da8d17dSfengbojiang(姜凤波)
878*3da8d17dSfengbojiang(姜凤波) ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_proxy_ctx_t));
879*3da8d17dSfengbojiang(姜凤波) if (ctx == NULL) {
880*3da8d17dSfengbojiang(姜凤波) return NGX_HTTP_INTERNAL_SERVER_ERROR;
881*3da8d17dSfengbojiang(姜凤波) }
882*3da8d17dSfengbojiang(姜凤波)
883*3da8d17dSfengbojiang(姜凤波) ngx_http_set_ctx(r, ctx, ngx_http_proxy_module);
884*3da8d17dSfengbojiang(姜凤波)
885*3da8d17dSfengbojiang(姜凤波) plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);
886*3da8d17dSfengbojiang(姜凤波)
887*3da8d17dSfengbojiang(姜凤波) u = r->upstream;
888*3da8d17dSfengbojiang(姜凤波)
889*3da8d17dSfengbojiang(姜凤波) if (plcf->proxy_lengths == NULL) {
890*3da8d17dSfengbojiang(姜凤波) ctx->vars = plcf->vars;
891*3da8d17dSfengbojiang(姜凤波) u->schema = plcf->vars.schema;
892*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_SSL)
893*3da8d17dSfengbojiang(姜凤波) u->ssl = (plcf->upstream.ssl != NULL);
894*3da8d17dSfengbojiang(姜凤波) #endif
895*3da8d17dSfengbojiang(姜凤波)
896*3da8d17dSfengbojiang(姜凤波) } else {
897*3da8d17dSfengbojiang(姜凤波) if (ngx_http_proxy_eval(r, ctx, plcf) != NGX_OK) {
898*3da8d17dSfengbojiang(姜凤波) return NGX_HTTP_INTERNAL_SERVER_ERROR;
899*3da8d17dSfengbojiang(姜凤波) }
900*3da8d17dSfengbojiang(姜凤波) }
901*3da8d17dSfengbojiang(姜凤波)
902*3da8d17dSfengbojiang(姜凤波) u->output.tag = (ngx_buf_tag_t) &ngx_http_proxy_module;
903*3da8d17dSfengbojiang(姜凤波)
904*3da8d17dSfengbojiang(姜凤波) u->conf = &plcf->upstream;
905*3da8d17dSfengbojiang(姜凤波)
906*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
907*3da8d17dSfengbojiang(姜凤波) pmcf = ngx_http_get_module_main_conf(r, ngx_http_proxy_module);
908*3da8d17dSfengbojiang(姜凤波)
909*3da8d17dSfengbojiang(姜凤波) u->caches = &pmcf->caches;
910*3da8d17dSfengbojiang(姜凤波) u->create_key = ngx_http_proxy_create_key;
911*3da8d17dSfengbojiang(姜凤波) #endif
912*3da8d17dSfengbojiang(姜凤波)
913*3da8d17dSfengbojiang(姜凤波) u->create_request = ngx_http_proxy_create_request;
914*3da8d17dSfengbojiang(姜凤波) u->reinit_request = ngx_http_proxy_reinit_request;
915*3da8d17dSfengbojiang(姜凤波) u->process_header = ngx_http_proxy_process_status_line;
916*3da8d17dSfengbojiang(姜凤波) u->abort_request = ngx_http_proxy_abort_request;
917*3da8d17dSfengbojiang(姜凤波) u->finalize_request = ngx_http_proxy_finalize_request;
918*3da8d17dSfengbojiang(姜凤波) r->state = 0;
919*3da8d17dSfengbojiang(姜凤波)
920*3da8d17dSfengbojiang(姜凤波) if (plcf->redirects) {
921*3da8d17dSfengbojiang(姜凤波) u->rewrite_redirect = ngx_http_proxy_rewrite_redirect;
922*3da8d17dSfengbojiang(姜凤波) }
923*3da8d17dSfengbojiang(姜凤波)
924*3da8d17dSfengbojiang(姜凤波) if (plcf->cookie_domains || plcf->cookie_paths) {
925*3da8d17dSfengbojiang(姜凤波) u->rewrite_cookie = ngx_http_proxy_rewrite_cookie;
926*3da8d17dSfengbojiang(姜凤波) }
927*3da8d17dSfengbojiang(姜凤波)
928*3da8d17dSfengbojiang(姜凤波) u->buffering = plcf->upstream.buffering;
929*3da8d17dSfengbojiang(姜凤波)
930*3da8d17dSfengbojiang(姜凤波) u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t));
931*3da8d17dSfengbojiang(姜凤波) if (u->pipe == NULL) {
932*3da8d17dSfengbojiang(姜凤波) return NGX_HTTP_INTERNAL_SERVER_ERROR;
933*3da8d17dSfengbojiang(姜凤波) }
934*3da8d17dSfengbojiang(姜凤波)
935*3da8d17dSfengbojiang(姜凤波) u->pipe->input_filter = ngx_http_proxy_copy_filter;
936*3da8d17dSfengbojiang(姜凤波) u->pipe->input_ctx = r;
937*3da8d17dSfengbojiang(姜凤波)
938*3da8d17dSfengbojiang(姜凤波) u->input_filter_init = ngx_http_proxy_input_filter_init;
939*3da8d17dSfengbojiang(姜凤波) u->input_filter = ngx_http_proxy_non_buffered_copy_filter;
940*3da8d17dSfengbojiang(姜凤波) u->input_filter_ctx = r;
941*3da8d17dSfengbojiang(姜凤波)
942*3da8d17dSfengbojiang(姜凤波) u->accel = 1;
943*3da8d17dSfengbojiang(姜凤波)
944*3da8d17dSfengbojiang(姜凤波) #if (NGX_HAVE_FSTACK)
945*3da8d17dSfengbojiang(姜凤波) u->peer.belong_to_host = plcf->kernel_network_stack;
946*3da8d17dSfengbojiang(姜凤波) #endif
947*3da8d17dSfengbojiang(姜凤波)
948*3da8d17dSfengbojiang(姜凤波)
949*3da8d17dSfengbojiang(姜凤波) if (!plcf->upstream.request_buffering
950*3da8d17dSfengbojiang(姜凤波) && plcf->body_values == NULL && plcf->upstream.pass_request_body
951*3da8d17dSfengbojiang(姜凤波) && (!r->headers_in.chunked
952*3da8d17dSfengbojiang(姜凤波) || plcf->http_version == NGX_HTTP_VERSION_11))
953*3da8d17dSfengbojiang(姜凤波) {
954*3da8d17dSfengbojiang(姜凤波) r->request_body_no_buffering = 1;
955*3da8d17dSfengbojiang(姜凤波) }
956*3da8d17dSfengbojiang(姜凤波)
957*3da8d17dSfengbojiang(姜凤波) rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);
958*3da8d17dSfengbojiang(姜凤波)
959*3da8d17dSfengbojiang(姜凤波) if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
960*3da8d17dSfengbojiang(姜凤波) return rc;
961*3da8d17dSfengbojiang(姜凤波) }
962*3da8d17dSfengbojiang(姜凤波)
963*3da8d17dSfengbojiang(姜凤波) return NGX_DONE;
964*3da8d17dSfengbojiang(姜凤波) }
965*3da8d17dSfengbojiang(姜凤波)
966*3da8d17dSfengbojiang(姜凤波)
967*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_eval(ngx_http_request_t * r,ngx_http_proxy_ctx_t * ctx,ngx_http_proxy_loc_conf_t * plcf)968*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_eval(ngx_http_request_t *r, ngx_http_proxy_ctx_t *ctx,
969*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *plcf)
970*3da8d17dSfengbojiang(姜凤波) {
971*3da8d17dSfengbojiang(姜凤波) u_char *p;
972*3da8d17dSfengbojiang(姜凤波) size_t add;
973*3da8d17dSfengbojiang(姜凤波) u_short port;
974*3da8d17dSfengbojiang(姜凤波) ngx_str_t proxy;
975*3da8d17dSfengbojiang(姜凤波) ngx_url_t url;
976*3da8d17dSfengbojiang(姜凤波) ngx_http_upstream_t *u;
977*3da8d17dSfengbojiang(姜凤波)
978*3da8d17dSfengbojiang(姜凤波) if (ngx_http_script_run(r, &proxy, plcf->proxy_lengths->elts, 0,
979*3da8d17dSfengbojiang(姜凤波) plcf->proxy_values->elts)
980*3da8d17dSfengbojiang(姜凤波) == NULL)
981*3da8d17dSfengbojiang(姜凤波) {
982*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
983*3da8d17dSfengbojiang(姜凤波) }
984*3da8d17dSfengbojiang(姜凤波)
985*3da8d17dSfengbojiang(姜凤波) if (proxy.len > 7
986*3da8d17dSfengbojiang(姜凤波) && ngx_strncasecmp(proxy.data, (u_char *) "http://", 7) == 0)
987*3da8d17dSfengbojiang(姜凤波) {
988*3da8d17dSfengbojiang(姜凤波) add = 7;
989*3da8d17dSfengbojiang(姜凤波) port = 80;
990*3da8d17dSfengbojiang(姜凤波)
991*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_SSL)
992*3da8d17dSfengbojiang(姜凤波)
993*3da8d17dSfengbojiang(姜凤波) } else if (proxy.len > 8
994*3da8d17dSfengbojiang(姜凤波) && ngx_strncasecmp(proxy.data, (u_char *) "https://", 8) == 0)
995*3da8d17dSfengbojiang(姜凤波) {
996*3da8d17dSfengbojiang(姜凤波) add = 8;
997*3da8d17dSfengbojiang(姜凤波) port = 443;
998*3da8d17dSfengbojiang(姜凤波) r->upstream->ssl = 1;
999*3da8d17dSfengbojiang(姜凤波)
1000*3da8d17dSfengbojiang(姜凤波) #endif
1001*3da8d17dSfengbojiang(姜凤波)
1002*3da8d17dSfengbojiang(姜凤波) } else {
1003*3da8d17dSfengbojiang(姜凤波) ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1004*3da8d17dSfengbojiang(姜凤波) "invalid URL prefix in \"%V\"", &proxy);
1005*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1006*3da8d17dSfengbojiang(姜凤波) }
1007*3da8d17dSfengbojiang(姜凤波)
1008*3da8d17dSfengbojiang(姜凤波) u = r->upstream;
1009*3da8d17dSfengbojiang(姜凤波)
1010*3da8d17dSfengbojiang(姜凤波) u->schema.len = add;
1011*3da8d17dSfengbojiang(姜凤波) u->schema.data = proxy.data;
1012*3da8d17dSfengbojiang(姜凤波)
1013*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&url, sizeof(ngx_url_t));
1014*3da8d17dSfengbojiang(姜凤波)
1015*3da8d17dSfengbojiang(姜凤波) url.url.len = proxy.len - add;
1016*3da8d17dSfengbojiang(姜凤波) url.url.data = proxy.data + add;
1017*3da8d17dSfengbojiang(姜凤波) url.default_port = port;
1018*3da8d17dSfengbojiang(姜凤波) url.uri_part = 1;
1019*3da8d17dSfengbojiang(姜凤波) url.no_resolve = 1;
1020*3da8d17dSfengbojiang(姜凤波)
1021*3da8d17dSfengbojiang(姜凤波) if (ngx_parse_url(r->pool, &url) != NGX_OK) {
1022*3da8d17dSfengbojiang(姜凤波) if (url.err) {
1023*3da8d17dSfengbojiang(姜凤波) ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1024*3da8d17dSfengbojiang(姜凤波) "%s in upstream \"%V\"", url.err, &url.url);
1025*3da8d17dSfengbojiang(姜凤波) }
1026*3da8d17dSfengbojiang(姜凤波)
1027*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1028*3da8d17dSfengbojiang(姜凤波) }
1029*3da8d17dSfengbojiang(姜凤波)
1030*3da8d17dSfengbojiang(姜凤波) if (url.uri.len) {
1031*3da8d17dSfengbojiang(姜凤波) if (url.uri.data[0] == '?') {
1032*3da8d17dSfengbojiang(姜凤波) p = ngx_pnalloc(r->pool, url.uri.len + 1);
1033*3da8d17dSfengbojiang(姜凤波) if (p == NULL) {
1034*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1035*3da8d17dSfengbojiang(姜凤波) }
1036*3da8d17dSfengbojiang(姜凤波)
1037*3da8d17dSfengbojiang(姜凤波) *p++ = '/';
1038*3da8d17dSfengbojiang(姜凤波) ngx_memcpy(p, url.uri.data, url.uri.len);
1039*3da8d17dSfengbojiang(姜凤波)
1040*3da8d17dSfengbojiang(姜凤波) url.uri.len++;
1041*3da8d17dSfengbojiang(姜凤波) url.uri.data = p - 1;
1042*3da8d17dSfengbojiang(姜凤波) }
1043*3da8d17dSfengbojiang(姜凤波) }
1044*3da8d17dSfengbojiang(姜凤波)
1045*3da8d17dSfengbojiang(姜凤波) ctx->vars.key_start = u->schema;
1046*3da8d17dSfengbojiang(姜凤波)
1047*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_set_vars(&url, &ctx->vars);
1048*3da8d17dSfengbojiang(姜凤波)
1049*3da8d17dSfengbojiang(姜凤波) u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t));
1050*3da8d17dSfengbojiang(姜凤波) if (u->resolved == NULL) {
1051*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1052*3da8d17dSfengbojiang(姜凤波) }
1053*3da8d17dSfengbojiang(姜凤波)
1054*3da8d17dSfengbojiang(姜凤波) if (url.addrs) {
1055*3da8d17dSfengbojiang(姜凤波) u->resolved->sockaddr = url.addrs[0].sockaddr;
1056*3da8d17dSfengbojiang(姜凤波) u->resolved->socklen = url.addrs[0].socklen;
1057*3da8d17dSfengbojiang(姜凤波) u->resolved->name = url.addrs[0].name;
1058*3da8d17dSfengbojiang(姜凤波) u->resolved->naddrs = 1;
1059*3da8d17dSfengbojiang(姜凤波) }
1060*3da8d17dSfengbojiang(姜凤波)
1061*3da8d17dSfengbojiang(姜凤波) u->resolved->host = url.host;
1062*3da8d17dSfengbojiang(姜凤波) u->resolved->port = (in_port_t) (url.no_port ? port : url.port);
1063*3da8d17dSfengbojiang(姜凤波) u->resolved->no_port = url.no_port;
1064*3da8d17dSfengbojiang(姜凤波)
1065*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
1066*3da8d17dSfengbojiang(姜凤波) }
1067*3da8d17dSfengbojiang(姜凤波)
1068*3da8d17dSfengbojiang(姜凤波)
1069*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
1070*3da8d17dSfengbojiang(姜凤波)
1071*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_create_key(ngx_http_request_t * r)1072*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_create_key(ngx_http_request_t *r)
1073*3da8d17dSfengbojiang(姜凤波) {
1074*3da8d17dSfengbojiang(姜凤波) size_t len, loc_len;
1075*3da8d17dSfengbojiang(姜凤波) u_char *p;
1076*3da8d17dSfengbojiang(姜凤波) uintptr_t escape;
1077*3da8d17dSfengbojiang(姜凤波) ngx_str_t *key;
1078*3da8d17dSfengbojiang(姜凤波) ngx_http_upstream_t *u;
1079*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_ctx_t *ctx;
1080*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *plcf;
1081*3da8d17dSfengbojiang(姜凤波)
1082*3da8d17dSfengbojiang(姜凤波) u = r->upstream;
1083*3da8d17dSfengbojiang(姜凤波)
1084*3da8d17dSfengbojiang(姜凤波) plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);
1085*3da8d17dSfengbojiang(姜凤波)
1086*3da8d17dSfengbojiang(姜凤波) ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
1087*3da8d17dSfengbojiang(姜凤波)
1088*3da8d17dSfengbojiang(姜凤波) key = ngx_array_push(&r->cache->keys);
1089*3da8d17dSfengbojiang(姜凤波) if (key == NULL) {
1090*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1091*3da8d17dSfengbojiang(姜凤波) }
1092*3da8d17dSfengbojiang(姜凤波)
1093*3da8d17dSfengbojiang(姜凤波) if (plcf->cache_key.value.data) {
1094*3da8d17dSfengbojiang(姜凤波)
1095*3da8d17dSfengbojiang(姜凤波) if (ngx_http_complex_value(r, &plcf->cache_key, key) != NGX_OK) {
1096*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1097*3da8d17dSfengbojiang(姜凤波) }
1098*3da8d17dSfengbojiang(姜凤波)
1099*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
1100*3da8d17dSfengbojiang(姜凤波) }
1101*3da8d17dSfengbojiang(姜凤波)
1102*3da8d17dSfengbojiang(姜凤波) *key = ctx->vars.key_start;
1103*3da8d17dSfengbojiang(姜凤波)
1104*3da8d17dSfengbojiang(姜凤波) key = ngx_array_push(&r->cache->keys);
1105*3da8d17dSfengbojiang(姜凤波) if (key == NULL) {
1106*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1107*3da8d17dSfengbojiang(姜凤波) }
1108*3da8d17dSfengbojiang(姜凤波)
1109*3da8d17dSfengbojiang(姜凤波) if (plcf->proxy_lengths && ctx->vars.uri.len) {
1110*3da8d17dSfengbojiang(姜凤波)
1111*3da8d17dSfengbojiang(姜凤波) *key = ctx->vars.uri;
1112*3da8d17dSfengbojiang(姜凤波) u->uri = ctx->vars.uri;
1113*3da8d17dSfengbojiang(姜凤波)
1114*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
1115*3da8d17dSfengbojiang(姜凤波)
1116*3da8d17dSfengbojiang(姜凤波) } else if (ctx->vars.uri.len == 0 && r->valid_unparsed_uri) {
1117*3da8d17dSfengbojiang(姜凤波) *key = r->unparsed_uri;
1118*3da8d17dSfengbojiang(姜凤波) u->uri = r->unparsed_uri;
1119*3da8d17dSfengbojiang(姜凤波)
1120*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
1121*3da8d17dSfengbojiang(姜凤波) }
1122*3da8d17dSfengbojiang(姜凤波)
1123*3da8d17dSfengbojiang(姜凤波) loc_len = (r->valid_location && ctx->vars.uri.len) ? plcf->location.len : 0;
1124*3da8d17dSfengbojiang(姜凤波)
1125*3da8d17dSfengbojiang(姜凤波) if (r->quoted_uri || r->space_in_uri || r->internal) {
1126*3da8d17dSfengbojiang(姜凤波) escape = 2 * ngx_escape_uri(NULL, r->uri.data + loc_len,
1127*3da8d17dSfengbojiang(姜凤波) r->uri.len - loc_len, NGX_ESCAPE_URI);
1128*3da8d17dSfengbojiang(姜凤波) } else {
1129*3da8d17dSfengbojiang(姜凤波) escape = 0;
1130*3da8d17dSfengbojiang(姜凤波) }
1131*3da8d17dSfengbojiang(姜凤波)
1132*3da8d17dSfengbojiang(姜凤波) len = ctx->vars.uri.len + r->uri.len - loc_len + escape
1133*3da8d17dSfengbojiang(姜凤波) + sizeof("?") - 1 + r->args.len;
1134*3da8d17dSfengbojiang(姜凤波)
1135*3da8d17dSfengbojiang(姜凤波) p = ngx_pnalloc(r->pool, len);
1136*3da8d17dSfengbojiang(姜凤波) if (p == NULL) {
1137*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1138*3da8d17dSfengbojiang(姜凤波) }
1139*3da8d17dSfengbojiang(姜凤波)
1140*3da8d17dSfengbojiang(姜凤波) key->data = p;
1141*3da8d17dSfengbojiang(姜凤波)
1142*3da8d17dSfengbojiang(姜凤波) if (r->valid_location) {
1143*3da8d17dSfengbojiang(姜凤波) p = ngx_copy(p, ctx->vars.uri.data, ctx->vars.uri.len);
1144*3da8d17dSfengbojiang(姜凤波) }
1145*3da8d17dSfengbojiang(姜凤波)
1146*3da8d17dSfengbojiang(姜凤波) if (escape) {
1147*3da8d17dSfengbojiang(姜凤波) ngx_escape_uri(p, r->uri.data + loc_len,
1148*3da8d17dSfengbojiang(姜凤波) r->uri.len - loc_len, NGX_ESCAPE_URI);
1149*3da8d17dSfengbojiang(姜凤波) p += r->uri.len - loc_len + escape;
1150*3da8d17dSfengbojiang(姜凤波)
1151*3da8d17dSfengbojiang(姜凤波) } else {
1152*3da8d17dSfengbojiang(姜凤波) p = ngx_copy(p, r->uri.data + loc_len, r->uri.len - loc_len);
1153*3da8d17dSfengbojiang(姜凤波) }
1154*3da8d17dSfengbojiang(姜凤波)
1155*3da8d17dSfengbojiang(姜凤波) if (r->args.len > 0) {
1156*3da8d17dSfengbojiang(姜凤波) *p++ = '?';
1157*3da8d17dSfengbojiang(姜凤波) p = ngx_copy(p, r->args.data, r->args.len);
1158*3da8d17dSfengbojiang(姜凤波) }
1159*3da8d17dSfengbojiang(姜凤波)
1160*3da8d17dSfengbojiang(姜凤波) key->len = p - key->data;
1161*3da8d17dSfengbojiang(姜凤波) u->uri = *key;
1162*3da8d17dSfengbojiang(姜凤波)
1163*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
1164*3da8d17dSfengbojiang(姜凤波) }
1165*3da8d17dSfengbojiang(姜凤波)
1166*3da8d17dSfengbojiang(姜凤波) #endif
1167*3da8d17dSfengbojiang(姜凤波)
1168*3da8d17dSfengbojiang(姜凤波)
1169*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_create_request(ngx_http_request_t * r)1170*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_create_request(ngx_http_request_t *r)
1171*3da8d17dSfengbojiang(姜凤波) {
1172*3da8d17dSfengbojiang(姜凤波) size_t len, uri_len, loc_len, body_len,
1173*3da8d17dSfengbojiang(姜凤波) key_len, val_len;
1174*3da8d17dSfengbojiang(姜凤波) uintptr_t escape;
1175*3da8d17dSfengbojiang(姜凤波) ngx_buf_t *b;
1176*3da8d17dSfengbojiang(姜凤波) ngx_str_t method;
1177*3da8d17dSfengbojiang(姜凤波) ngx_uint_t i, unparsed_uri;
1178*3da8d17dSfengbojiang(姜凤波) ngx_chain_t *cl, *body;
1179*3da8d17dSfengbojiang(姜凤波) ngx_list_part_t *part;
1180*3da8d17dSfengbojiang(姜凤波) ngx_table_elt_t *header;
1181*3da8d17dSfengbojiang(姜凤波) ngx_http_upstream_t *u;
1182*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_ctx_t *ctx;
1183*3da8d17dSfengbojiang(姜凤波) ngx_http_script_code_pt code;
1184*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_headers_t *headers;
1185*3da8d17dSfengbojiang(姜凤波) ngx_http_script_engine_t e, le;
1186*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *plcf;
1187*3da8d17dSfengbojiang(姜凤波) ngx_http_script_len_code_pt lcode;
1188*3da8d17dSfengbojiang(姜凤波)
1189*3da8d17dSfengbojiang(姜凤波) u = r->upstream;
1190*3da8d17dSfengbojiang(姜凤波)
1191*3da8d17dSfengbojiang(姜凤波) plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);
1192*3da8d17dSfengbojiang(姜凤波)
1193*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
1194*3da8d17dSfengbojiang(姜凤波) headers = u->cacheable ? &plcf->headers_cache : &plcf->headers;
1195*3da8d17dSfengbojiang(姜凤波) #else
1196*3da8d17dSfengbojiang(姜凤波) headers = &plcf->headers;
1197*3da8d17dSfengbojiang(姜凤波) #endif
1198*3da8d17dSfengbojiang(姜凤波)
1199*3da8d17dSfengbojiang(姜凤波) if (u->method.len) {
1200*3da8d17dSfengbojiang(姜凤波) /* HEAD was changed to GET to cache response */
1201*3da8d17dSfengbojiang(姜凤波) method = u->method;
1202*3da8d17dSfengbojiang(姜凤波)
1203*3da8d17dSfengbojiang(姜凤波) } else if (plcf->method) {
1204*3da8d17dSfengbojiang(姜凤波) if (ngx_http_complex_value(r, plcf->method, &method) != NGX_OK) {
1205*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1206*3da8d17dSfengbojiang(姜凤波) }
1207*3da8d17dSfengbojiang(姜凤波)
1208*3da8d17dSfengbojiang(姜凤波) } else {
1209*3da8d17dSfengbojiang(姜凤波) method = r->method_name;
1210*3da8d17dSfengbojiang(姜凤波) }
1211*3da8d17dSfengbojiang(姜凤波)
1212*3da8d17dSfengbojiang(姜凤波) ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
1213*3da8d17dSfengbojiang(姜凤波)
1214*3da8d17dSfengbojiang(姜凤波) if (method.len == 4
1215*3da8d17dSfengbojiang(姜凤波) && ngx_strncasecmp(method.data, (u_char *) "HEAD", 4) == 0)
1216*3da8d17dSfengbojiang(姜凤波) {
1217*3da8d17dSfengbojiang(姜凤波) ctx->head = 1;
1218*3da8d17dSfengbojiang(姜凤波) }
1219*3da8d17dSfengbojiang(姜凤波)
1220*3da8d17dSfengbojiang(姜凤波) len = method.len + 1 + sizeof(ngx_http_proxy_version) - 1
1221*3da8d17dSfengbojiang(姜凤波) + sizeof(CRLF) - 1;
1222*3da8d17dSfengbojiang(姜凤波)
1223*3da8d17dSfengbojiang(姜凤波) escape = 0;
1224*3da8d17dSfengbojiang(姜凤波) loc_len = 0;
1225*3da8d17dSfengbojiang(姜凤波) unparsed_uri = 0;
1226*3da8d17dSfengbojiang(姜凤波)
1227*3da8d17dSfengbojiang(姜凤波) if (plcf->proxy_lengths && ctx->vars.uri.len) {
1228*3da8d17dSfengbojiang(姜凤波) uri_len = ctx->vars.uri.len;
1229*3da8d17dSfengbojiang(姜凤波)
1230*3da8d17dSfengbojiang(姜凤波) } else if (ctx->vars.uri.len == 0 && r->valid_unparsed_uri) {
1231*3da8d17dSfengbojiang(姜凤波) unparsed_uri = 1;
1232*3da8d17dSfengbojiang(姜凤波) uri_len = r->unparsed_uri.len;
1233*3da8d17dSfengbojiang(姜凤波)
1234*3da8d17dSfengbojiang(姜凤波) } else {
1235*3da8d17dSfengbojiang(姜凤波) loc_len = (r->valid_location && ctx->vars.uri.len) ?
1236*3da8d17dSfengbojiang(姜凤波) plcf->location.len : 0;
1237*3da8d17dSfengbojiang(姜凤波)
1238*3da8d17dSfengbojiang(姜凤波) if (r->quoted_uri || r->space_in_uri || r->internal) {
1239*3da8d17dSfengbojiang(姜凤波) escape = 2 * ngx_escape_uri(NULL, r->uri.data + loc_len,
1240*3da8d17dSfengbojiang(姜凤波) r->uri.len - loc_len, NGX_ESCAPE_URI);
1241*3da8d17dSfengbojiang(姜凤波) }
1242*3da8d17dSfengbojiang(姜凤波)
1243*3da8d17dSfengbojiang(姜凤波) uri_len = ctx->vars.uri.len + r->uri.len - loc_len + escape
1244*3da8d17dSfengbojiang(姜凤波) + sizeof("?") - 1 + r->args.len;
1245*3da8d17dSfengbojiang(姜凤波) }
1246*3da8d17dSfengbojiang(姜凤波)
1247*3da8d17dSfengbojiang(姜凤波) if (uri_len == 0) {
1248*3da8d17dSfengbojiang(姜凤波) ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1249*3da8d17dSfengbojiang(姜凤波) "zero length URI to proxy");
1250*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1251*3da8d17dSfengbojiang(姜凤波) }
1252*3da8d17dSfengbojiang(姜凤波)
1253*3da8d17dSfengbojiang(姜凤波) len += uri_len;
1254*3da8d17dSfengbojiang(姜凤波)
1255*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&le, sizeof(ngx_http_script_engine_t));
1256*3da8d17dSfengbojiang(姜凤波)
1257*3da8d17dSfengbojiang(姜凤波) ngx_http_script_flush_no_cacheable_variables(r, plcf->body_flushes);
1258*3da8d17dSfengbojiang(姜凤波) ngx_http_script_flush_no_cacheable_variables(r, headers->flushes);
1259*3da8d17dSfengbojiang(姜凤波)
1260*3da8d17dSfengbojiang(姜凤波) if (plcf->body_lengths) {
1261*3da8d17dSfengbojiang(姜凤波) le.ip = plcf->body_lengths->elts;
1262*3da8d17dSfengbojiang(姜凤波) le.request = r;
1263*3da8d17dSfengbojiang(姜凤波) le.flushed = 1;
1264*3da8d17dSfengbojiang(姜凤波) body_len = 0;
1265*3da8d17dSfengbojiang(姜凤波)
1266*3da8d17dSfengbojiang(姜凤波) while (*(uintptr_t *) le.ip) {
1267*3da8d17dSfengbojiang(姜凤波) lcode = *(ngx_http_script_len_code_pt *) le.ip;
1268*3da8d17dSfengbojiang(姜凤波) body_len += lcode(&le);
1269*3da8d17dSfengbojiang(姜凤波) }
1270*3da8d17dSfengbojiang(姜凤波)
1271*3da8d17dSfengbojiang(姜凤波) ctx->internal_body_length = body_len;
1272*3da8d17dSfengbojiang(姜凤波) len += body_len;
1273*3da8d17dSfengbojiang(姜凤波)
1274*3da8d17dSfengbojiang(姜凤波) } else if (r->headers_in.chunked && r->reading_body) {
1275*3da8d17dSfengbojiang(姜凤波) ctx->internal_body_length = -1;
1276*3da8d17dSfengbojiang(姜凤波) ctx->internal_chunked = 1;
1277*3da8d17dSfengbojiang(姜凤波)
1278*3da8d17dSfengbojiang(姜凤波) } else {
1279*3da8d17dSfengbojiang(姜凤波) ctx->internal_body_length = r->headers_in.content_length_n;
1280*3da8d17dSfengbojiang(姜凤波) }
1281*3da8d17dSfengbojiang(姜凤波)
1282*3da8d17dSfengbojiang(姜凤波) le.ip = headers->lengths->elts;
1283*3da8d17dSfengbojiang(姜凤波) le.request = r;
1284*3da8d17dSfengbojiang(姜凤波) le.flushed = 1;
1285*3da8d17dSfengbojiang(姜凤波)
1286*3da8d17dSfengbojiang(姜凤波) while (*(uintptr_t *) le.ip) {
1287*3da8d17dSfengbojiang(姜凤波)
1288*3da8d17dSfengbojiang(姜凤波) lcode = *(ngx_http_script_len_code_pt *) le.ip;
1289*3da8d17dSfengbojiang(姜凤波) key_len = lcode(&le);
1290*3da8d17dSfengbojiang(姜凤波)
1291*3da8d17dSfengbojiang(姜凤波) for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) {
1292*3da8d17dSfengbojiang(姜凤波) lcode = *(ngx_http_script_len_code_pt *) le.ip;
1293*3da8d17dSfengbojiang(姜凤波) }
1294*3da8d17dSfengbojiang(姜凤波) le.ip += sizeof(uintptr_t);
1295*3da8d17dSfengbojiang(姜凤波)
1296*3da8d17dSfengbojiang(姜凤波) if (val_len == 0) {
1297*3da8d17dSfengbojiang(姜凤波) continue;
1298*3da8d17dSfengbojiang(姜凤波) }
1299*3da8d17dSfengbojiang(姜凤波)
1300*3da8d17dSfengbojiang(姜凤波) len += key_len + sizeof(": ") - 1 + val_len + sizeof(CRLF) - 1;
1301*3da8d17dSfengbojiang(姜凤波) }
1302*3da8d17dSfengbojiang(姜凤波)
1303*3da8d17dSfengbojiang(姜凤波)
1304*3da8d17dSfengbojiang(姜凤波) if (plcf->upstream.pass_request_headers) {
1305*3da8d17dSfengbojiang(姜凤波) part = &r->headers_in.headers.part;
1306*3da8d17dSfengbojiang(姜凤波) header = part->elts;
1307*3da8d17dSfengbojiang(姜凤波)
1308*3da8d17dSfengbojiang(姜凤波) for (i = 0; /* void */; i++) {
1309*3da8d17dSfengbojiang(姜凤波)
1310*3da8d17dSfengbojiang(姜凤波) if (i >= part->nelts) {
1311*3da8d17dSfengbojiang(姜凤波) if (part->next == NULL) {
1312*3da8d17dSfengbojiang(姜凤波) break;
1313*3da8d17dSfengbojiang(姜凤波) }
1314*3da8d17dSfengbojiang(姜凤波)
1315*3da8d17dSfengbojiang(姜凤波) part = part->next;
1316*3da8d17dSfengbojiang(姜凤波) header = part->elts;
1317*3da8d17dSfengbojiang(姜凤波) i = 0;
1318*3da8d17dSfengbojiang(姜凤波) }
1319*3da8d17dSfengbojiang(姜凤波)
1320*3da8d17dSfengbojiang(姜凤波) if (ngx_hash_find(&headers->hash, header[i].hash,
1321*3da8d17dSfengbojiang(姜凤波) header[i].lowcase_key, header[i].key.len))
1322*3da8d17dSfengbojiang(姜凤波) {
1323*3da8d17dSfengbojiang(姜凤波) continue;
1324*3da8d17dSfengbojiang(姜凤波) }
1325*3da8d17dSfengbojiang(姜凤波)
1326*3da8d17dSfengbojiang(姜凤波) len += header[i].key.len + sizeof(": ") - 1
1327*3da8d17dSfengbojiang(姜凤波) + header[i].value.len + sizeof(CRLF) - 1;
1328*3da8d17dSfengbojiang(姜凤波) }
1329*3da8d17dSfengbojiang(姜凤波) }
1330*3da8d17dSfengbojiang(姜凤波)
1331*3da8d17dSfengbojiang(姜凤波)
1332*3da8d17dSfengbojiang(姜凤波) b = ngx_create_temp_buf(r->pool, len);
1333*3da8d17dSfengbojiang(姜凤波) if (b == NULL) {
1334*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1335*3da8d17dSfengbojiang(姜凤波) }
1336*3da8d17dSfengbojiang(姜凤波)
1337*3da8d17dSfengbojiang(姜凤波) cl = ngx_alloc_chain_link(r->pool);
1338*3da8d17dSfengbojiang(姜凤波) if (cl == NULL) {
1339*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1340*3da8d17dSfengbojiang(姜凤波) }
1341*3da8d17dSfengbojiang(姜凤波)
1342*3da8d17dSfengbojiang(姜凤波) cl->buf = b;
1343*3da8d17dSfengbojiang(姜凤波)
1344*3da8d17dSfengbojiang(姜凤波)
1345*3da8d17dSfengbojiang(姜凤波) /* the request line */
1346*3da8d17dSfengbojiang(姜凤波)
1347*3da8d17dSfengbojiang(姜凤波) b->last = ngx_copy(b->last, method.data, method.len);
1348*3da8d17dSfengbojiang(姜凤波) *b->last++ = ' ';
1349*3da8d17dSfengbojiang(姜凤波)
1350*3da8d17dSfengbojiang(姜凤波) u->uri.data = b->last;
1351*3da8d17dSfengbojiang(姜凤波)
1352*3da8d17dSfengbojiang(姜凤波) if (plcf->proxy_lengths && ctx->vars.uri.len) {
1353*3da8d17dSfengbojiang(姜凤波) b->last = ngx_copy(b->last, ctx->vars.uri.data, ctx->vars.uri.len);
1354*3da8d17dSfengbojiang(姜凤波)
1355*3da8d17dSfengbojiang(姜凤波) } else if (unparsed_uri) {
1356*3da8d17dSfengbojiang(姜凤波) b->last = ngx_copy(b->last, r->unparsed_uri.data, r->unparsed_uri.len);
1357*3da8d17dSfengbojiang(姜凤波)
1358*3da8d17dSfengbojiang(姜凤波) } else {
1359*3da8d17dSfengbojiang(姜凤波) if (r->valid_location) {
1360*3da8d17dSfengbojiang(姜凤波) b->last = ngx_copy(b->last, ctx->vars.uri.data, ctx->vars.uri.len);
1361*3da8d17dSfengbojiang(姜凤波) }
1362*3da8d17dSfengbojiang(姜凤波)
1363*3da8d17dSfengbojiang(姜凤波) if (escape) {
1364*3da8d17dSfengbojiang(姜凤波) ngx_escape_uri(b->last, r->uri.data + loc_len,
1365*3da8d17dSfengbojiang(姜凤波) r->uri.len - loc_len, NGX_ESCAPE_URI);
1366*3da8d17dSfengbojiang(姜凤波) b->last += r->uri.len - loc_len + escape;
1367*3da8d17dSfengbojiang(姜凤波)
1368*3da8d17dSfengbojiang(姜凤波) } else {
1369*3da8d17dSfengbojiang(姜凤波) b->last = ngx_copy(b->last, r->uri.data + loc_len,
1370*3da8d17dSfengbojiang(姜凤波) r->uri.len - loc_len);
1371*3da8d17dSfengbojiang(姜凤波) }
1372*3da8d17dSfengbojiang(姜凤波)
1373*3da8d17dSfengbojiang(姜凤波) if (r->args.len > 0) {
1374*3da8d17dSfengbojiang(姜凤波) *b->last++ = '?';
1375*3da8d17dSfengbojiang(姜凤波) b->last = ngx_copy(b->last, r->args.data, r->args.len);
1376*3da8d17dSfengbojiang(姜凤波) }
1377*3da8d17dSfengbojiang(姜凤波) }
1378*3da8d17dSfengbojiang(姜凤波)
1379*3da8d17dSfengbojiang(姜凤波) u->uri.len = b->last - u->uri.data;
1380*3da8d17dSfengbojiang(姜凤波)
1381*3da8d17dSfengbojiang(姜凤波) if (plcf->http_version == NGX_HTTP_VERSION_11) {
1382*3da8d17dSfengbojiang(姜凤波) b->last = ngx_cpymem(b->last, ngx_http_proxy_version_11,
1383*3da8d17dSfengbojiang(姜凤波) sizeof(ngx_http_proxy_version_11) - 1);
1384*3da8d17dSfengbojiang(姜凤波)
1385*3da8d17dSfengbojiang(姜凤波) } else {
1386*3da8d17dSfengbojiang(姜凤波) b->last = ngx_cpymem(b->last, ngx_http_proxy_version,
1387*3da8d17dSfengbojiang(姜凤波) sizeof(ngx_http_proxy_version) - 1);
1388*3da8d17dSfengbojiang(姜凤波) }
1389*3da8d17dSfengbojiang(姜凤波)
1390*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&e, sizeof(ngx_http_script_engine_t));
1391*3da8d17dSfengbojiang(姜凤波)
1392*3da8d17dSfengbojiang(姜凤波) e.ip = headers->values->elts;
1393*3da8d17dSfengbojiang(姜凤波) e.pos = b->last;
1394*3da8d17dSfengbojiang(姜凤波) e.request = r;
1395*3da8d17dSfengbojiang(姜凤波) e.flushed = 1;
1396*3da8d17dSfengbojiang(姜凤波)
1397*3da8d17dSfengbojiang(姜凤波) le.ip = headers->lengths->elts;
1398*3da8d17dSfengbojiang(姜凤波)
1399*3da8d17dSfengbojiang(姜凤波) while (*(uintptr_t *) le.ip) {
1400*3da8d17dSfengbojiang(姜凤波)
1401*3da8d17dSfengbojiang(姜凤波) lcode = *(ngx_http_script_len_code_pt *) le.ip;
1402*3da8d17dSfengbojiang(姜凤波) (void) lcode(&le);
1403*3da8d17dSfengbojiang(姜凤波)
1404*3da8d17dSfengbojiang(姜凤波) for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) {
1405*3da8d17dSfengbojiang(姜凤波) lcode = *(ngx_http_script_len_code_pt *) le.ip;
1406*3da8d17dSfengbojiang(姜凤波) }
1407*3da8d17dSfengbojiang(姜凤波) le.ip += sizeof(uintptr_t);
1408*3da8d17dSfengbojiang(姜凤波)
1409*3da8d17dSfengbojiang(姜凤波) if (val_len == 0) {
1410*3da8d17dSfengbojiang(姜凤波) e.skip = 1;
1411*3da8d17dSfengbojiang(姜凤波)
1412*3da8d17dSfengbojiang(姜凤波) while (*(uintptr_t *) e.ip) {
1413*3da8d17dSfengbojiang(姜凤波) code = *(ngx_http_script_code_pt *) e.ip;
1414*3da8d17dSfengbojiang(姜凤波) code((ngx_http_script_engine_t *) &e);
1415*3da8d17dSfengbojiang(姜凤波) }
1416*3da8d17dSfengbojiang(姜凤波) e.ip += sizeof(uintptr_t);
1417*3da8d17dSfengbojiang(姜凤波)
1418*3da8d17dSfengbojiang(姜凤波) e.skip = 0;
1419*3da8d17dSfengbojiang(姜凤波)
1420*3da8d17dSfengbojiang(姜凤波) continue;
1421*3da8d17dSfengbojiang(姜凤波) }
1422*3da8d17dSfengbojiang(姜凤波)
1423*3da8d17dSfengbojiang(姜凤波) code = *(ngx_http_script_code_pt *) e.ip;
1424*3da8d17dSfengbojiang(姜凤波) code((ngx_http_script_engine_t *) &e);
1425*3da8d17dSfengbojiang(姜凤波)
1426*3da8d17dSfengbojiang(姜凤波) *e.pos++ = ':'; *e.pos++ = ' ';
1427*3da8d17dSfengbojiang(姜凤波)
1428*3da8d17dSfengbojiang(姜凤波) while (*(uintptr_t *) e.ip) {
1429*3da8d17dSfengbojiang(姜凤波) code = *(ngx_http_script_code_pt *) e.ip;
1430*3da8d17dSfengbojiang(姜凤波) code((ngx_http_script_engine_t *) &e);
1431*3da8d17dSfengbojiang(姜凤波) }
1432*3da8d17dSfengbojiang(姜凤波) e.ip += sizeof(uintptr_t);
1433*3da8d17dSfengbojiang(姜凤波)
1434*3da8d17dSfengbojiang(姜凤波) *e.pos++ = CR; *e.pos++ = LF;
1435*3da8d17dSfengbojiang(姜凤波) }
1436*3da8d17dSfengbojiang(姜凤波)
1437*3da8d17dSfengbojiang(姜凤波) b->last = e.pos;
1438*3da8d17dSfengbojiang(姜凤波)
1439*3da8d17dSfengbojiang(姜凤波)
1440*3da8d17dSfengbojiang(姜凤波) if (plcf->upstream.pass_request_headers) {
1441*3da8d17dSfengbojiang(姜凤波) part = &r->headers_in.headers.part;
1442*3da8d17dSfengbojiang(姜凤波) header = part->elts;
1443*3da8d17dSfengbojiang(姜凤波)
1444*3da8d17dSfengbojiang(姜凤波) for (i = 0; /* void */; i++) {
1445*3da8d17dSfengbojiang(姜凤波)
1446*3da8d17dSfengbojiang(姜凤波) if (i >= part->nelts) {
1447*3da8d17dSfengbojiang(姜凤波) if (part->next == NULL) {
1448*3da8d17dSfengbojiang(姜凤波) break;
1449*3da8d17dSfengbojiang(姜凤波) }
1450*3da8d17dSfengbojiang(姜凤波)
1451*3da8d17dSfengbojiang(姜凤波) part = part->next;
1452*3da8d17dSfengbojiang(姜凤波) header = part->elts;
1453*3da8d17dSfengbojiang(姜凤波) i = 0;
1454*3da8d17dSfengbojiang(姜凤波) }
1455*3da8d17dSfengbojiang(姜凤波)
1456*3da8d17dSfengbojiang(姜凤波) if (ngx_hash_find(&headers->hash, header[i].hash,
1457*3da8d17dSfengbojiang(姜凤波) header[i].lowcase_key, header[i].key.len))
1458*3da8d17dSfengbojiang(姜凤波) {
1459*3da8d17dSfengbojiang(姜凤波) continue;
1460*3da8d17dSfengbojiang(姜凤波) }
1461*3da8d17dSfengbojiang(姜凤波)
1462*3da8d17dSfengbojiang(姜凤波) b->last = ngx_copy(b->last, header[i].key.data, header[i].key.len);
1463*3da8d17dSfengbojiang(姜凤波)
1464*3da8d17dSfengbojiang(姜凤波) *b->last++ = ':'; *b->last++ = ' ';
1465*3da8d17dSfengbojiang(姜凤波)
1466*3da8d17dSfengbojiang(姜凤波) b->last = ngx_copy(b->last, header[i].value.data,
1467*3da8d17dSfengbojiang(姜凤波) header[i].value.len);
1468*3da8d17dSfengbojiang(姜凤波)
1469*3da8d17dSfengbojiang(姜凤波) *b->last++ = CR; *b->last++ = LF;
1470*3da8d17dSfengbojiang(姜凤波)
1471*3da8d17dSfengbojiang(姜凤波) ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1472*3da8d17dSfengbojiang(姜凤波) "http proxy header: \"%V: %V\"",
1473*3da8d17dSfengbojiang(姜凤波) &header[i].key, &header[i].value);
1474*3da8d17dSfengbojiang(姜凤波) }
1475*3da8d17dSfengbojiang(姜凤波) }
1476*3da8d17dSfengbojiang(姜凤波)
1477*3da8d17dSfengbojiang(姜凤波)
1478*3da8d17dSfengbojiang(姜凤波) /* add "\r\n" at the header end */
1479*3da8d17dSfengbojiang(姜凤波) *b->last++ = CR; *b->last++ = LF;
1480*3da8d17dSfengbojiang(姜凤波)
1481*3da8d17dSfengbojiang(姜凤波) if (plcf->body_values) {
1482*3da8d17dSfengbojiang(姜凤波) e.ip = plcf->body_values->elts;
1483*3da8d17dSfengbojiang(姜凤波) e.pos = b->last;
1484*3da8d17dSfengbojiang(姜凤波) e.skip = 0;
1485*3da8d17dSfengbojiang(姜凤波)
1486*3da8d17dSfengbojiang(姜凤波) while (*(uintptr_t *) e.ip) {
1487*3da8d17dSfengbojiang(姜凤波) code = *(ngx_http_script_code_pt *) e.ip;
1488*3da8d17dSfengbojiang(姜凤波) code((ngx_http_script_engine_t *) &e);
1489*3da8d17dSfengbojiang(姜凤波) }
1490*3da8d17dSfengbojiang(姜凤波)
1491*3da8d17dSfengbojiang(姜凤波) b->last = e.pos;
1492*3da8d17dSfengbojiang(姜凤波) }
1493*3da8d17dSfengbojiang(姜凤波)
1494*3da8d17dSfengbojiang(姜凤波) ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1495*3da8d17dSfengbojiang(姜凤波) "http proxy header:%N\"%*s\"",
1496*3da8d17dSfengbojiang(姜凤波) (size_t) (b->last - b->pos), b->pos);
1497*3da8d17dSfengbojiang(姜凤波)
1498*3da8d17dSfengbojiang(姜凤波) if (r->request_body_no_buffering) {
1499*3da8d17dSfengbojiang(姜凤波)
1500*3da8d17dSfengbojiang(姜凤波) u->request_bufs = cl;
1501*3da8d17dSfengbojiang(姜凤波)
1502*3da8d17dSfengbojiang(姜凤波) if (ctx->internal_chunked) {
1503*3da8d17dSfengbojiang(姜凤波) u->output.output_filter = ngx_http_proxy_body_output_filter;
1504*3da8d17dSfengbojiang(姜凤波) u->output.filter_ctx = r;
1505*3da8d17dSfengbojiang(姜凤波) }
1506*3da8d17dSfengbojiang(姜凤波)
1507*3da8d17dSfengbojiang(姜凤波) } else if (plcf->body_values == NULL && plcf->upstream.pass_request_body) {
1508*3da8d17dSfengbojiang(姜凤波)
1509*3da8d17dSfengbojiang(姜凤波) body = u->request_bufs;
1510*3da8d17dSfengbojiang(姜凤波) u->request_bufs = cl;
1511*3da8d17dSfengbojiang(姜凤波)
1512*3da8d17dSfengbojiang(姜凤波) while (body) {
1513*3da8d17dSfengbojiang(姜凤波) b = ngx_alloc_buf(r->pool);
1514*3da8d17dSfengbojiang(姜凤波) if (b == NULL) {
1515*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1516*3da8d17dSfengbojiang(姜凤波) }
1517*3da8d17dSfengbojiang(姜凤波)
1518*3da8d17dSfengbojiang(姜凤波) ngx_memcpy(b, body->buf, sizeof(ngx_buf_t));
1519*3da8d17dSfengbojiang(姜凤波)
1520*3da8d17dSfengbojiang(姜凤波) cl->next = ngx_alloc_chain_link(r->pool);
1521*3da8d17dSfengbojiang(姜凤波) if (cl->next == NULL) {
1522*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1523*3da8d17dSfengbojiang(姜凤波) }
1524*3da8d17dSfengbojiang(姜凤波)
1525*3da8d17dSfengbojiang(姜凤波) cl = cl->next;
1526*3da8d17dSfengbojiang(姜凤波) cl->buf = b;
1527*3da8d17dSfengbojiang(姜凤波)
1528*3da8d17dSfengbojiang(姜凤波) body = body->next;
1529*3da8d17dSfengbojiang(姜凤波) }
1530*3da8d17dSfengbojiang(姜凤波)
1531*3da8d17dSfengbojiang(姜凤波) } else {
1532*3da8d17dSfengbojiang(姜凤波) u->request_bufs = cl;
1533*3da8d17dSfengbojiang(姜凤波) }
1534*3da8d17dSfengbojiang(姜凤波)
1535*3da8d17dSfengbojiang(姜凤波) b->flush = 1;
1536*3da8d17dSfengbojiang(姜凤波) cl->next = NULL;
1537*3da8d17dSfengbojiang(姜凤波)
1538*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
1539*3da8d17dSfengbojiang(姜凤波) }
1540*3da8d17dSfengbojiang(姜凤波)
1541*3da8d17dSfengbojiang(姜凤波)
1542*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_reinit_request(ngx_http_request_t * r)1543*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_reinit_request(ngx_http_request_t *r)
1544*3da8d17dSfengbojiang(姜凤波) {
1545*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_ctx_t *ctx;
1546*3da8d17dSfengbojiang(姜凤波)
1547*3da8d17dSfengbojiang(姜凤波) ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
1548*3da8d17dSfengbojiang(姜凤波)
1549*3da8d17dSfengbojiang(姜凤波) if (ctx == NULL) {
1550*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
1551*3da8d17dSfengbojiang(姜凤波) }
1552*3da8d17dSfengbojiang(姜凤波)
1553*3da8d17dSfengbojiang(姜凤波) ctx->status.code = 0;
1554*3da8d17dSfengbojiang(姜凤波) ctx->status.count = 0;
1555*3da8d17dSfengbojiang(姜凤波) ctx->status.start = NULL;
1556*3da8d17dSfengbojiang(姜凤波) ctx->status.end = NULL;
1557*3da8d17dSfengbojiang(姜凤波) ctx->chunked.state = 0;
1558*3da8d17dSfengbojiang(姜凤波)
1559*3da8d17dSfengbojiang(姜凤波) r->upstream->process_header = ngx_http_proxy_process_status_line;
1560*3da8d17dSfengbojiang(姜凤波) r->upstream->pipe->input_filter = ngx_http_proxy_copy_filter;
1561*3da8d17dSfengbojiang(姜凤波) r->upstream->input_filter = ngx_http_proxy_non_buffered_copy_filter;
1562*3da8d17dSfengbojiang(姜凤波) r->state = 0;
1563*3da8d17dSfengbojiang(姜凤波)
1564*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
1565*3da8d17dSfengbojiang(姜凤波) }
1566*3da8d17dSfengbojiang(姜凤波)
1567*3da8d17dSfengbojiang(姜凤波)
1568*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_body_output_filter(void * data,ngx_chain_t * in)1569*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_body_output_filter(void *data, ngx_chain_t *in)
1570*3da8d17dSfengbojiang(姜凤波) {
1571*3da8d17dSfengbojiang(姜凤波) ngx_http_request_t *r = data;
1572*3da8d17dSfengbojiang(姜凤波)
1573*3da8d17dSfengbojiang(姜凤波) off_t size;
1574*3da8d17dSfengbojiang(姜凤波) u_char *chunk;
1575*3da8d17dSfengbojiang(姜凤波) ngx_int_t rc;
1576*3da8d17dSfengbojiang(姜凤波) ngx_buf_t *b;
1577*3da8d17dSfengbojiang(姜凤波) ngx_chain_t *out, *cl, *tl, **ll, **fl;
1578*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_ctx_t *ctx;
1579*3da8d17dSfengbojiang(姜凤波)
1580*3da8d17dSfengbojiang(姜凤波) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1581*3da8d17dSfengbojiang(姜凤波) "proxy output filter");
1582*3da8d17dSfengbojiang(姜凤波)
1583*3da8d17dSfengbojiang(姜凤波) ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
1584*3da8d17dSfengbojiang(姜凤波)
1585*3da8d17dSfengbojiang(姜凤波) if (in == NULL) {
1586*3da8d17dSfengbojiang(姜凤波) out = in;
1587*3da8d17dSfengbojiang(姜凤波) goto out;
1588*3da8d17dSfengbojiang(姜凤波) }
1589*3da8d17dSfengbojiang(姜凤波)
1590*3da8d17dSfengbojiang(姜凤波) out = NULL;
1591*3da8d17dSfengbojiang(姜凤波) ll = &out;
1592*3da8d17dSfengbojiang(姜凤波)
1593*3da8d17dSfengbojiang(姜凤波) if (!ctx->header_sent) {
1594*3da8d17dSfengbojiang(姜凤波) /* first buffer contains headers, pass it unmodified */
1595*3da8d17dSfengbojiang(姜凤波)
1596*3da8d17dSfengbojiang(姜凤波) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1597*3da8d17dSfengbojiang(姜凤波) "proxy output header");
1598*3da8d17dSfengbojiang(姜凤波)
1599*3da8d17dSfengbojiang(姜凤波) ctx->header_sent = 1;
1600*3da8d17dSfengbojiang(姜凤波)
1601*3da8d17dSfengbojiang(姜凤波) tl = ngx_alloc_chain_link(r->pool);
1602*3da8d17dSfengbojiang(姜凤波) if (tl == NULL) {
1603*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1604*3da8d17dSfengbojiang(姜凤波) }
1605*3da8d17dSfengbojiang(姜凤波)
1606*3da8d17dSfengbojiang(姜凤波) tl->buf = in->buf;
1607*3da8d17dSfengbojiang(姜凤波) *ll = tl;
1608*3da8d17dSfengbojiang(姜凤波) ll = &tl->next;
1609*3da8d17dSfengbojiang(姜凤波)
1610*3da8d17dSfengbojiang(姜凤波) in = in->next;
1611*3da8d17dSfengbojiang(姜凤波)
1612*3da8d17dSfengbojiang(姜凤波) if (in == NULL) {
1613*3da8d17dSfengbojiang(姜凤波) tl->next = NULL;
1614*3da8d17dSfengbojiang(姜凤波) goto out;
1615*3da8d17dSfengbojiang(姜凤波) }
1616*3da8d17dSfengbojiang(姜凤波) }
1617*3da8d17dSfengbojiang(姜凤波)
1618*3da8d17dSfengbojiang(姜凤波) size = 0;
1619*3da8d17dSfengbojiang(姜凤波) cl = in;
1620*3da8d17dSfengbojiang(姜凤波) fl = ll;
1621*3da8d17dSfengbojiang(姜凤波)
1622*3da8d17dSfengbojiang(姜凤波) for ( ;; ) {
1623*3da8d17dSfengbojiang(姜凤波) ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1624*3da8d17dSfengbojiang(姜凤波) "proxy output chunk: %O", ngx_buf_size(cl->buf));
1625*3da8d17dSfengbojiang(姜凤波)
1626*3da8d17dSfengbojiang(姜凤波) size += ngx_buf_size(cl->buf);
1627*3da8d17dSfengbojiang(姜凤波)
1628*3da8d17dSfengbojiang(姜凤波) if (cl->buf->flush
1629*3da8d17dSfengbojiang(姜凤波) || cl->buf->sync
1630*3da8d17dSfengbojiang(姜凤波) || ngx_buf_in_memory(cl->buf)
1631*3da8d17dSfengbojiang(姜凤波) || cl->buf->in_file)
1632*3da8d17dSfengbojiang(姜凤波) {
1633*3da8d17dSfengbojiang(姜凤波) tl = ngx_alloc_chain_link(r->pool);
1634*3da8d17dSfengbojiang(姜凤波) if (tl == NULL) {
1635*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1636*3da8d17dSfengbojiang(姜凤波) }
1637*3da8d17dSfengbojiang(姜凤波)
1638*3da8d17dSfengbojiang(姜凤波) tl->buf = cl->buf;
1639*3da8d17dSfengbojiang(姜凤波) *ll = tl;
1640*3da8d17dSfengbojiang(姜凤波) ll = &tl->next;
1641*3da8d17dSfengbojiang(姜凤波) }
1642*3da8d17dSfengbojiang(姜凤波)
1643*3da8d17dSfengbojiang(姜凤波) if (cl->next == NULL) {
1644*3da8d17dSfengbojiang(姜凤波) break;
1645*3da8d17dSfengbojiang(姜凤波) }
1646*3da8d17dSfengbojiang(姜凤波)
1647*3da8d17dSfengbojiang(姜凤波) cl = cl->next;
1648*3da8d17dSfengbojiang(姜凤波) }
1649*3da8d17dSfengbojiang(姜凤波)
1650*3da8d17dSfengbojiang(姜凤波) if (size) {
1651*3da8d17dSfengbojiang(姜凤波) tl = ngx_chain_get_free_buf(r->pool, &ctx->free);
1652*3da8d17dSfengbojiang(姜凤波) if (tl == NULL) {
1653*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1654*3da8d17dSfengbojiang(姜凤波) }
1655*3da8d17dSfengbojiang(姜凤波)
1656*3da8d17dSfengbojiang(姜凤波) b = tl->buf;
1657*3da8d17dSfengbojiang(姜凤波) chunk = b->start;
1658*3da8d17dSfengbojiang(姜凤波)
1659*3da8d17dSfengbojiang(姜凤波) if (chunk == NULL) {
1660*3da8d17dSfengbojiang(姜凤波) /* the "0000000000000000" is 64-bit hexadecimal string */
1661*3da8d17dSfengbojiang(姜凤波)
1662*3da8d17dSfengbojiang(姜凤波) chunk = ngx_palloc(r->pool, sizeof("0000000000000000" CRLF) - 1);
1663*3da8d17dSfengbojiang(姜凤波) if (chunk == NULL) {
1664*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1665*3da8d17dSfengbojiang(姜凤波) }
1666*3da8d17dSfengbojiang(姜凤波)
1667*3da8d17dSfengbojiang(姜凤波) b->start = chunk;
1668*3da8d17dSfengbojiang(姜凤波) b->end = chunk + sizeof("0000000000000000" CRLF) - 1;
1669*3da8d17dSfengbojiang(姜凤波) }
1670*3da8d17dSfengbojiang(姜凤波)
1671*3da8d17dSfengbojiang(姜凤波) b->tag = (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter;
1672*3da8d17dSfengbojiang(姜凤波) b->memory = 0;
1673*3da8d17dSfengbojiang(姜凤波) b->temporary = 1;
1674*3da8d17dSfengbojiang(姜凤波) b->pos = chunk;
1675*3da8d17dSfengbojiang(姜凤波) b->last = ngx_sprintf(chunk, "%xO" CRLF, size);
1676*3da8d17dSfengbojiang(姜凤波)
1677*3da8d17dSfengbojiang(姜凤波) tl->next = *fl;
1678*3da8d17dSfengbojiang(姜凤波) *fl = tl;
1679*3da8d17dSfengbojiang(姜凤波) }
1680*3da8d17dSfengbojiang(姜凤波)
1681*3da8d17dSfengbojiang(姜凤波) if (cl->buf->last_buf) {
1682*3da8d17dSfengbojiang(姜凤波) tl = ngx_chain_get_free_buf(r->pool, &ctx->free);
1683*3da8d17dSfengbojiang(姜凤波) if (tl == NULL) {
1684*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1685*3da8d17dSfengbojiang(姜凤波) }
1686*3da8d17dSfengbojiang(姜凤波)
1687*3da8d17dSfengbojiang(姜凤波) b = tl->buf;
1688*3da8d17dSfengbojiang(姜凤波)
1689*3da8d17dSfengbojiang(姜凤波) b->tag = (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter;
1690*3da8d17dSfengbojiang(姜凤波) b->temporary = 0;
1691*3da8d17dSfengbojiang(姜凤波) b->memory = 1;
1692*3da8d17dSfengbojiang(姜凤波) b->last_buf = 1;
1693*3da8d17dSfengbojiang(姜凤波) b->pos = (u_char *) CRLF "0" CRLF CRLF;
1694*3da8d17dSfengbojiang(姜凤波) b->last = b->pos + 7;
1695*3da8d17dSfengbojiang(姜凤波)
1696*3da8d17dSfengbojiang(姜凤波) cl->buf->last_buf = 0;
1697*3da8d17dSfengbojiang(姜凤波)
1698*3da8d17dSfengbojiang(姜凤波) *ll = tl;
1699*3da8d17dSfengbojiang(姜凤波)
1700*3da8d17dSfengbojiang(姜凤波) if (size == 0) {
1701*3da8d17dSfengbojiang(姜凤波) b->pos += 2;
1702*3da8d17dSfengbojiang(姜凤波) }
1703*3da8d17dSfengbojiang(姜凤波)
1704*3da8d17dSfengbojiang(姜凤波) } else if (size > 0) {
1705*3da8d17dSfengbojiang(姜凤波) tl = ngx_chain_get_free_buf(r->pool, &ctx->free);
1706*3da8d17dSfengbojiang(姜凤波) if (tl == NULL) {
1707*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1708*3da8d17dSfengbojiang(姜凤波) }
1709*3da8d17dSfengbojiang(姜凤波)
1710*3da8d17dSfengbojiang(姜凤波) b = tl->buf;
1711*3da8d17dSfengbojiang(姜凤波)
1712*3da8d17dSfengbojiang(姜凤波) b->tag = (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter;
1713*3da8d17dSfengbojiang(姜凤波) b->temporary = 0;
1714*3da8d17dSfengbojiang(姜凤波) b->memory = 1;
1715*3da8d17dSfengbojiang(姜凤波) b->pos = (u_char *) CRLF;
1716*3da8d17dSfengbojiang(姜凤波) b->last = b->pos + 2;
1717*3da8d17dSfengbojiang(姜凤波)
1718*3da8d17dSfengbojiang(姜凤波) *ll = tl;
1719*3da8d17dSfengbojiang(姜凤波)
1720*3da8d17dSfengbojiang(姜凤波) } else {
1721*3da8d17dSfengbojiang(姜凤波) *ll = NULL;
1722*3da8d17dSfengbojiang(姜凤波) }
1723*3da8d17dSfengbojiang(姜凤波)
1724*3da8d17dSfengbojiang(姜凤波) out:
1725*3da8d17dSfengbojiang(姜凤波)
1726*3da8d17dSfengbojiang(姜凤波) rc = ngx_chain_writer(&r->upstream->writer, out);
1727*3da8d17dSfengbojiang(姜凤波)
1728*3da8d17dSfengbojiang(姜凤波) ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &out,
1729*3da8d17dSfengbojiang(姜凤波) (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter);
1730*3da8d17dSfengbojiang(姜凤波)
1731*3da8d17dSfengbojiang(姜凤波) return rc;
1732*3da8d17dSfengbojiang(姜凤波) }
1733*3da8d17dSfengbojiang(姜凤波)
1734*3da8d17dSfengbojiang(姜凤波)
1735*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_process_status_line(ngx_http_request_t * r)1736*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_process_status_line(ngx_http_request_t *r)
1737*3da8d17dSfengbojiang(姜凤波) {
1738*3da8d17dSfengbojiang(姜凤波) size_t len;
1739*3da8d17dSfengbojiang(姜凤波) ngx_int_t rc;
1740*3da8d17dSfengbojiang(姜凤波) ngx_http_upstream_t *u;
1741*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_ctx_t *ctx;
1742*3da8d17dSfengbojiang(姜凤波)
1743*3da8d17dSfengbojiang(姜凤波) ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
1744*3da8d17dSfengbojiang(姜凤波)
1745*3da8d17dSfengbojiang(姜凤波) if (ctx == NULL) {
1746*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1747*3da8d17dSfengbojiang(姜凤波) }
1748*3da8d17dSfengbojiang(姜凤波)
1749*3da8d17dSfengbojiang(姜凤波) u = r->upstream;
1750*3da8d17dSfengbojiang(姜凤波)
1751*3da8d17dSfengbojiang(姜凤波) rc = ngx_http_parse_status_line(r, &u->buffer, &ctx->status);
1752*3da8d17dSfengbojiang(姜凤波)
1753*3da8d17dSfengbojiang(姜凤波) if (rc == NGX_AGAIN) {
1754*3da8d17dSfengbojiang(姜凤波) return rc;
1755*3da8d17dSfengbojiang(姜凤波) }
1756*3da8d17dSfengbojiang(姜凤波)
1757*3da8d17dSfengbojiang(姜凤波) if (rc == NGX_ERROR) {
1758*3da8d17dSfengbojiang(姜凤波)
1759*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
1760*3da8d17dSfengbojiang(姜凤波)
1761*3da8d17dSfengbojiang(姜凤波) if (r->cache) {
1762*3da8d17dSfengbojiang(姜凤波) r->http_version = NGX_HTTP_VERSION_9;
1763*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
1764*3da8d17dSfengbojiang(姜凤波) }
1765*3da8d17dSfengbojiang(姜凤波)
1766*3da8d17dSfengbojiang(姜凤波) #endif
1767*3da8d17dSfengbojiang(姜凤波)
1768*3da8d17dSfengbojiang(姜凤波) ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1769*3da8d17dSfengbojiang(姜凤波) "upstream sent no valid HTTP/1.0 header");
1770*3da8d17dSfengbojiang(姜凤波)
1771*3da8d17dSfengbojiang(姜凤波) #if 0
1772*3da8d17dSfengbojiang(姜凤波) if (u->accel) {
1773*3da8d17dSfengbojiang(姜凤波) return NGX_HTTP_UPSTREAM_INVALID_HEADER;
1774*3da8d17dSfengbojiang(姜凤波) }
1775*3da8d17dSfengbojiang(姜凤波) #endif
1776*3da8d17dSfengbojiang(姜凤波)
1777*3da8d17dSfengbojiang(姜凤波) r->http_version = NGX_HTTP_VERSION_9;
1778*3da8d17dSfengbojiang(姜凤波) u->state->status = NGX_HTTP_OK;
1779*3da8d17dSfengbojiang(姜凤波) u->headers_in.connection_close = 1;
1780*3da8d17dSfengbojiang(姜凤波)
1781*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
1782*3da8d17dSfengbojiang(姜凤波) }
1783*3da8d17dSfengbojiang(姜凤波)
1784*3da8d17dSfengbojiang(姜凤波) if (u->state && u->state->status == 0) {
1785*3da8d17dSfengbojiang(姜凤波) u->state->status = ctx->status.code;
1786*3da8d17dSfengbojiang(姜凤波) }
1787*3da8d17dSfengbojiang(姜凤波)
1788*3da8d17dSfengbojiang(姜凤波) u->headers_in.status_n = ctx->status.code;
1789*3da8d17dSfengbojiang(姜凤波)
1790*3da8d17dSfengbojiang(姜凤波) len = ctx->status.end - ctx->status.start;
1791*3da8d17dSfengbojiang(姜凤波) u->headers_in.status_line.len = len;
1792*3da8d17dSfengbojiang(姜凤波)
1793*3da8d17dSfengbojiang(姜凤波) u->headers_in.status_line.data = ngx_pnalloc(r->pool, len);
1794*3da8d17dSfengbojiang(姜凤波) if (u->headers_in.status_line.data == NULL) {
1795*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1796*3da8d17dSfengbojiang(姜凤波) }
1797*3da8d17dSfengbojiang(姜凤波)
1798*3da8d17dSfengbojiang(姜凤波) ngx_memcpy(u->headers_in.status_line.data, ctx->status.start, len);
1799*3da8d17dSfengbojiang(姜凤波)
1800*3da8d17dSfengbojiang(姜凤波) ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1801*3da8d17dSfengbojiang(姜凤波) "http proxy status %ui \"%V\"",
1802*3da8d17dSfengbojiang(姜凤波) u->headers_in.status_n, &u->headers_in.status_line);
1803*3da8d17dSfengbojiang(姜凤波)
1804*3da8d17dSfengbojiang(姜凤波) if (ctx->status.http_version < NGX_HTTP_VERSION_11) {
1805*3da8d17dSfengbojiang(姜凤波) u->headers_in.connection_close = 1;
1806*3da8d17dSfengbojiang(姜凤波) }
1807*3da8d17dSfengbojiang(姜凤波)
1808*3da8d17dSfengbojiang(姜凤波) u->process_header = ngx_http_proxy_process_header;
1809*3da8d17dSfengbojiang(姜凤波)
1810*3da8d17dSfengbojiang(姜凤波) return ngx_http_proxy_process_header(r);
1811*3da8d17dSfengbojiang(姜凤波) }
1812*3da8d17dSfengbojiang(姜凤波)
1813*3da8d17dSfengbojiang(姜凤波)
1814*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_process_header(ngx_http_request_t * r)1815*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_process_header(ngx_http_request_t *r)
1816*3da8d17dSfengbojiang(姜凤波) {
1817*3da8d17dSfengbojiang(姜凤波) ngx_int_t rc;
1818*3da8d17dSfengbojiang(姜凤波) ngx_table_elt_t *h;
1819*3da8d17dSfengbojiang(姜凤波) ngx_http_upstream_t *u;
1820*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_ctx_t *ctx;
1821*3da8d17dSfengbojiang(姜凤波) ngx_http_upstream_header_t *hh;
1822*3da8d17dSfengbojiang(姜凤波) ngx_http_upstream_main_conf_t *umcf;
1823*3da8d17dSfengbojiang(姜凤波)
1824*3da8d17dSfengbojiang(姜凤波) umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);
1825*3da8d17dSfengbojiang(姜凤波)
1826*3da8d17dSfengbojiang(姜凤波) for ( ;; ) {
1827*3da8d17dSfengbojiang(姜凤波)
1828*3da8d17dSfengbojiang(姜凤波) rc = ngx_http_parse_header_line(r, &r->upstream->buffer, 1);
1829*3da8d17dSfengbojiang(姜凤波)
1830*3da8d17dSfengbojiang(姜凤波) if (rc == NGX_OK) {
1831*3da8d17dSfengbojiang(姜凤波)
1832*3da8d17dSfengbojiang(姜凤波) /* a header line has been parsed successfully */
1833*3da8d17dSfengbojiang(姜凤波)
1834*3da8d17dSfengbojiang(姜凤波) h = ngx_list_push(&r->upstream->headers_in.headers);
1835*3da8d17dSfengbojiang(姜凤波) if (h == NULL) {
1836*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1837*3da8d17dSfengbojiang(姜凤波) }
1838*3da8d17dSfengbojiang(姜凤波)
1839*3da8d17dSfengbojiang(姜凤波) h->hash = r->header_hash;
1840*3da8d17dSfengbojiang(姜凤波)
1841*3da8d17dSfengbojiang(姜凤波) h->key.len = r->header_name_end - r->header_name_start;
1842*3da8d17dSfengbojiang(姜凤波) h->value.len = r->header_end - r->header_start;
1843*3da8d17dSfengbojiang(姜凤波)
1844*3da8d17dSfengbojiang(姜凤波) h->key.data = ngx_pnalloc(r->pool,
1845*3da8d17dSfengbojiang(姜凤波) h->key.len + 1 + h->value.len + 1 + h->key.len);
1846*3da8d17dSfengbojiang(姜凤波) if (h->key.data == NULL) {
1847*3da8d17dSfengbojiang(姜凤波) h->hash = 0;
1848*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1849*3da8d17dSfengbojiang(姜凤波) }
1850*3da8d17dSfengbojiang(姜凤波)
1851*3da8d17dSfengbojiang(姜凤波) h->value.data = h->key.data + h->key.len + 1;
1852*3da8d17dSfengbojiang(姜凤波) h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;
1853*3da8d17dSfengbojiang(姜凤波)
1854*3da8d17dSfengbojiang(姜凤波) ngx_memcpy(h->key.data, r->header_name_start, h->key.len);
1855*3da8d17dSfengbojiang(姜凤波) h->key.data[h->key.len] = '\0';
1856*3da8d17dSfengbojiang(姜凤波) ngx_memcpy(h->value.data, r->header_start, h->value.len);
1857*3da8d17dSfengbojiang(姜凤波) h->value.data[h->value.len] = '\0';
1858*3da8d17dSfengbojiang(姜凤波)
1859*3da8d17dSfengbojiang(姜凤波) if (h->key.len == r->lowcase_index) {
1860*3da8d17dSfengbojiang(姜凤波) ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);
1861*3da8d17dSfengbojiang(姜凤波)
1862*3da8d17dSfengbojiang(姜凤波) } else {
1863*3da8d17dSfengbojiang(姜凤波) ngx_strlow(h->lowcase_key, h->key.data, h->key.len);
1864*3da8d17dSfengbojiang(姜凤波) }
1865*3da8d17dSfengbojiang(姜凤波)
1866*3da8d17dSfengbojiang(姜凤波) hh = ngx_hash_find(&umcf->headers_in_hash, h->hash,
1867*3da8d17dSfengbojiang(姜凤波) h->lowcase_key, h->key.len);
1868*3da8d17dSfengbojiang(姜凤波)
1869*3da8d17dSfengbojiang(姜凤波) if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {
1870*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1871*3da8d17dSfengbojiang(姜凤波) }
1872*3da8d17dSfengbojiang(姜凤波)
1873*3da8d17dSfengbojiang(姜凤波) ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1874*3da8d17dSfengbojiang(姜凤波) "http proxy header: \"%V: %V\"",
1875*3da8d17dSfengbojiang(姜凤波) &h->key, &h->value);
1876*3da8d17dSfengbojiang(姜凤波)
1877*3da8d17dSfengbojiang(姜凤波) continue;
1878*3da8d17dSfengbojiang(姜凤波) }
1879*3da8d17dSfengbojiang(姜凤波)
1880*3da8d17dSfengbojiang(姜凤波) if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
1881*3da8d17dSfengbojiang(姜凤波)
1882*3da8d17dSfengbojiang(姜凤波) /* a whole header has been parsed successfully */
1883*3da8d17dSfengbojiang(姜凤波)
1884*3da8d17dSfengbojiang(姜凤波) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1885*3da8d17dSfengbojiang(姜凤波) "http proxy header done");
1886*3da8d17dSfengbojiang(姜凤波)
1887*3da8d17dSfengbojiang(姜凤波) /*
1888*3da8d17dSfengbojiang(姜凤波) * if no "Server" and "Date" in header line,
1889*3da8d17dSfengbojiang(姜凤波) * then add the special empty headers
1890*3da8d17dSfengbojiang(姜凤波) */
1891*3da8d17dSfengbojiang(姜凤波)
1892*3da8d17dSfengbojiang(姜凤波) if (r->upstream->headers_in.server == NULL) {
1893*3da8d17dSfengbojiang(姜凤波) h = ngx_list_push(&r->upstream->headers_in.headers);
1894*3da8d17dSfengbojiang(姜凤波) if (h == NULL) {
1895*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1896*3da8d17dSfengbojiang(姜凤波) }
1897*3da8d17dSfengbojiang(姜凤波)
1898*3da8d17dSfengbojiang(姜凤波) h->hash = ngx_hash(ngx_hash(ngx_hash(ngx_hash(
1899*3da8d17dSfengbojiang(姜凤波) ngx_hash('s', 'e'), 'r'), 'v'), 'e'), 'r');
1900*3da8d17dSfengbojiang(姜凤波)
1901*3da8d17dSfengbojiang(姜凤波) ngx_str_set(&h->key, "Server");
1902*3da8d17dSfengbojiang(姜凤波) ngx_str_null(&h->value);
1903*3da8d17dSfengbojiang(姜凤波) h->lowcase_key = (u_char *) "server";
1904*3da8d17dSfengbojiang(姜凤波) }
1905*3da8d17dSfengbojiang(姜凤波)
1906*3da8d17dSfengbojiang(姜凤波) if (r->upstream->headers_in.date == NULL) {
1907*3da8d17dSfengbojiang(姜凤波) h = ngx_list_push(&r->upstream->headers_in.headers);
1908*3da8d17dSfengbojiang(姜凤波) if (h == NULL) {
1909*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1910*3da8d17dSfengbojiang(姜凤波) }
1911*3da8d17dSfengbojiang(姜凤波)
1912*3da8d17dSfengbojiang(姜凤波) h->hash = ngx_hash(ngx_hash(ngx_hash('d', 'a'), 't'), 'e');
1913*3da8d17dSfengbojiang(姜凤波)
1914*3da8d17dSfengbojiang(姜凤波) ngx_str_set(&h->key, "Date");
1915*3da8d17dSfengbojiang(姜凤波) ngx_str_null(&h->value);
1916*3da8d17dSfengbojiang(姜凤波) h->lowcase_key = (u_char *) "date";
1917*3da8d17dSfengbojiang(姜凤波) }
1918*3da8d17dSfengbojiang(姜凤波)
1919*3da8d17dSfengbojiang(姜凤波) /* clear content length if response is chunked */
1920*3da8d17dSfengbojiang(姜凤波)
1921*3da8d17dSfengbojiang(姜凤波) u = r->upstream;
1922*3da8d17dSfengbojiang(姜凤波)
1923*3da8d17dSfengbojiang(姜凤波) if (u->headers_in.chunked) {
1924*3da8d17dSfengbojiang(姜凤波) u->headers_in.content_length_n = -1;
1925*3da8d17dSfengbojiang(姜凤波) }
1926*3da8d17dSfengbojiang(姜凤波)
1927*3da8d17dSfengbojiang(姜凤波) /*
1928*3da8d17dSfengbojiang(姜凤波) * set u->keepalive if response has no body; this allows to keep
1929*3da8d17dSfengbojiang(姜凤波) * connections alive in case of r->header_only or X-Accel-Redirect
1930*3da8d17dSfengbojiang(姜凤波) */
1931*3da8d17dSfengbojiang(姜凤波)
1932*3da8d17dSfengbojiang(姜凤波) ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
1933*3da8d17dSfengbojiang(姜凤波)
1934*3da8d17dSfengbojiang(姜凤波) if (u->headers_in.status_n == NGX_HTTP_NO_CONTENT
1935*3da8d17dSfengbojiang(姜凤波) || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED
1936*3da8d17dSfengbojiang(姜凤波) || ctx->head
1937*3da8d17dSfengbojiang(姜凤波) || (!u->headers_in.chunked
1938*3da8d17dSfengbojiang(姜凤波) && u->headers_in.content_length_n == 0))
1939*3da8d17dSfengbojiang(姜凤波) {
1940*3da8d17dSfengbojiang(姜凤波) u->keepalive = !u->headers_in.connection_close;
1941*3da8d17dSfengbojiang(姜凤波) }
1942*3da8d17dSfengbojiang(姜凤波)
1943*3da8d17dSfengbojiang(姜凤波) if (u->headers_in.status_n == NGX_HTTP_SWITCHING_PROTOCOLS) {
1944*3da8d17dSfengbojiang(姜凤波) u->keepalive = 0;
1945*3da8d17dSfengbojiang(姜凤波)
1946*3da8d17dSfengbojiang(姜凤波) if (r->headers_in.upgrade) {
1947*3da8d17dSfengbojiang(姜凤波) u->upgrade = 1;
1948*3da8d17dSfengbojiang(姜凤波) }
1949*3da8d17dSfengbojiang(姜凤波) }
1950*3da8d17dSfengbojiang(姜凤波)
1951*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
1952*3da8d17dSfengbojiang(姜凤波) }
1953*3da8d17dSfengbojiang(姜凤波)
1954*3da8d17dSfengbojiang(姜凤波) if (rc == NGX_AGAIN) {
1955*3da8d17dSfengbojiang(姜凤波) return NGX_AGAIN;
1956*3da8d17dSfengbojiang(姜凤波) }
1957*3da8d17dSfengbojiang(姜凤波)
1958*3da8d17dSfengbojiang(姜凤波) /* there was error while a header line parsing */
1959*3da8d17dSfengbojiang(姜凤波)
1960*3da8d17dSfengbojiang(姜凤波) ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1961*3da8d17dSfengbojiang(姜凤波) "upstream sent invalid header");
1962*3da8d17dSfengbojiang(姜凤波)
1963*3da8d17dSfengbojiang(姜凤波) return NGX_HTTP_UPSTREAM_INVALID_HEADER;
1964*3da8d17dSfengbojiang(姜凤波) }
1965*3da8d17dSfengbojiang(姜凤波) }
1966*3da8d17dSfengbojiang(姜凤波)
1967*3da8d17dSfengbojiang(姜凤波)
1968*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_input_filter_init(void * data)1969*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_input_filter_init(void *data)
1970*3da8d17dSfengbojiang(姜凤波) {
1971*3da8d17dSfengbojiang(姜凤波) ngx_http_request_t *r = data;
1972*3da8d17dSfengbojiang(姜凤波) ngx_http_upstream_t *u;
1973*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_ctx_t *ctx;
1974*3da8d17dSfengbojiang(姜凤波)
1975*3da8d17dSfengbojiang(姜凤波) u = r->upstream;
1976*3da8d17dSfengbojiang(姜凤波) ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
1977*3da8d17dSfengbojiang(姜凤波)
1978*3da8d17dSfengbojiang(姜凤波) if (ctx == NULL) {
1979*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1980*3da8d17dSfengbojiang(姜凤波) }
1981*3da8d17dSfengbojiang(姜凤波)
1982*3da8d17dSfengbojiang(姜凤波) ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1983*3da8d17dSfengbojiang(姜凤波) "http proxy filter init s:%ui h:%d c:%d l:%O",
1984*3da8d17dSfengbojiang(姜凤波) u->headers_in.status_n, ctx->head, u->headers_in.chunked,
1985*3da8d17dSfengbojiang(姜凤波) u->headers_in.content_length_n);
1986*3da8d17dSfengbojiang(姜凤波)
1987*3da8d17dSfengbojiang(姜凤波) /* as per RFC2616, 4.4 Message Length */
1988*3da8d17dSfengbojiang(姜凤波)
1989*3da8d17dSfengbojiang(姜凤波) if (u->headers_in.status_n == NGX_HTTP_NO_CONTENT
1990*3da8d17dSfengbojiang(姜凤波) || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED
1991*3da8d17dSfengbojiang(姜凤波) || ctx->head)
1992*3da8d17dSfengbojiang(姜凤波) {
1993*3da8d17dSfengbojiang(姜凤波) /* 1xx, 204, and 304 and replies to HEAD requests */
1994*3da8d17dSfengbojiang(姜凤波) /* no 1xx since we don't send Expect and Upgrade */
1995*3da8d17dSfengbojiang(姜凤波)
1996*3da8d17dSfengbojiang(姜凤波) u->pipe->length = 0;
1997*3da8d17dSfengbojiang(姜凤波) u->length = 0;
1998*3da8d17dSfengbojiang(姜凤波) u->keepalive = !u->headers_in.connection_close;
1999*3da8d17dSfengbojiang(姜凤波)
2000*3da8d17dSfengbojiang(姜凤波) } else if (u->headers_in.chunked) {
2001*3da8d17dSfengbojiang(姜凤波) /* chunked */
2002*3da8d17dSfengbojiang(姜凤波)
2003*3da8d17dSfengbojiang(姜凤波) u->pipe->input_filter = ngx_http_proxy_chunked_filter;
2004*3da8d17dSfengbojiang(姜凤波) u->pipe->length = 3; /* "0" LF LF */
2005*3da8d17dSfengbojiang(姜凤波)
2006*3da8d17dSfengbojiang(姜凤波) u->input_filter = ngx_http_proxy_non_buffered_chunked_filter;
2007*3da8d17dSfengbojiang(姜凤波) u->length = 1;
2008*3da8d17dSfengbojiang(姜凤波)
2009*3da8d17dSfengbojiang(姜凤波) } else if (u->headers_in.content_length_n == 0) {
2010*3da8d17dSfengbojiang(姜凤波) /* empty body: special case as filter won't be called */
2011*3da8d17dSfengbojiang(姜凤波)
2012*3da8d17dSfengbojiang(姜凤波) u->pipe->length = 0;
2013*3da8d17dSfengbojiang(姜凤波) u->length = 0;
2014*3da8d17dSfengbojiang(姜凤波) u->keepalive = !u->headers_in.connection_close;
2015*3da8d17dSfengbojiang(姜凤波)
2016*3da8d17dSfengbojiang(姜凤波) } else {
2017*3da8d17dSfengbojiang(姜凤波) /* content length or connection close */
2018*3da8d17dSfengbojiang(姜凤波)
2019*3da8d17dSfengbojiang(姜凤波) u->pipe->length = u->headers_in.content_length_n;
2020*3da8d17dSfengbojiang(姜凤波) u->length = u->headers_in.content_length_n;
2021*3da8d17dSfengbojiang(姜凤波) }
2022*3da8d17dSfengbojiang(姜凤波)
2023*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2024*3da8d17dSfengbojiang(姜凤波) }
2025*3da8d17dSfengbojiang(姜凤波)
2026*3da8d17dSfengbojiang(姜凤波)
2027*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_copy_filter(ngx_event_pipe_t * p,ngx_buf_t * buf)2028*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_copy_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)
2029*3da8d17dSfengbojiang(姜凤波) {
2030*3da8d17dSfengbojiang(姜凤波) ngx_buf_t *b;
2031*3da8d17dSfengbojiang(姜凤波) ngx_chain_t *cl;
2032*3da8d17dSfengbojiang(姜凤波) ngx_http_request_t *r;
2033*3da8d17dSfengbojiang(姜凤波)
2034*3da8d17dSfengbojiang(姜凤波) if (buf->pos == buf->last) {
2035*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2036*3da8d17dSfengbojiang(姜凤波) }
2037*3da8d17dSfengbojiang(姜凤波)
2038*3da8d17dSfengbojiang(姜凤波) cl = ngx_chain_get_free_buf(p->pool, &p->free);
2039*3da8d17dSfengbojiang(姜凤波) if (cl == NULL) {
2040*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2041*3da8d17dSfengbojiang(姜凤波) }
2042*3da8d17dSfengbojiang(姜凤波)
2043*3da8d17dSfengbojiang(姜凤波) b = cl->buf;
2044*3da8d17dSfengbojiang(姜凤波)
2045*3da8d17dSfengbojiang(姜凤波) ngx_memcpy(b, buf, sizeof(ngx_buf_t));
2046*3da8d17dSfengbojiang(姜凤波) b->shadow = buf;
2047*3da8d17dSfengbojiang(姜凤波) b->tag = p->tag;
2048*3da8d17dSfengbojiang(姜凤波) b->last_shadow = 1;
2049*3da8d17dSfengbojiang(姜凤波) b->recycled = 1;
2050*3da8d17dSfengbojiang(姜凤波) buf->shadow = b;
2051*3da8d17dSfengbojiang(姜凤波)
2052*3da8d17dSfengbojiang(姜凤波) ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, "input buf #%d", b->num);
2053*3da8d17dSfengbojiang(姜凤波)
2054*3da8d17dSfengbojiang(姜凤波) if (p->in) {
2055*3da8d17dSfengbojiang(姜凤波) *p->last_in = cl;
2056*3da8d17dSfengbojiang(姜凤波) } else {
2057*3da8d17dSfengbojiang(姜凤波) p->in = cl;
2058*3da8d17dSfengbojiang(姜凤波) }
2059*3da8d17dSfengbojiang(姜凤波) p->last_in = &cl->next;
2060*3da8d17dSfengbojiang(姜凤波)
2061*3da8d17dSfengbojiang(姜凤波) if (p->length == -1) {
2062*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2063*3da8d17dSfengbojiang(姜凤波) }
2064*3da8d17dSfengbojiang(姜凤波)
2065*3da8d17dSfengbojiang(姜凤波) p->length -= b->last - b->pos;
2066*3da8d17dSfengbojiang(姜凤波)
2067*3da8d17dSfengbojiang(姜凤波) if (p->length == 0) {
2068*3da8d17dSfengbojiang(姜凤波) r = p->input_ctx;
2069*3da8d17dSfengbojiang(姜凤波) p->upstream_done = 1;
2070*3da8d17dSfengbojiang(姜凤波) r->upstream->keepalive = !r->upstream->headers_in.connection_close;
2071*3da8d17dSfengbojiang(姜凤波)
2072*3da8d17dSfengbojiang(姜凤波) } else if (p->length < 0) {
2073*3da8d17dSfengbojiang(姜凤波) r = p->input_ctx;
2074*3da8d17dSfengbojiang(姜凤波) p->upstream_done = 1;
2075*3da8d17dSfengbojiang(姜凤波)
2076*3da8d17dSfengbojiang(姜凤波) ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,
2077*3da8d17dSfengbojiang(姜凤波) "upstream sent more data than specified in "
2078*3da8d17dSfengbojiang(姜凤波) "\"Content-Length\" header");
2079*3da8d17dSfengbojiang(姜凤波) }
2080*3da8d17dSfengbojiang(姜凤波)
2081*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2082*3da8d17dSfengbojiang(姜凤波) }
2083*3da8d17dSfengbojiang(姜凤波)
2084*3da8d17dSfengbojiang(姜凤波)
2085*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_chunked_filter(ngx_event_pipe_t * p,ngx_buf_t * buf)2086*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_chunked_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)
2087*3da8d17dSfengbojiang(姜凤波) {
2088*3da8d17dSfengbojiang(姜凤波) ngx_int_t rc;
2089*3da8d17dSfengbojiang(姜凤波) ngx_buf_t *b, **prev;
2090*3da8d17dSfengbojiang(姜凤波) ngx_chain_t *cl;
2091*3da8d17dSfengbojiang(姜凤波) ngx_http_request_t *r;
2092*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_ctx_t *ctx;
2093*3da8d17dSfengbojiang(姜凤波)
2094*3da8d17dSfengbojiang(姜凤波) if (buf->pos == buf->last) {
2095*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2096*3da8d17dSfengbojiang(姜凤波) }
2097*3da8d17dSfengbojiang(姜凤波)
2098*3da8d17dSfengbojiang(姜凤波) r = p->input_ctx;
2099*3da8d17dSfengbojiang(姜凤波) ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
2100*3da8d17dSfengbojiang(姜凤波)
2101*3da8d17dSfengbojiang(姜凤波) if (ctx == NULL) {
2102*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2103*3da8d17dSfengbojiang(姜凤波) }
2104*3da8d17dSfengbojiang(姜凤波)
2105*3da8d17dSfengbojiang(姜凤波) b = NULL;
2106*3da8d17dSfengbojiang(姜凤波) prev = &buf->shadow;
2107*3da8d17dSfengbojiang(姜凤波)
2108*3da8d17dSfengbojiang(姜凤波) for ( ;; ) {
2109*3da8d17dSfengbojiang(姜凤波)
2110*3da8d17dSfengbojiang(姜凤波) rc = ngx_http_parse_chunked(r, buf, &ctx->chunked);
2111*3da8d17dSfengbojiang(姜凤波)
2112*3da8d17dSfengbojiang(姜凤波) if (rc == NGX_OK) {
2113*3da8d17dSfengbojiang(姜凤波)
2114*3da8d17dSfengbojiang(姜凤波) /* a chunk has been parsed successfully */
2115*3da8d17dSfengbojiang(姜凤波)
2116*3da8d17dSfengbojiang(姜凤波) cl = ngx_chain_get_free_buf(p->pool, &p->free);
2117*3da8d17dSfengbojiang(姜凤波) if (cl == NULL) {
2118*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2119*3da8d17dSfengbojiang(姜凤波) }
2120*3da8d17dSfengbojiang(姜凤波)
2121*3da8d17dSfengbojiang(姜凤波) b = cl->buf;
2122*3da8d17dSfengbojiang(姜凤波)
2123*3da8d17dSfengbojiang(姜凤波) ngx_memzero(b, sizeof(ngx_buf_t));
2124*3da8d17dSfengbojiang(姜凤波)
2125*3da8d17dSfengbojiang(姜凤波) b->pos = buf->pos;
2126*3da8d17dSfengbojiang(姜凤波) b->start = buf->start;
2127*3da8d17dSfengbojiang(姜凤波) b->end = buf->end;
2128*3da8d17dSfengbojiang(姜凤波) b->tag = p->tag;
2129*3da8d17dSfengbojiang(姜凤波) b->temporary = 1;
2130*3da8d17dSfengbojiang(姜凤波) b->recycled = 1;
2131*3da8d17dSfengbojiang(姜凤波)
2132*3da8d17dSfengbojiang(姜凤波) *prev = b;
2133*3da8d17dSfengbojiang(姜凤波) prev = &b->shadow;
2134*3da8d17dSfengbojiang(姜凤波)
2135*3da8d17dSfengbojiang(姜凤波) if (p->in) {
2136*3da8d17dSfengbojiang(姜凤波) *p->last_in = cl;
2137*3da8d17dSfengbojiang(姜凤波) } else {
2138*3da8d17dSfengbojiang(姜凤波) p->in = cl;
2139*3da8d17dSfengbojiang(姜凤波) }
2140*3da8d17dSfengbojiang(姜凤波) p->last_in = &cl->next;
2141*3da8d17dSfengbojiang(姜凤波)
2142*3da8d17dSfengbojiang(姜凤波) /* STUB */ b->num = buf->num;
2143*3da8d17dSfengbojiang(姜凤波)
2144*3da8d17dSfengbojiang(姜凤波) ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0,
2145*3da8d17dSfengbojiang(姜凤波) "input buf #%d %p", b->num, b->pos);
2146*3da8d17dSfengbojiang(姜凤波)
2147*3da8d17dSfengbojiang(姜凤波) if (buf->last - buf->pos >= ctx->chunked.size) {
2148*3da8d17dSfengbojiang(姜凤波)
2149*3da8d17dSfengbojiang(姜凤波) buf->pos += (size_t) ctx->chunked.size;
2150*3da8d17dSfengbojiang(姜凤波) b->last = buf->pos;
2151*3da8d17dSfengbojiang(姜凤波) ctx->chunked.size = 0;
2152*3da8d17dSfengbojiang(姜凤波)
2153*3da8d17dSfengbojiang(姜凤波) continue;
2154*3da8d17dSfengbojiang(姜凤波) }
2155*3da8d17dSfengbojiang(姜凤波)
2156*3da8d17dSfengbojiang(姜凤波) ctx->chunked.size -= buf->last - buf->pos;
2157*3da8d17dSfengbojiang(姜凤波) buf->pos = buf->last;
2158*3da8d17dSfengbojiang(姜凤波) b->last = buf->last;
2159*3da8d17dSfengbojiang(姜凤波)
2160*3da8d17dSfengbojiang(姜凤波) continue;
2161*3da8d17dSfengbojiang(姜凤波) }
2162*3da8d17dSfengbojiang(姜凤波)
2163*3da8d17dSfengbojiang(姜凤波) if (rc == NGX_DONE) {
2164*3da8d17dSfengbojiang(姜凤波)
2165*3da8d17dSfengbojiang(姜凤波) /* a whole response has been parsed successfully */
2166*3da8d17dSfengbojiang(姜凤波)
2167*3da8d17dSfengbojiang(姜凤波) p->upstream_done = 1;
2168*3da8d17dSfengbojiang(姜凤波) r->upstream->keepalive = !r->upstream->headers_in.connection_close;
2169*3da8d17dSfengbojiang(姜凤波)
2170*3da8d17dSfengbojiang(姜凤波) break;
2171*3da8d17dSfengbojiang(姜凤波) }
2172*3da8d17dSfengbojiang(姜凤波)
2173*3da8d17dSfengbojiang(姜凤波) if (rc == NGX_AGAIN) {
2174*3da8d17dSfengbojiang(姜凤波)
2175*3da8d17dSfengbojiang(姜凤波) /* set p->length, minimal amount of data we want to see */
2176*3da8d17dSfengbojiang(姜凤波)
2177*3da8d17dSfengbojiang(姜凤波) p->length = ctx->chunked.length;
2178*3da8d17dSfengbojiang(姜凤波)
2179*3da8d17dSfengbojiang(姜凤波) break;
2180*3da8d17dSfengbojiang(姜凤波) }
2181*3da8d17dSfengbojiang(姜凤波)
2182*3da8d17dSfengbojiang(姜凤波) /* invalid response */
2183*3da8d17dSfengbojiang(姜凤波)
2184*3da8d17dSfengbojiang(姜凤波) ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2185*3da8d17dSfengbojiang(姜凤波) "upstream sent invalid chunked response");
2186*3da8d17dSfengbojiang(姜凤波)
2187*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2188*3da8d17dSfengbojiang(姜凤波) }
2189*3da8d17dSfengbojiang(姜凤波)
2190*3da8d17dSfengbojiang(姜凤波) ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2191*3da8d17dSfengbojiang(姜凤波) "http proxy chunked state %ui, length %O",
2192*3da8d17dSfengbojiang(姜凤波) ctx->chunked.state, p->length);
2193*3da8d17dSfengbojiang(姜凤波)
2194*3da8d17dSfengbojiang(姜凤波) if (b) {
2195*3da8d17dSfengbojiang(姜凤波) b->shadow = buf;
2196*3da8d17dSfengbojiang(姜凤波) b->last_shadow = 1;
2197*3da8d17dSfengbojiang(姜凤波)
2198*3da8d17dSfengbojiang(姜凤波) ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0,
2199*3da8d17dSfengbojiang(姜凤波) "input buf %p %z", b->pos, b->last - b->pos);
2200*3da8d17dSfengbojiang(姜凤波)
2201*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2202*3da8d17dSfengbojiang(姜凤波) }
2203*3da8d17dSfengbojiang(姜凤波)
2204*3da8d17dSfengbojiang(姜凤波) /* there is no data record in the buf, add it to free chain */
2205*3da8d17dSfengbojiang(姜凤波)
2206*3da8d17dSfengbojiang(姜凤波) if (ngx_event_pipe_add_free_buf(p, buf) != NGX_OK) {
2207*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2208*3da8d17dSfengbojiang(姜凤波) }
2209*3da8d17dSfengbojiang(姜凤波)
2210*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2211*3da8d17dSfengbojiang(姜凤波) }
2212*3da8d17dSfengbojiang(姜凤波)
2213*3da8d17dSfengbojiang(姜凤波)
2214*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_non_buffered_copy_filter(void * data,ssize_t bytes)2215*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_non_buffered_copy_filter(void *data, ssize_t bytes)
2216*3da8d17dSfengbojiang(姜凤波) {
2217*3da8d17dSfengbojiang(姜凤波) ngx_http_request_t *r = data;
2218*3da8d17dSfengbojiang(姜凤波)
2219*3da8d17dSfengbojiang(姜凤波) ngx_buf_t *b;
2220*3da8d17dSfengbojiang(姜凤波) ngx_chain_t *cl, **ll;
2221*3da8d17dSfengbojiang(姜凤波) ngx_http_upstream_t *u;
2222*3da8d17dSfengbojiang(姜凤波)
2223*3da8d17dSfengbojiang(姜凤波) u = r->upstream;
2224*3da8d17dSfengbojiang(姜凤波)
2225*3da8d17dSfengbojiang(姜凤波) for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {
2226*3da8d17dSfengbojiang(姜凤波) ll = &cl->next;
2227*3da8d17dSfengbojiang(姜凤波) }
2228*3da8d17dSfengbojiang(姜凤波)
2229*3da8d17dSfengbojiang(姜凤波) cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);
2230*3da8d17dSfengbojiang(姜凤波) if (cl == NULL) {
2231*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2232*3da8d17dSfengbojiang(姜凤波) }
2233*3da8d17dSfengbojiang(姜凤波)
2234*3da8d17dSfengbojiang(姜凤波) *ll = cl;
2235*3da8d17dSfengbojiang(姜凤波)
2236*3da8d17dSfengbojiang(姜凤波) cl->buf->flush = 1;
2237*3da8d17dSfengbojiang(姜凤波) cl->buf->memory = 1;
2238*3da8d17dSfengbojiang(姜凤波)
2239*3da8d17dSfengbojiang(姜凤波) b = &u->buffer;
2240*3da8d17dSfengbojiang(姜凤波)
2241*3da8d17dSfengbojiang(姜凤波) cl->buf->pos = b->last;
2242*3da8d17dSfengbojiang(姜凤波) b->last += bytes;
2243*3da8d17dSfengbojiang(姜凤波) cl->buf->last = b->last;
2244*3da8d17dSfengbojiang(姜凤波) cl->buf->tag = u->output.tag;
2245*3da8d17dSfengbojiang(姜凤波)
2246*3da8d17dSfengbojiang(姜凤波) if (u->length == -1) {
2247*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2248*3da8d17dSfengbojiang(姜凤波) }
2249*3da8d17dSfengbojiang(姜凤波)
2250*3da8d17dSfengbojiang(姜凤波) u->length -= bytes;
2251*3da8d17dSfengbojiang(姜凤波)
2252*3da8d17dSfengbojiang(姜凤波) if (u->length == 0) {
2253*3da8d17dSfengbojiang(姜凤波) u->keepalive = !u->headers_in.connection_close;
2254*3da8d17dSfengbojiang(姜凤波) }
2255*3da8d17dSfengbojiang(姜凤波)
2256*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2257*3da8d17dSfengbojiang(姜凤波) }
2258*3da8d17dSfengbojiang(姜凤波)
2259*3da8d17dSfengbojiang(姜凤波)
2260*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_non_buffered_chunked_filter(void * data,ssize_t bytes)2261*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_non_buffered_chunked_filter(void *data, ssize_t bytes)
2262*3da8d17dSfengbojiang(姜凤波) {
2263*3da8d17dSfengbojiang(姜凤波) ngx_http_request_t *r = data;
2264*3da8d17dSfengbojiang(姜凤波)
2265*3da8d17dSfengbojiang(姜凤波) ngx_int_t rc;
2266*3da8d17dSfengbojiang(姜凤波) ngx_buf_t *b, *buf;
2267*3da8d17dSfengbojiang(姜凤波) ngx_chain_t *cl, **ll;
2268*3da8d17dSfengbojiang(姜凤波) ngx_http_upstream_t *u;
2269*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_ctx_t *ctx;
2270*3da8d17dSfengbojiang(姜凤波)
2271*3da8d17dSfengbojiang(姜凤波) ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
2272*3da8d17dSfengbojiang(姜凤波)
2273*3da8d17dSfengbojiang(姜凤波) if (ctx == NULL) {
2274*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2275*3da8d17dSfengbojiang(姜凤波) }
2276*3da8d17dSfengbojiang(姜凤波)
2277*3da8d17dSfengbojiang(姜凤波) u = r->upstream;
2278*3da8d17dSfengbojiang(姜凤波) buf = &u->buffer;
2279*3da8d17dSfengbojiang(姜凤波)
2280*3da8d17dSfengbojiang(姜凤波) buf->pos = buf->last;
2281*3da8d17dSfengbojiang(姜凤波) buf->last += bytes;
2282*3da8d17dSfengbojiang(姜凤波)
2283*3da8d17dSfengbojiang(姜凤波) for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {
2284*3da8d17dSfengbojiang(姜凤波) ll = &cl->next;
2285*3da8d17dSfengbojiang(姜凤波) }
2286*3da8d17dSfengbojiang(姜凤波)
2287*3da8d17dSfengbojiang(姜凤波) for ( ;; ) {
2288*3da8d17dSfengbojiang(姜凤波)
2289*3da8d17dSfengbojiang(姜凤波) rc = ngx_http_parse_chunked(r, buf, &ctx->chunked);
2290*3da8d17dSfengbojiang(姜凤波)
2291*3da8d17dSfengbojiang(姜凤波) if (rc == NGX_OK) {
2292*3da8d17dSfengbojiang(姜凤波)
2293*3da8d17dSfengbojiang(姜凤波) /* a chunk has been parsed successfully */
2294*3da8d17dSfengbojiang(姜凤波)
2295*3da8d17dSfengbojiang(姜凤波) cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);
2296*3da8d17dSfengbojiang(姜凤波) if (cl == NULL) {
2297*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2298*3da8d17dSfengbojiang(姜凤波) }
2299*3da8d17dSfengbojiang(姜凤波)
2300*3da8d17dSfengbojiang(姜凤波) *ll = cl;
2301*3da8d17dSfengbojiang(姜凤波) ll = &cl->next;
2302*3da8d17dSfengbojiang(姜凤波)
2303*3da8d17dSfengbojiang(姜凤波) b = cl->buf;
2304*3da8d17dSfengbojiang(姜凤波)
2305*3da8d17dSfengbojiang(姜凤波) b->flush = 1;
2306*3da8d17dSfengbojiang(姜凤波) b->memory = 1;
2307*3da8d17dSfengbojiang(姜凤波)
2308*3da8d17dSfengbojiang(姜凤波) b->pos = buf->pos;
2309*3da8d17dSfengbojiang(姜凤波) b->tag = u->output.tag;
2310*3da8d17dSfengbojiang(姜凤波)
2311*3da8d17dSfengbojiang(姜凤波) if (buf->last - buf->pos >= ctx->chunked.size) {
2312*3da8d17dSfengbojiang(姜凤波) buf->pos += (size_t) ctx->chunked.size;
2313*3da8d17dSfengbojiang(姜凤波) b->last = buf->pos;
2314*3da8d17dSfengbojiang(姜凤波) ctx->chunked.size = 0;
2315*3da8d17dSfengbojiang(姜凤波)
2316*3da8d17dSfengbojiang(姜凤波) } else {
2317*3da8d17dSfengbojiang(姜凤波) ctx->chunked.size -= buf->last - buf->pos;
2318*3da8d17dSfengbojiang(姜凤波) buf->pos = buf->last;
2319*3da8d17dSfengbojiang(姜凤波) b->last = buf->last;
2320*3da8d17dSfengbojiang(姜凤波) }
2321*3da8d17dSfengbojiang(姜凤波)
2322*3da8d17dSfengbojiang(姜凤波) ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2323*3da8d17dSfengbojiang(姜凤波) "http proxy out buf %p %z",
2324*3da8d17dSfengbojiang(姜凤波) b->pos, b->last - b->pos);
2325*3da8d17dSfengbojiang(姜凤波)
2326*3da8d17dSfengbojiang(姜凤波) continue;
2327*3da8d17dSfengbojiang(姜凤波) }
2328*3da8d17dSfengbojiang(姜凤波)
2329*3da8d17dSfengbojiang(姜凤波) if (rc == NGX_DONE) {
2330*3da8d17dSfengbojiang(姜凤波)
2331*3da8d17dSfengbojiang(姜凤波) /* a whole response has been parsed successfully */
2332*3da8d17dSfengbojiang(姜凤波)
2333*3da8d17dSfengbojiang(姜凤波) u->keepalive = !u->headers_in.connection_close;
2334*3da8d17dSfengbojiang(姜凤波) u->length = 0;
2335*3da8d17dSfengbojiang(姜凤波)
2336*3da8d17dSfengbojiang(姜凤波) break;
2337*3da8d17dSfengbojiang(姜凤波) }
2338*3da8d17dSfengbojiang(姜凤波)
2339*3da8d17dSfengbojiang(姜凤波) if (rc == NGX_AGAIN) {
2340*3da8d17dSfengbojiang(姜凤波) break;
2341*3da8d17dSfengbojiang(姜凤波) }
2342*3da8d17dSfengbojiang(姜凤波)
2343*3da8d17dSfengbojiang(姜凤波) /* invalid response */
2344*3da8d17dSfengbojiang(姜凤波)
2345*3da8d17dSfengbojiang(姜凤波) ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2346*3da8d17dSfengbojiang(姜凤波) "upstream sent invalid chunked response");
2347*3da8d17dSfengbojiang(姜凤波)
2348*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2349*3da8d17dSfengbojiang(姜凤波) }
2350*3da8d17dSfengbojiang(姜凤波)
2351*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2352*3da8d17dSfengbojiang(姜凤波) }
2353*3da8d17dSfengbojiang(姜凤波)
2354*3da8d17dSfengbojiang(姜凤波)
2355*3da8d17dSfengbojiang(姜凤波) static void
ngx_http_proxy_abort_request(ngx_http_request_t * r)2356*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_abort_request(ngx_http_request_t *r)
2357*3da8d17dSfengbojiang(姜凤波) {
2358*3da8d17dSfengbojiang(姜凤波) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2359*3da8d17dSfengbojiang(姜凤波) "abort http proxy request");
2360*3da8d17dSfengbojiang(姜凤波)
2361*3da8d17dSfengbojiang(姜凤波) return;
2362*3da8d17dSfengbojiang(姜凤波) }
2363*3da8d17dSfengbojiang(姜凤波)
2364*3da8d17dSfengbojiang(姜凤波)
2365*3da8d17dSfengbojiang(姜凤波) static void
ngx_http_proxy_finalize_request(ngx_http_request_t * r,ngx_int_t rc)2366*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
2367*3da8d17dSfengbojiang(姜凤波) {
2368*3da8d17dSfengbojiang(姜凤波) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2369*3da8d17dSfengbojiang(姜凤波) "finalize http proxy request");
2370*3da8d17dSfengbojiang(姜凤波)
2371*3da8d17dSfengbojiang(姜凤波) return;
2372*3da8d17dSfengbojiang(姜凤波) }
2373*3da8d17dSfengbojiang(姜凤波)
2374*3da8d17dSfengbojiang(姜凤波)
2375*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_host_variable(ngx_http_request_t * r,ngx_http_variable_value_t * v,uintptr_t data)2376*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_host_variable(ngx_http_request_t *r,
2377*3da8d17dSfengbojiang(姜凤波) ngx_http_variable_value_t *v, uintptr_t data)
2378*3da8d17dSfengbojiang(姜凤波) {
2379*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_ctx_t *ctx;
2380*3da8d17dSfengbojiang(姜凤波)
2381*3da8d17dSfengbojiang(姜凤波) ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
2382*3da8d17dSfengbojiang(姜凤波)
2383*3da8d17dSfengbojiang(姜凤波) if (ctx == NULL) {
2384*3da8d17dSfengbojiang(姜凤波) v->not_found = 1;
2385*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2386*3da8d17dSfengbojiang(姜凤波) }
2387*3da8d17dSfengbojiang(姜凤波)
2388*3da8d17dSfengbojiang(姜凤波) v->len = ctx->vars.host_header.len;
2389*3da8d17dSfengbojiang(姜凤波) v->valid = 1;
2390*3da8d17dSfengbojiang(姜凤波) v->no_cacheable = 0;
2391*3da8d17dSfengbojiang(姜凤波) v->not_found = 0;
2392*3da8d17dSfengbojiang(姜凤波) v->data = ctx->vars.host_header.data;
2393*3da8d17dSfengbojiang(姜凤波)
2394*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2395*3da8d17dSfengbojiang(姜凤波) }
2396*3da8d17dSfengbojiang(姜凤波)
2397*3da8d17dSfengbojiang(姜凤波)
2398*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_port_variable(ngx_http_request_t * r,ngx_http_variable_value_t * v,uintptr_t data)2399*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_port_variable(ngx_http_request_t *r,
2400*3da8d17dSfengbojiang(姜凤波) ngx_http_variable_value_t *v, uintptr_t data)
2401*3da8d17dSfengbojiang(姜凤波) {
2402*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_ctx_t *ctx;
2403*3da8d17dSfengbojiang(姜凤波)
2404*3da8d17dSfengbojiang(姜凤波) ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
2405*3da8d17dSfengbojiang(姜凤波)
2406*3da8d17dSfengbojiang(姜凤波) if (ctx == NULL) {
2407*3da8d17dSfengbojiang(姜凤波) v->not_found = 1;
2408*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2409*3da8d17dSfengbojiang(姜凤波) }
2410*3da8d17dSfengbojiang(姜凤波)
2411*3da8d17dSfengbojiang(姜凤波) v->len = ctx->vars.port.len;
2412*3da8d17dSfengbojiang(姜凤波) v->valid = 1;
2413*3da8d17dSfengbojiang(姜凤波) v->no_cacheable = 0;
2414*3da8d17dSfengbojiang(姜凤波) v->not_found = 0;
2415*3da8d17dSfengbojiang(姜凤波) v->data = ctx->vars.port.data;
2416*3da8d17dSfengbojiang(姜凤波)
2417*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2418*3da8d17dSfengbojiang(姜凤波) }
2419*3da8d17dSfengbojiang(姜凤波)
2420*3da8d17dSfengbojiang(姜凤波)
2421*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t * r,ngx_http_variable_value_t * v,uintptr_t data)2422*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t *r,
2423*3da8d17dSfengbojiang(姜凤波) ngx_http_variable_value_t *v, uintptr_t data)
2424*3da8d17dSfengbojiang(姜凤波) {
2425*3da8d17dSfengbojiang(姜凤波) size_t len;
2426*3da8d17dSfengbojiang(姜凤波) u_char *p;
2427*3da8d17dSfengbojiang(姜凤波) ngx_uint_t i, n;
2428*3da8d17dSfengbojiang(姜凤波) ngx_table_elt_t **h;
2429*3da8d17dSfengbojiang(姜凤波)
2430*3da8d17dSfengbojiang(姜凤波) v->valid = 1;
2431*3da8d17dSfengbojiang(姜凤波) v->no_cacheable = 0;
2432*3da8d17dSfengbojiang(姜凤波) v->not_found = 0;
2433*3da8d17dSfengbojiang(姜凤波)
2434*3da8d17dSfengbojiang(姜凤波) n = r->headers_in.x_forwarded_for.nelts;
2435*3da8d17dSfengbojiang(姜凤波) h = r->headers_in.x_forwarded_for.elts;
2436*3da8d17dSfengbojiang(姜凤波)
2437*3da8d17dSfengbojiang(姜凤波) len = 0;
2438*3da8d17dSfengbojiang(姜凤波)
2439*3da8d17dSfengbojiang(姜凤波) for (i = 0; i < n; i++) {
2440*3da8d17dSfengbojiang(姜凤波) len += h[i]->value.len + sizeof(", ") - 1;
2441*3da8d17dSfengbojiang(姜凤波) }
2442*3da8d17dSfengbojiang(姜凤波)
2443*3da8d17dSfengbojiang(姜凤波) if (len == 0) {
2444*3da8d17dSfengbojiang(姜凤波) v->len = r->connection->addr_text.len;
2445*3da8d17dSfengbojiang(姜凤波) v->data = r->connection->addr_text.data;
2446*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2447*3da8d17dSfengbojiang(姜凤波) }
2448*3da8d17dSfengbojiang(姜凤波)
2449*3da8d17dSfengbojiang(姜凤波) len += r->connection->addr_text.len;
2450*3da8d17dSfengbojiang(姜凤波)
2451*3da8d17dSfengbojiang(姜凤波) p = ngx_pnalloc(r->pool, len);
2452*3da8d17dSfengbojiang(姜凤波) if (p == NULL) {
2453*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2454*3da8d17dSfengbojiang(姜凤波) }
2455*3da8d17dSfengbojiang(姜凤波)
2456*3da8d17dSfengbojiang(姜凤波) v->len = len;
2457*3da8d17dSfengbojiang(姜凤波) v->data = p;
2458*3da8d17dSfengbojiang(姜凤波)
2459*3da8d17dSfengbojiang(姜凤波) for (i = 0; i < n; i++) {
2460*3da8d17dSfengbojiang(姜凤波) p = ngx_copy(p, h[i]->value.data, h[i]->value.len);
2461*3da8d17dSfengbojiang(姜凤波) *p++ = ','; *p++ = ' ';
2462*3da8d17dSfengbojiang(姜凤波) }
2463*3da8d17dSfengbojiang(姜凤波)
2464*3da8d17dSfengbojiang(姜凤波) ngx_memcpy(p, r->connection->addr_text.data, r->connection->addr_text.len);
2465*3da8d17dSfengbojiang(姜凤波)
2466*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2467*3da8d17dSfengbojiang(姜凤波) }
2468*3da8d17dSfengbojiang(姜凤波)
2469*3da8d17dSfengbojiang(姜凤波)
2470*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_internal_body_length_variable(ngx_http_request_t * r,ngx_http_variable_value_t * v,uintptr_t data)2471*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_internal_body_length_variable(ngx_http_request_t *r,
2472*3da8d17dSfengbojiang(姜凤波) ngx_http_variable_value_t *v, uintptr_t data)
2473*3da8d17dSfengbojiang(姜凤波) {
2474*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_ctx_t *ctx;
2475*3da8d17dSfengbojiang(姜凤波)
2476*3da8d17dSfengbojiang(姜凤波) ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
2477*3da8d17dSfengbojiang(姜凤波)
2478*3da8d17dSfengbojiang(姜凤波) if (ctx == NULL || ctx->internal_body_length < 0) {
2479*3da8d17dSfengbojiang(姜凤波) v->not_found = 1;
2480*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2481*3da8d17dSfengbojiang(姜凤波) }
2482*3da8d17dSfengbojiang(姜凤波)
2483*3da8d17dSfengbojiang(姜凤波) v->valid = 1;
2484*3da8d17dSfengbojiang(姜凤波) v->no_cacheable = 0;
2485*3da8d17dSfengbojiang(姜凤波) v->not_found = 0;
2486*3da8d17dSfengbojiang(姜凤波)
2487*3da8d17dSfengbojiang(姜凤波) v->data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN);
2488*3da8d17dSfengbojiang(姜凤波)
2489*3da8d17dSfengbojiang(姜凤波) if (v->data == NULL) {
2490*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2491*3da8d17dSfengbojiang(姜凤波) }
2492*3da8d17dSfengbojiang(姜凤波)
2493*3da8d17dSfengbojiang(姜凤波) v->len = ngx_sprintf(v->data, "%O", ctx->internal_body_length) - v->data;
2494*3da8d17dSfengbojiang(姜凤波)
2495*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2496*3da8d17dSfengbojiang(姜凤波) }
2497*3da8d17dSfengbojiang(姜凤波)
2498*3da8d17dSfengbojiang(姜凤波)
2499*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_internal_chunked_variable(ngx_http_request_t * r,ngx_http_variable_value_t * v,uintptr_t data)2500*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_internal_chunked_variable(ngx_http_request_t *r,
2501*3da8d17dSfengbojiang(姜凤波) ngx_http_variable_value_t *v, uintptr_t data)
2502*3da8d17dSfengbojiang(姜凤波) {
2503*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_ctx_t *ctx;
2504*3da8d17dSfengbojiang(姜凤波)
2505*3da8d17dSfengbojiang(姜凤波) ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
2506*3da8d17dSfengbojiang(姜凤波)
2507*3da8d17dSfengbojiang(姜凤波) if (ctx == NULL || !ctx->internal_chunked) {
2508*3da8d17dSfengbojiang(姜凤波) v->not_found = 1;
2509*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2510*3da8d17dSfengbojiang(姜凤波) }
2511*3da8d17dSfengbojiang(姜凤波)
2512*3da8d17dSfengbojiang(姜凤波) v->valid = 1;
2513*3da8d17dSfengbojiang(姜凤波) v->no_cacheable = 0;
2514*3da8d17dSfengbojiang(姜凤波) v->not_found = 0;
2515*3da8d17dSfengbojiang(姜凤波)
2516*3da8d17dSfengbojiang(姜凤波) v->data = (u_char *) "chunked";
2517*3da8d17dSfengbojiang(姜凤波) v->len = sizeof("chunked") - 1;
2518*3da8d17dSfengbojiang(姜凤波)
2519*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2520*3da8d17dSfengbojiang(姜凤波) }
2521*3da8d17dSfengbojiang(姜凤波)
2522*3da8d17dSfengbojiang(姜凤波)
2523*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_rewrite_redirect(ngx_http_request_t * r,ngx_table_elt_t * h,size_t prefix)2524*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_rewrite_redirect(ngx_http_request_t *r, ngx_table_elt_t *h,
2525*3da8d17dSfengbojiang(姜凤波) size_t prefix)
2526*3da8d17dSfengbojiang(姜凤波) {
2527*3da8d17dSfengbojiang(姜凤波) size_t len;
2528*3da8d17dSfengbojiang(姜凤波) ngx_int_t rc;
2529*3da8d17dSfengbojiang(姜凤波) ngx_uint_t i;
2530*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_rewrite_t *pr;
2531*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *plcf;
2532*3da8d17dSfengbojiang(姜凤波)
2533*3da8d17dSfengbojiang(姜凤波) plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);
2534*3da8d17dSfengbojiang(姜凤波)
2535*3da8d17dSfengbojiang(姜凤波) pr = plcf->redirects->elts;
2536*3da8d17dSfengbojiang(姜凤波)
2537*3da8d17dSfengbojiang(姜凤波) if (pr == NULL) {
2538*3da8d17dSfengbojiang(姜凤波) return NGX_DECLINED;
2539*3da8d17dSfengbojiang(姜凤波) }
2540*3da8d17dSfengbojiang(姜凤波)
2541*3da8d17dSfengbojiang(姜凤波) len = h->value.len - prefix;
2542*3da8d17dSfengbojiang(姜凤波)
2543*3da8d17dSfengbojiang(姜凤波) for (i = 0; i < plcf->redirects->nelts; i++) {
2544*3da8d17dSfengbojiang(姜凤波) rc = pr[i].handler(r, h, prefix, len, &pr[i]);
2545*3da8d17dSfengbojiang(姜凤波)
2546*3da8d17dSfengbojiang(姜凤波) if (rc != NGX_DECLINED) {
2547*3da8d17dSfengbojiang(姜凤波) return rc;
2548*3da8d17dSfengbojiang(姜凤波) }
2549*3da8d17dSfengbojiang(姜凤波) }
2550*3da8d17dSfengbojiang(姜凤波)
2551*3da8d17dSfengbojiang(姜凤波) return NGX_DECLINED;
2552*3da8d17dSfengbojiang(姜凤波) }
2553*3da8d17dSfengbojiang(姜凤波)
2554*3da8d17dSfengbojiang(姜凤波)
2555*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_rewrite_cookie(ngx_http_request_t * r,ngx_table_elt_t * h)2556*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_rewrite_cookie(ngx_http_request_t *r, ngx_table_elt_t *h)
2557*3da8d17dSfengbojiang(姜凤波) {
2558*3da8d17dSfengbojiang(姜凤波) size_t prefix;
2559*3da8d17dSfengbojiang(姜凤波) u_char *p;
2560*3da8d17dSfengbojiang(姜凤波) ngx_int_t rc, rv;
2561*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *plcf;
2562*3da8d17dSfengbojiang(姜凤波)
2563*3da8d17dSfengbojiang(姜凤波) p = (u_char *) ngx_strchr(h->value.data, ';');
2564*3da8d17dSfengbojiang(姜凤波) if (p == NULL) {
2565*3da8d17dSfengbojiang(姜凤波) return NGX_DECLINED;
2566*3da8d17dSfengbojiang(姜凤波) }
2567*3da8d17dSfengbojiang(姜凤波)
2568*3da8d17dSfengbojiang(姜凤波) prefix = p + 1 - h->value.data;
2569*3da8d17dSfengbojiang(姜凤波)
2570*3da8d17dSfengbojiang(姜凤波) rv = NGX_DECLINED;
2571*3da8d17dSfengbojiang(姜凤波)
2572*3da8d17dSfengbojiang(姜凤波) plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);
2573*3da8d17dSfengbojiang(姜凤波)
2574*3da8d17dSfengbojiang(姜凤波) if (plcf->cookie_domains) {
2575*3da8d17dSfengbojiang(姜凤波) p = ngx_strcasestrn(h->value.data + prefix, "domain=", 7 - 1);
2576*3da8d17dSfengbojiang(姜凤波)
2577*3da8d17dSfengbojiang(姜凤波) if (p) {
2578*3da8d17dSfengbojiang(姜凤波) rc = ngx_http_proxy_rewrite_cookie_value(r, h, p + 7,
2579*3da8d17dSfengbojiang(姜凤波) plcf->cookie_domains);
2580*3da8d17dSfengbojiang(姜凤波) if (rc == NGX_ERROR) {
2581*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2582*3da8d17dSfengbojiang(姜凤波) }
2583*3da8d17dSfengbojiang(姜凤波)
2584*3da8d17dSfengbojiang(姜凤波) if (rc != NGX_DECLINED) {
2585*3da8d17dSfengbojiang(姜凤波) rv = rc;
2586*3da8d17dSfengbojiang(姜凤波) }
2587*3da8d17dSfengbojiang(姜凤波) }
2588*3da8d17dSfengbojiang(姜凤波) }
2589*3da8d17dSfengbojiang(姜凤波)
2590*3da8d17dSfengbojiang(姜凤波) if (plcf->cookie_paths) {
2591*3da8d17dSfengbojiang(姜凤波) p = ngx_strcasestrn(h->value.data + prefix, "path=", 5 - 1);
2592*3da8d17dSfengbojiang(姜凤波)
2593*3da8d17dSfengbojiang(姜凤波) if (p) {
2594*3da8d17dSfengbojiang(姜凤波) rc = ngx_http_proxy_rewrite_cookie_value(r, h, p + 5,
2595*3da8d17dSfengbojiang(姜凤波) plcf->cookie_paths);
2596*3da8d17dSfengbojiang(姜凤波) if (rc == NGX_ERROR) {
2597*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2598*3da8d17dSfengbojiang(姜凤波) }
2599*3da8d17dSfengbojiang(姜凤波)
2600*3da8d17dSfengbojiang(姜凤波) if (rc != NGX_DECLINED) {
2601*3da8d17dSfengbojiang(姜凤波) rv = rc;
2602*3da8d17dSfengbojiang(姜凤波) }
2603*3da8d17dSfengbojiang(姜凤波) }
2604*3da8d17dSfengbojiang(姜凤波) }
2605*3da8d17dSfengbojiang(姜凤波)
2606*3da8d17dSfengbojiang(姜凤波) return rv;
2607*3da8d17dSfengbojiang(姜凤波) }
2608*3da8d17dSfengbojiang(姜凤波)
2609*3da8d17dSfengbojiang(姜凤波)
2610*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_rewrite_cookie_value(ngx_http_request_t * r,ngx_table_elt_t * h,u_char * value,ngx_array_t * rewrites)2611*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_rewrite_cookie_value(ngx_http_request_t *r, ngx_table_elt_t *h,
2612*3da8d17dSfengbojiang(姜凤波) u_char *value, ngx_array_t *rewrites)
2613*3da8d17dSfengbojiang(姜凤波) {
2614*3da8d17dSfengbojiang(姜凤波) size_t len, prefix;
2615*3da8d17dSfengbojiang(姜凤波) u_char *p;
2616*3da8d17dSfengbojiang(姜凤波) ngx_int_t rc;
2617*3da8d17dSfengbojiang(姜凤波) ngx_uint_t i;
2618*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_rewrite_t *pr;
2619*3da8d17dSfengbojiang(姜凤波)
2620*3da8d17dSfengbojiang(姜凤波) prefix = value - h->value.data;
2621*3da8d17dSfengbojiang(姜凤波)
2622*3da8d17dSfengbojiang(姜凤波) p = (u_char *) ngx_strchr(value, ';');
2623*3da8d17dSfengbojiang(姜凤波)
2624*3da8d17dSfengbojiang(姜凤波) len = p ? (size_t) (p - value) : (h->value.len - prefix);
2625*3da8d17dSfengbojiang(姜凤波)
2626*3da8d17dSfengbojiang(姜凤波) pr = rewrites->elts;
2627*3da8d17dSfengbojiang(姜凤波)
2628*3da8d17dSfengbojiang(姜凤波) for (i = 0; i < rewrites->nelts; i++) {
2629*3da8d17dSfengbojiang(姜凤波) rc = pr[i].handler(r, h, prefix, len, &pr[i]);
2630*3da8d17dSfengbojiang(姜凤波)
2631*3da8d17dSfengbojiang(姜凤波) if (rc != NGX_DECLINED) {
2632*3da8d17dSfengbojiang(姜凤波) return rc;
2633*3da8d17dSfengbojiang(姜凤波) }
2634*3da8d17dSfengbojiang(姜凤波) }
2635*3da8d17dSfengbojiang(姜凤波)
2636*3da8d17dSfengbojiang(姜凤波) return NGX_DECLINED;
2637*3da8d17dSfengbojiang(姜凤波) }
2638*3da8d17dSfengbojiang(姜凤波)
2639*3da8d17dSfengbojiang(姜凤波)
2640*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_rewrite_complex_handler(ngx_http_request_t * r,ngx_table_elt_t * h,size_t prefix,size_t len,ngx_http_proxy_rewrite_t * pr)2641*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_rewrite_complex_handler(ngx_http_request_t *r,
2642*3da8d17dSfengbojiang(姜凤波) ngx_table_elt_t *h, size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)
2643*3da8d17dSfengbojiang(姜凤波) {
2644*3da8d17dSfengbojiang(姜凤波) ngx_str_t pattern, replacement;
2645*3da8d17dSfengbojiang(姜凤波)
2646*3da8d17dSfengbojiang(姜凤波) if (ngx_http_complex_value(r, &pr->pattern.complex, &pattern) != NGX_OK) {
2647*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2648*3da8d17dSfengbojiang(姜凤波) }
2649*3da8d17dSfengbojiang(姜凤波)
2650*3da8d17dSfengbojiang(姜凤波) if (pattern.len > len
2651*3da8d17dSfengbojiang(姜凤波) || ngx_rstrncmp(h->value.data + prefix, pattern.data,
2652*3da8d17dSfengbojiang(姜凤波) pattern.len) != 0)
2653*3da8d17dSfengbojiang(姜凤波) {
2654*3da8d17dSfengbojiang(姜凤波) return NGX_DECLINED;
2655*3da8d17dSfengbojiang(姜凤波) }
2656*3da8d17dSfengbojiang(姜凤波)
2657*3da8d17dSfengbojiang(姜凤波) if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {
2658*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2659*3da8d17dSfengbojiang(姜凤波) }
2660*3da8d17dSfengbojiang(姜凤波)
2661*3da8d17dSfengbojiang(姜凤波) return ngx_http_proxy_rewrite(r, h, prefix, pattern.len, &replacement);
2662*3da8d17dSfengbojiang(姜凤波) }
2663*3da8d17dSfengbojiang(姜凤波)
2664*3da8d17dSfengbojiang(姜凤波)
2665*3da8d17dSfengbojiang(姜凤波) #if (NGX_PCRE)
2666*3da8d17dSfengbojiang(姜凤波)
2667*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_rewrite_regex_handler(ngx_http_request_t * r,ngx_table_elt_t * h,size_t prefix,size_t len,ngx_http_proxy_rewrite_t * pr)2668*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_rewrite_regex_handler(ngx_http_request_t *r, ngx_table_elt_t *h,
2669*3da8d17dSfengbojiang(姜凤波) size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)
2670*3da8d17dSfengbojiang(姜凤波) {
2671*3da8d17dSfengbojiang(姜凤波) ngx_str_t pattern, replacement;
2672*3da8d17dSfengbojiang(姜凤波)
2673*3da8d17dSfengbojiang(姜凤波) pattern.len = len;
2674*3da8d17dSfengbojiang(姜凤波) pattern.data = h->value.data + prefix;
2675*3da8d17dSfengbojiang(姜凤波)
2676*3da8d17dSfengbojiang(姜凤波) if (ngx_http_regex_exec(r, pr->pattern.regex, &pattern) != NGX_OK) {
2677*3da8d17dSfengbojiang(姜凤波) return NGX_DECLINED;
2678*3da8d17dSfengbojiang(姜凤波) }
2679*3da8d17dSfengbojiang(姜凤波)
2680*3da8d17dSfengbojiang(姜凤波) if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {
2681*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2682*3da8d17dSfengbojiang(姜凤波) }
2683*3da8d17dSfengbojiang(姜凤波)
2684*3da8d17dSfengbojiang(姜凤波) if (prefix == 0 && h->value.len == len) {
2685*3da8d17dSfengbojiang(姜凤波) h->value = replacement;
2686*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2687*3da8d17dSfengbojiang(姜凤波) }
2688*3da8d17dSfengbojiang(姜凤波)
2689*3da8d17dSfengbojiang(姜凤波) return ngx_http_proxy_rewrite(r, h, prefix, len, &replacement);
2690*3da8d17dSfengbojiang(姜凤波) }
2691*3da8d17dSfengbojiang(姜凤波)
2692*3da8d17dSfengbojiang(姜凤波) #endif
2693*3da8d17dSfengbojiang(姜凤波)
2694*3da8d17dSfengbojiang(姜凤波)
2695*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_rewrite_domain_handler(ngx_http_request_t * r,ngx_table_elt_t * h,size_t prefix,size_t len,ngx_http_proxy_rewrite_t * pr)2696*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_rewrite_domain_handler(ngx_http_request_t *r,
2697*3da8d17dSfengbojiang(姜凤波) ngx_table_elt_t *h, size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)
2698*3da8d17dSfengbojiang(姜凤波) {
2699*3da8d17dSfengbojiang(姜凤波) u_char *p;
2700*3da8d17dSfengbojiang(姜凤波) ngx_str_t pattern, replacement;
2701*3da8d17dSfengbojiang(姜凤波)
2702*3da8d17dSfengbojiang(姜凤波) if (ngx_http_complex_value(r, &pr->pattern.complex, &pattern) != NGX_OK) {
2703*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2704*3da8d17dSfengbojiang(姜凤波) }
2705*3da8d17dSfengbojiang(姜凤波)
2706*3da8d17dSfengbojiang(姜凤波) p = h->value.data + prefix;
2707*3da8d17dSfengbojiang(姜凤波)
2708*3da8d17dSfengbojiang(姜凤波) if (p[0] == '.') {
2709*3da8d17dSfengbojiang(姜凤波) p++;
2710*3da8d17dSfengbojiang(姜凤波) prefix++;
2711*3da8d17dSfengbojiang(姜凤波) len--;
2712*3da8d17dSfengbojiang(姜凤波) }
2713*3da8d17dSfengbojiang(姜凤波)
2714*3da8d17dSfengbojiang(姜凤波) if (pattern.len != len || ngx_rstrncasecmp(pattern.data, p, len) != 0) {
2715*3da8d17dSfengbojiang(姜凤波) return NGX_DECLINED;
2716*3da8d17dSfengbojiang(姜凤波) }
2717*3da8d17dSfengbojiang(姜凤波)
2718*3da8d17dSfengbojiang(姜凤波) if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {
2719*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2720*3da8d17dSfengbojiang(姜凤波) }
2721*3da8d17dSfengbojiang(姜凤波)
2722*3da8d17dSfengbojiang(姜凤波) return ngx_http_proxy_rewrite(r, h, prefix, len, &replacement);
2723*3da8d17dSfengbojiang(姜凤波) }
2724*3da8d17dSfengbojiang(姜凤波)
2725*3da8d17dSfengbojiang(姜凤波)
2726*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_rewrite(ngx_http_request_t * r,ngx_table_elt_t * h,size_t prefix,size_t len,ngx_str_t * replacement)2727*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_rewrite(ngx_http_request_t *r, ngx_table_elt_t *h, size_t prefix,
2728*3da8d17dSfengbojiang(姜凤波) size_t len, ngx_str_t *replacement)
2729*3da8d17dSfengbojiang(姜凤波) {
2730*3da8d17dSfengbojiang(姜凤波) u_char *p, *data;
2731*3da8d17dSfengbojiang(姜凤波) size_t new_len;
2732*3da8d17dSfengbojiang(姜凤波)
2733*3da8d17dSfengbojiang(姜凤波) new_len = replacement->len + h->value.len - len;
2734*3da8d17dSfengbojiang(姜凤波)
2735*3da8d17dSfengbojiang(姜凤波) if (replacement->len > len) {
2736*3da8d17dSfengbojiang(姜凤波)
2737*3da8d17dSfengbojiang(姜凤波) data = ngx_pnalloc(r->pool, new_len + 1);
2738*3da8d17dSfengbojiang(姜凤波) if (data == NULL) {
2739*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2740*3da8d17dSfengbojiang(姜凤波) }
2741*3da8d17dSfengbojiang(姜凤波)
2742*3da8d17dSfengbojiang(姜凤波) p = ngx_copy(data, h->value.data, prefix);
2743*3da8d17dSfengbojiang(姜凤波) p = ngx_copy(p, replacement->data, replacement->len);
2744*3da8d17dSfengbojiang(姜凤波)
2745*3da8d17dSfengbojiang(姜凤波) ngx_memcpy(p, h->value.data + prefix + len,
2746*3da8d17dSfengbojiang(姜凤波) h->value.len - len - prefix + 1);
2747*3da8d17dSfengbojiang(姜凤波)
2748*3da8d17dSfengbojiang(姜凤波) h->value.data = data;
2749*3da8d17dSfengbojiang(姜凤波)
2750*3da8d17dSfengbojiang(姜凤波) } else {
2751*3da8d17dSfengbojiang(姜凤波) p = ngx_copy(h->value.data + prefix, replacement->data,
2752*3da8d17dSfengbojiang(姜凤波) replacement->len);
2753*3da8d17dSfengbojiang(姜凤波)
2754*3da8d17dSfengbojiang(姜凤波) ngx_memmove(p, h->value.data + prefix + len,
2755*3da8d17dSfengbojiang(姜凤波) h->value.len - len - prefix + 1);
2756*3da8d17dSfengbojiang(姜凤波) }
2757*3da8d17dSfengbojiang(姜凤波)
2758*3da8d17dSfengbojiang(姜凤波) h->value.len = new_len;
2759*3da8d17dSfengbojiang(姜凤波)
2760*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2761*3da8d17dSfengbojiang(姜凤波) }
2762*3da8d17dSfengbojiang(姜凤波)
2763*3da8d17dSfengbojiang(姜凤波)
2764*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_add_variables(ngx_conf_t * cf)2765*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_add_variables(ngx_conf_t *cf)
2766*3da8d17dSfengbojiang(姜凤波) {
2767*3da8d17dSfengbojiang(姜凤波) ngx_http_variable_t *var, *v;
2768*3da8d17dSfengbojiang(姜凤波)
2769*3da8d17dSfengbojiang(姜凤波) for (v = ngx_http_proxy_vars; v->name.len; v++) {
2770*3da8d17dSfengbojiang(姜凤波) var = ngx_http_add_variable(cf, &v->name, v->flags);
2771*3da8d17dSfengbojiang(姜凤波) if (var == NULL) {
2772*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
2773*3da8d17dSfengbojiang(姜凤波) }
2774*3da8d17dSfengbojiang(姜凤波)
2775*3da8d17dSfengbojiang(姜凤波) var->get_handler = v->get_handler;
2776*3da8d17dSfengbojiang(姜凤波) var->data = v->data;
2777*3da8d17dSfengbojiang(姜凤波) }
2778*3da8d17dSfengbojiang(姜凤波)
2779*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
2780*3da8d17dSfengbojiang(姜凤波) }
2781*3da8d17dSfengbojiang(姜凤波)
2782*3da8d17dSfengbojiang(姜凤波)
2783*3da8d17dSfengbojiang(姜凤波) static void *
ngx_http_proxy_create_main_conf(ngx_conf_t * cf)2784*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_create_main_conf(ngx_conf_t *cf)
2785*3da8d17dSfengbojiang(姜凤波) {
2786*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_main_conf_t *conf;
2787*3da8d17dSfengbojiang(姜凤波)
2788*3da8d17dSfengbojiang(姜凤波) conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_proxy_main_conf_t));
2789*3da8d17dSfengbojiang(姜凤波) if (conf == NULL) {
2790*3da8d17dSfengbojiang(姜凤波) return NULL;
2791*3da8d17dSfengbojiang(姜凤波) }
2792*3da8d17dSfengbojiang(姜凤波)
2793*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
2794*3da8d17dSfengbojiang(姜凤波) if (ngx_array_init(&conf->caches, cf->pool, 4,
2795*3da8d17dSfengbojiang(姜凤波) sizeof(ngx_http_file_cache_t *))
2796*3da8d17dSfengbojiang(姜凤波) != NGX_OK)
2797*3da8d17dSfengbojiang(姜凤波) {
2798*3da8d17dSfengbojiang(姜凤波) return NULL;
2799*3da8d17dSfengbojiang(姜凤波) }
2800*3da8d17dSfengbojiang(姜凤波) #endif
2801*3da8d17dSfengbojiang(姜凤波)
2802*3da8d17dSfengbojiang(姜凤波) return conf;
2803*3da8d17dSfengbojiang(姜凤波) }
2804*3da8d17dSfengbojiang(姜凤波)
2805*3da8d17dSfengbojiang(姜凤波)
2806*3da8d17dSfengbojiang(姜凤波) static void *
ngx_http_proxy_create_loc_conf(ngx_conf_t * cf)2807*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_create_loc_conf(ngx_conf_t *cf)
2808*3da8d17dSfengbojiang(姜凤波) {
2809*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *conf;
2810*3da8d17dSfengbojiang(姜凤波)
2811*3da8d17dSfengbojiang(姜凤波) conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_proxy_loc_conf_t));
2812*3da8d17dSfengbojiang(姜凤波) if (conf == NULL) {
2813*3da8d17dSfengbojiang(姜凤波) return NULL;
2814*3da8d17dSfengbojiang(姜凤波) }
2815*3da8d17dSfengbojiang(姜凤波)
2816*3da8d17dSfengbojiang(姜凤波) /*
2817*3da8d17dSfengbojiang(姜凤波) * set by ngx_pcalloc():
2818*3da8d17dSfengbojiang(姜凤波) *
2819*3da8d17dSfengbojiang(姜凤波) * conf->upstream.bufs.num = 0;
2820*3da8d17dSfengbojiang(姜凤波) * conf->upstream.ignore_headers = 0;
2821*3da8d17dSfengbojiang(姜凤波) * conf->upstream.next_upstream = 0;
2822*3da8d17dSfengbojiang(姜凤波) * conf->upstream.cache_zone = NULL;
2823*3da8d17dSfengbojiang(姜凤波) * conf->upstream.cache_use_stale = 0;
2824*3da8d17dSfengbojiang(姜凤波) * conf->upstream.cache_methods = 0;
2825*3da8d17dSfengbojiang(姜凤波) * conf->upstream.temp_path = NULL;
2826*3da8d17dSfengbojiang(姜凤波) * conf->upstream.hide_headers_hash = { NULL, 0 };
2827*3da8d17dSfengbojiang(姜凤波) * conf->upstream.store_lengths = NULL;
2828*3da8d17dSfengbojiang(姜凤波) * conf->upstream.store_values = NULL;
2829*3da8d17dSfengbojiang(姜凤波) * conf->upstream.ssl_name = NULL;
2830*3da8d17dSfengbojiang(姜凤波) *
2831*3da8d17dSfengbojiang(姜凤波) * conf->method = NULL;
2832*3da8d17dSfengbojiang(姜凤波) * conf->location = NULL;
2833*3da8d17dSfengbojiang(姜凤波) * conf->url = { 0, NULL };
2834*3da8d17dSfengbojiang(姜凤波) * conf->headers_source = NULL;
2835*3da8d17dSfengbojiang(姜凤波) * conf->headers.lengths = NULL;
2836*3da8d17dSfengbojiang(姜凤波) * conf->headers.values = NULL;
2837*3da8d17dSfengbojiang(姜凤波) * conf->headers.hash = { NULL, 0 };
2838*3da8d17dSfengbojiang(姜凤波) * conf->headers_cache.lengths = NULL;
2839*3da8d17dSfengbojiang(姜凤波) * conf->headers_cache.values = NULL;
2840*3da8d17dSfengbojiang(姜凤波) * conf->headers_cache.hash = { NULL, 0 };
2841*3da8d17dSfengbojiang(姜凤波) * conf->body_lengths = NULL;
2842*3da8d17dSfengbojiang(姜凤波) * conf->body_values = NULL;
2843*3da8d17dSfengbojiang(姜凤波) * conf->body_source = { 0, NULL };
2844*3da8d17dSfengbojiang(姜凤波) * conf->redirects = NULL;
2845*3da8d17dSfengbojiang(姜凤波) * conf->ssl = 0;
2846*3da8d17dSfengbojiang(姜凤波) * conf->ssl_protocols = 0;
2847*3da8d17dSfengbojiang(姜凤波) * conf->ssl_ciphers = { 0, NULL };
2848*3da8d17dSfengbojiang(姜凤波) * conf->ssl_trusted_certificate = { 0, NULL };
2849*3da8d17dSfengbojiang(姜凤波) * conf->ssl_crl = { 0, NULL };
2850*3da8d17dSfengbojiang(姜凤波) * conf->ssl_certificate = { 0, NULL };
2851*3da8d17dSfengbojiang(姜凤波) * conf->ssl_certificate_key = { 0, NULL };
2852*3da8d17dSfengbojiang(姜凤波) */
2853*3da8d17dSfengbojiang(姜凤波)
2854*3da8d17dSfengbojiang(姜凤波) conf->upstream.store = NGX_CONF_UNSET;
2855*3da8d17dSfengbojiang(姜凤波) conf->upstream.store_access = NGX_CONF_UNSET_UINT;
2856*3da8d17dSfengbojiang(姜凤波) conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT;
2857*3da8d17dSfengbojiang(姜凤波) conf->upstream.buffering = NGX_CONF_UNSET;
2858*3da8d17dSfengbojiang(姜凤波) conf->upstream.request_buffering = NGX_CONF_UNSET;
2859*3da8d17dSfengbojiang(姜凤波) conf->upstream.ignore_client_abort = NGX_CONF_UNSET;
2860*3da8d17dSfengbojiang(姜凤波) conf->upstream.force_ranges = NGX_CONF_UNSET;
2861*3da8d17dSfengbojiang(姜凤波)
2862*3da8d17dSfengbojiang(姜凤波) conf->upstream.local = NGX_CONF_UNSET_PTR;
2863*3da8d17dSfengbojiang(姜凤波) conf->upstream.socket_keepalive = NGX_CONF_UNSET;
2864*3da8d17dSfengbojiang(姜凤波)
2865*3da8d17dSfengbojiang(姜凤波) conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;
2866*3da8d17dSfengbojiang(姜凤波) conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;
2867*3da8d17dSfengbojiang(姜凤波) conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;
2868*3da8d17dSfengbojiang(姜凤波) conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC;
2869*3da8d17dSfengbojiang(姜凤波)
2870*3da8d17dSfengbojiang(姜凤波) conf->upstream.send_lowat = NGX_CONF_UNSET_SIZE;
2871*3da8d17dSfengbojiang(姜凤波) conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;
2872*3da8d17dSfengbojiang(姜凤波) conf->upstream.limit_rate = NGX_CONF_UNSET_SIZE;
2873*3da8d17dSfengbojiang(姜凤波)
2874*3da8d17dSfengbojiang(姜凤波) conf->upstream.busy_buffers_size_conf = NGX_CONF_UNSET_SIZE;
2875*3da8d17dSfengbojiang(姜凤波) conf->upstream.max_temp_file_size_conf = NGX_CONF_UNSET_SIZE;
2876*3da8d17dSfengbojiang(姜凤波) conf->upstream.temp_file_write_size_conf = NGX_CONF_UNSET_SIZE;
2877*3da8d17dSfengbojiang(姜凤波)
2878*3da8d17dSfengbojiang(姜凤波) conf->upstream.pass_request_headers = NGX_CONF_UNSET;
2879*3da8d17dSfengbojiang(姜凤波) conf->upstream.pass_request_body = NGX_CONF_UNSET;
2880*3da8d17dSfengbojiang(姜凤波)
2881*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
2882*3da8d17dSfengbojiang(姜凤波) conf->upstream.cache = NGX_CONF_UNSET;
2883*3da8d17dSfengbojiang(姜凤波) conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT;
2884*3da8d17dSfengbojiang(姜凤波) conf->upstream.cache_max_range_offset = NGX_CONF_UNSET;
2885*3da8d17dSfengbojiang(姜凤波) conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR;
2886*3da8d17dSfengbojiang(姜凤波) conf->upstream.no_cache = NGX_CONF_UNSET_PTR;
2887*3da8d17dSfengbojiang(姜凤波) conf->upstream.cache_valid = NGX_CONF_UNSET_PTR;
2888*3da8d17dSfengbojiang(姜凤波) conf->upstream.cache_lock = NGX_CONF_UNSET;
2889*3da8d17dSfengbojiang(姜凤波) conf->upstream.cache_lock_timeout = NGX_CONF_UNSET_MSEC;
2890*3da8d17dSfengbojiang(姜凤波) conf->upstream.cache_lock_age = NGX_CONF_UNSET_MSEC;
2891*3da8d17dSfengbojiang(姜凤波) conf->upstream.cache_revalidate = NGX_CONF_UNSET;
2892*3da8d17dSfengbojiang(姜凤波) conf->upstream.cache_convert_head = NGX_CONF_UNSET;
2893*3da8d17dSfengbojiang(姜凤波) conf->upstream.cache_background_update = NGX_CONF_UNSET;
2894*3da8d17dSfengbojiang(姜凤波) #endif
2895*3da8d17dSfengbojiang(姜凤波)
2896*3da8d17dSfengbojiang(姜凤波) conf->upstream.hide_headers = NGX_CONF_UNSET_PTR;
2897*3da8d17dSfengbojiang(姜凤波) conf->upstream.pass_headers = NGX_CONF_UNSET_PTR;
2898*3da8d17dSfengbojiang(姜凤波)
2899*3da8d17dSfengbojiang(姜凤波) conf->upstream.intercept_errors = NGX_CONF_UNSET;
2900*3da8d17dSfengbojiang(姜凤波)
2901*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_SSL)
2902*3da8d17dSfengbojiang(姜凤波) conf->upstream.ssl_session_reuse = NGX_CONF_UNSET;
2903*3da8d17dSfengbojiang(姜凤波) conf->upstream.ssl_server_name = NGX_CONF_UNSET;
2904*3da8d17dSfengbojiang(姜凤波) conf->upstream.ssl_verify = NGX_CONF_UNSET;
2905*3da8d17dSfengbojiang(姜凤波) conf->ssl_verify_depth = NGX_CONF_UNSET_UINT;
2906*3da8d17dSfengbojiang(姜凤波) conf->ssl_passwords = NGX_CONF_UNSET_PTR;
2907*3da8d17dSfengbojiang(姜凤波) #endif
2908*3da8d17dSfengbojiang(姜凤波)
2909*3da8d17dSfengbojiang(姜凤波) /* "proxy_cyclic_temp_file" is disabled */
2910*3da8d17dSfengbojiang(姜凤波) conf->upstream.cyclic_temp_file = 0;
2911*3da8d17dSfengbojiang(姜凤波)
2912*3da8d17dSfengbojiang(姜凤波) conf->redirect = NGX_CONF_UNSET;
2913*3da8d17dSfengbojiang(姜凤波) conf->upstream.change_buffering = 1;
2914*3da8d17dSfengbojiang(姜凤波)
2915*3da8d17dSfengbojiang(姜凤波) conf->cookie_domains = NGX_CONF_UNSET_PTR;
2916*3da8d17dSfengbojiang(姜凤波) conf->cookie_paths = NGX_CONF_UNSET_PTR;
2917*3da8d17dSfengbojiang(姜凤波)
2918*3da8d17dSfengbojiang(姜凤波) conf->http_version = NGX_CONF_UNSET_UINT;
2919*3da8d17dSfengbojiang(姜凤波)
2920*3da8d17dSfengbojiang(姜凤波) conf->headers_hash_max_size = NGX_CONF_UNSET_UINT;
2921*3da8d17dSfengbojiang(姜凤波) conf->headers_hash_bucket_size = NGX_CONF_UNSET_UINT;
2922*3da8d17dSfengbojiang(姜凤波)
2923*3da8d17dSfengbojiang(姜凤波) ngx_str_set(&conf->upstream.module, "proxy");
2924*3da8d17dSfengbojiang(姜凤波)
2925*3da8d17dSfengbojiang(姜凤波) #if (NGX_HAVE_FSTACK)
2926*3da8d17dSfengbojiang(姜凤波) conf->kernel_network_stack = NGX_CONF_UNSET;
2927*3da8d17dSfengbojiang(姜凤波) #endif
2928*3da8d17dSfengbojiang(姜凤波)
2929*3da8d17dSfengbojiang(姜凤波) return conf;
2930*3da8d17dSfengbojiang(姜凤波) }
2931*3da8d17dSfengbojiang(姜凤波)
2932*3da8d17dSfengbojiang(姜凤波)
2933*3da8d17dSfengbojiang(姜凤波) static char *
ngx_http_proxy_merge_loc_conf(ngx_conf_t * cf,void * parent,void * child)2934*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
2935*3da8d17dSfengbojiang(姜凤波) {
2936*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *prev = parent;
2937*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *conf = child;
2938*3da8d17dSfengbojiang(姜凤波)
2939*3da8d17dSfengbojiang(姜凤波) u_char *p;
2940*3da8d17dSfengbojiang(姜凤波) size_t size;
2941*3da8d17dSfengbojiang(姜凤波) ngx_int_t rc;
2942*3da8d17dSfengbojiang(姜凤波) ngx_hash_init_t hash;
2943*3da8d17dSfengbojiang(姜凤波) ngx_http_core_loc_conf_t *clcf;
2944*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_rewrite_t *pr;
2945*3da8d17dSfengbojiang(姜凤波) ngx_http_script_compile_t sc;
2946*3da8d17dSfengbojiang(姜凤波)
2947*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
2948*3da8d17dSfengbojiang(姜凤波)
2949*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.store > 0) {
2950*3da8d17dSfengbojiang(姜凤波) conf->upstream.cache = 0;
2951*3da8d17dSfengbojiang(姜凤波) }
2952*3da8d17dSfengbojiang(姜凤波)
2953*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.cache > 0) {
2954*3da8d17dSfengbojiang(姜凤波) conf->upstream.store = 0;
2955*3da8d17dSfengbojiang(姜凤波) }
2956*3da8d17dSfengbojiang(姜凤波)
2957*3da8d17dSfengbojiang(姜凤波) #endif
2958*3da8d17dSfengbojiang(姜凤波)
2959*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.store == NGX_CONF_UNSET) {
2960*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->upstream.store,
2961*3da8d17dSfengbojiang(姜凤波) prev->upstream.store, 0);
2962*3da8d17dSfengbojiang(姜凤波)
2963*3da8d17dSfengbojiang(姜凤波) conf->upstream.store_lengths = prev->upstream.store_lengths;
2964*3da8d17dSfengbojiang(姜凤波) conf->upstream.store_values = prev->upstream.store_values;
2965*3da8d17dSfengbojiang(姜凤波) }
2966*3da8d17dSfengbojiang(姜凤波)
2967*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_uint_value(conf->upstream.store_access,
2968*3da8d17dSfengbojiang(姜凤波) prev->upstream.store_access, 0600);
2969*3da8d17dSfengbojiang(姜凤波)
2970*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries,
2971*3da8d17dSfengbojiang(姜凤波) prev->upstream.next_upstream_tries, 0);
2972*3da8d17dSfengbojiang(姜凤波)
2973*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->upstream.buffering,
2974*3da8d17dSfengbojiang(姜凤波) prev->upstream.buffering, 1);
2975*3da8d17dSfengbojiang(姜凤波)
2976*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->upstream.request_buffering,
2977*3da8d17dSfengbojiang(姜凤波) prev->upstream.request_buffering, 1);
2978*3da8d17dSfengbojiang(姜凤波)
2979*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->upstream.ignore_client_abort,
2980*3da8d17dSfengbojiang(姜凤波) prev->upstream.ignore_client_abort, 0);
2981*3da8d17dSfengbojiang(姜凤波)
2982*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->upstream.force_ranges,
2983*3da8d17dSfengbojiang(姜凤波) prev->upstream.force_ranges, 0);
2984*3da8d17dSfengbojiang(姜凤波)
2985*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_ptr_value(conf->upstream.local,
2986*3da8d17dSfengbojiang(姜凤波) prev->upstream.local, NULL);
2987*3da8d17dSfengbojiang(姜凤波)
2988*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->upstream.socket_keepalive,
2989*3da8d17dSfengbojiang(姜凤波) prev->upstream.socket_keepalive, 0);
2990*3da8d17dSfengbojiang(姜凤波)
2991*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_msec_value(conf->upstream.connect_timeout,
2992*3da8d17dSfengbojiang(姜凤波) prev->upstream.connect_timeout, 60000);
2993*3da8d17dSfengbojiang(姜凤波)
2994*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_msec_value(conf->upstream.send_timeout,
2995*3da8d17dSfengbojiang(姜凤波) prev->upstream.send_timeout, 60000);
2996*3da8d17dSfengbojiang(姜凤波)
2997*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_msec_value(conf->upstream.read_timeout,
2998*3da8d17dSfengbojiang(姜凤波) prev->upstream.read_timeout, 60000);
2999*3da8d17dSfengbojiang(姜凤波)
3000*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout,
3001*3da8d17dSfengbojiang(姜凤波) prev->upstream.next_upstream_timeout, 0);
3002*3da8d17dSfengbojiang(姜凤波)
3003*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_size_value(conf->upstream.send_lowat,
3004*3da8d17dSfengbojiang(姜凤波) prev->upstream.send_lowat, 0);
3005*3da8d17dSfengbojiang(姜凤波)
3006*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_size_value(conf->upstream.buffer_size,
3007*3da8d17dSfengbojiang(姜凤波) prev->upstream.buffer_size,
3008*3da8d17dSfengbojiang(姜凤波) (size_t) ngx_pagesize);
3009*3da8d17dSfengbojiang(姜凤波)
3010*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_size_value(conf->upstream.limit_rate,
3011*3da8d17dSfengbojiang(姜凤波) prev->upstream.limit_rate, 0);
3012*3da8d17dSfengbojiang(姜凤波)
3013*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_bufs_value(conf->upstream.bufs, prev->upstream.bufs,
3014*3da8d17dSfengbojiang(姜凤波) 8, ngx_pagesize);
3015*3da8d17dSfengbojiang(姜凤波)
3016*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.bufs.num < 2) {
3017*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3018*3da8d17dSfengbojiang(姜凤波) "there must be at least 2 \"proxy_buffers\"");
3019*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3020*3da8d17dSfengbojiang(姜凤波) }
3021*3da8d17dSfengbojiang(姜凤波)
3022*3da8d17dSfengbojiang(姜凤波)
3023*3da8d17dSfengbojiang(姜凤波) size = conf->upstream.buffer_size;
3024*3da8d17dSfengbojiang(姜凤波) if (size < conf->upstream.bufs.size) {
3025*3da8d17dSfengbojiang(姜凤波) size = conf->upstream.bufs.size;
3026*3da8d17dSfengbojiang(姜凤波) }
3027*3da8d17dSfengbojiang(姜凤波)
3028*3da8d17dSfengbojiang(姜凤波)
3029*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_size_value(conf->upstream.busy_buffers_size_conf,
3030*3da8d17dSfengbojiang(姜凤波) prev->upstream.busy_buffers_size_conf,
3031*3da8d17dSfengbojiang(姜凤波) NGX_CONF_UNSET_SIZE);
3032*3da8d17dSfengbojiang(姜凤波)
3033*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.busy_buffers_size_conf == NGX_CONF_UNSET_SIZE) {
3034*3da8d17dSfengbojiang(姜凤波) conf->upstream.busy_buffers_size = 2 * size;
3035*3da8d17dSfengbojiang(姜凤波) } else {
3036*3da8d17dSfengbojiang(姜凤波) conf->upstream.busy_buffers_size =
3037*3da8d17dSfengbojiang(姜凤波) conf->upstream.busy_buffers_size_conf;
3038*3da8d17dSfengbojiang(姜凤波) }
3039*3da8d17dSfengbojiang(姜凤波)
3040*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.busy_buffers_size < size) {
3041*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3042*3da8d17dSfengbojiang(姜凤波) "\"proxy_busy_buffers_size\" must be equal to or greater than "
3043*3da8d17dSfengbojiang(姜凤波) "the maximum of the value of \"proxy_buffer_size\" and "
3044*3da8d17dSfengbojiang(姜凤波) "one of the \"proxy_buffers\"");
3045*3da8d17dSfengbojiang(姜凤波)
3046*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3047*3da8d17dSfengbojiang(姜凤波) }
3048*3da8d17dSfengbojiang(姜凤波)
3049*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.busy_buffers_size
3050*3da8d17dSfengbojiang(姜凤波) > (conf->upstream.bufs.num - 1) * conf->upstream.bufs.size)
3051*3da8d17dSfengbojiang(姜凤波) {
3052*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3053*3da8d17dSfengbojiang(姜凤波) "\"proxy_busy_buffers_size\" must be less than "
3054*3da8d17dSfengbojiang(姜凤波) "the size of all \"proxy_buffers\" minus one buffer");
3055*3da8d17dSfengbojiang(姜凤波)
3056*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3057*3da8d17dSfengbojiang(姜凤波) }
3058*3da8d17dSfengbojiang(姜凤波)
3059*3da8d17dSfengbojiang(姜凤波)
3060*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_size_value(conf->upstream.temp_file_write_size_conf,
3061*3da8d17dSfengbojiang(姜凤波) prev->upstream.temp_file_write_size_conf,
3062*3da8d17dSfengbojiang(姜凤波) NGX_CONF_UNSET_SIZE);
3063*3da8d17dSfengbojiang(姜凤波)
3064*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.temp_file_write_size_conf == NGX_CONF_UNSET_SIZE) {
3065*3da8d17dSfengbojiang(姜凤波) conf->upstream.temp_file_write_size = 2 * size;
3066*3da8d17dSfengbojiang(姜凤波) } else {
3067*3da8d17dSfengbojiang(姜凤波) conf->upstream.temp_file_write_size =
3068*3da8d17dSfengbojiang(姜凤波) conf->upstream.temp_file_write_size_conf;
3069*3da8d17dSfengbojiang(姜凤波) }
3070*3da8d17dSfengbojiang(姜凤波)
3071*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.temp_file_write_size < size) {
3072*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3073*3da8d17dSfengbojiang(姜凤波) "\"proxy_temp_file_write_size\" must be equal to or greater "
3074*3da8d17dSfengbojiang(姜凤波) "than the maximum of the value of \"proxy_buffer_size\" and "
3075*3da8d17dSfengbojiang(姜凤波) "one of the \"proxy_buffers\"");
3076*3da8d17dSfengbojiang(姜凤波)
3077*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3078*3da8d17dSfengbojiang(姜凤波) }
3079*3da8d17dSfengbojiang(姜凤波)
3080*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_size_value(conf->upstream.max_temp_file_size_conf,
3081*3da8d17dSfengbojiang(姜凤波) prev->upstream.max_temp_file_size_conf,
3082*3da8d17dSfengbojiang(姜凤波) NGX_CONF_UNSET_SIZE);
3083*3da8d17dSfengbojiang(姜凤波)
3084*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.max_temp_file_size_conf == NGX_CONF_UNSET_SIZE) {
3085*3da8d17dSfengbojiang(姜凤波) conf->upstream.max_temp_file_size = 1024 * 1024 * 1024;
3086*3da8d17dSfengbojiang(姜凤波) } else {
3087*3da8d17dSfengbojiang(姜凤波) conf->upstream.max_temp_file_size =
3088*3da8d17dSfengbojiang(姜凤波) conf->upstream.max_temp_file_size_conf;
3089*3da8d17dSfengbojiang(姜凤波) }
3090*3da8d17dSfengbojiang(姜凤波)
3091*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.max_temp_file_size != 0
3092*3da8d17dSfengbojiang(姜凤波) && conf->upstream.max_temp_file_size < size)
3093*3da8d17dSfengbojiang(姜凤波) {
3094*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3095*3da8d17dSfengbojiang(姜凤波) "\"proxy_max_temp_file_size\" must be equal to zero to disable "
3096*3da8d17dSfengbojiang(姜凤波) "temporary files usage or must be equal to or greater than "
3097*3da8d17dSfengbojiang(姜凤波) "the maximum of the value of \"proxy_buffer_size\" and "
3098*3da8d17dSfengbojiang(姜凤波) "one of the \"proxy_buffers\"");
3099*3da8d17dSfengbojiang(姜凤波)
3100*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3101*3da8d17dSfengbojiang(姜凤波) }
3102*3da8d17dSfengbojiang(姜凤波)
3103*3da8d17dSfengbojiang(姜凤波)
3104*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers,
3105*3da8d17dSfengbojiang(姜凤波) prev->upstream.ignore_headers,
3106*3da8d17dSfengbojiang(姜凤波) NGX_CONF_BITMASK_SET);
3107*3da8d17dSfengbojiang(姜凤波)
3108*3da8d17dSfengbojiang(姜凤波)
3109*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,
3110*3da8d17dSfengbojiang(姜凤波) prev->upstream.next_upstream,
3111*3da8d17dSfengbojiang(姜凤波) (NGX_CONF_BITMASK_SET
3112*3da8d17dSfengbojiang(姜凤波) |NGX_HTTP_UPSTREAM_FT_ERROR
3113*3da8d17dSfengbojiang(姜凤波) |NGX_HTTP_UPSTREAM_FT_TIMEOUT));
3114*3da8d17dSfengbojiang(姜凤波)
3115*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {
3116*3da8d17dSfengbojiang(姜凤波) conf->upstream.next_upstream = NGX_CONF_BITMASK_SET
3117*3da8d17dSfengbojiang(姜凤波) |NGX_HTTP_UPSTREAM_FT_OFF;
3118*3da8d17dSfengbojiang(姜凤波) }
3119*3da8d17dSfengbojiang(姜凤波)
3120*3da8d17dSfengbojiang(姜凤波) if (ngx_conf_merge_path_value(cf, &conf->upstream.temp_path,
3121*3da8d17dSfengbojiang(姜凤波) prev->upstream.temp_path,
3122*3da8d17dSfengbojiang(姜凤波) &ngx_http_proxy_temp_path)
3123*3da8d17dSfengbojiang(姜凤波) != NGX_OK)
3124*3da8d17dSfengbojiang(姜凤波) {
3125*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3126*3da8d17dSfengbojiang(姜凤波) }
3127*3da8d17dSfengbojiang(姜凤波)
3128*3da8d17dSfengbojiang(姜凤波)
3129*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
3130*3da8d17dSfengbojiang(姜凤波)
3131*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.cache == NGX_CONF_UNSET) {
3132*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->upstream.cache,
3133*3da8d17dSfengbojiang(姜凤波) prev->upstream.cache, 0);
3134*3da8d17dSfengbojiang(姜凤波)
3135*3da8d17dSfengbojiang(姜凤波) conf->upstream.cache_zone = prev->upstream.cache_zone;
3136*3da8d17dSfengbojiang(姜凤波) conf->upstream.cache_value = prev->upstream.cache_value;
3137*3da8d17dSfengbojiang(姜凤波) }
3138*3da8d17dSfengbojiang(姜凤波)
3139*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.cache_zone && conf->upstream.cache_zone->data == NULL) {
3140*3da8d17dSfengbojiang(姜凤波) ngx_shm_zone_t *shm_zone;
3141*3da8d17dSfengbojiang(姜凤波)
3142*3da8d17dSfengbojiang(姜凤波) shm_zone = conf->upstream.cache_zone;
3143*3da8d17dSfengbojiang(姜凤波)
3144*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3145*3da8d17dSfengbojiang(姜凤波) "\"proxy_cache\" zone \"%V\" is unknown",
3146*3da8d17dSfengbojiang(姜凤波) &shm_zone->shm.name);
3147*3da8d17dSfengbojiang(姜凤波)
3148*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3149*3da8d17dSfengbojiang(姜凤波) }
3150*3da8d17dSfengbojiang(姜凤波)
3151*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_uint_value(conf->upstream.cache_min_uses,
3152*3da8d17dSfengbojiang(姜凤波) prev->upstream.cache_min_uses, 1);
3153*3da8d17dSfengbojiang(姜凤波)
3154*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_off_value(conf->upstream.cache_max_range_offset,
3155*3da8d17dSfengbojiang(姜凤波) prev->upstream.cache_max_range_offset,
3156*3da8d17dSfengbojiang(姜凤波) NGX_MAX_OFF_T_VALUE);
3157*3da8d17dSfengbojiang(姜凤波)
3158*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale,
3159*3da8d17dSfengbojiang(姜凤波) prev->upstream.cache_use_stale,
3160*3da8d17dSfengbojiang(姜凤波) (NGX_CONF_BITMASK_SET
3161*3da8d17dSfengbojiang(姜凤波) |NGX_HTTP_UPSTREAM_FT_OFF));
3162*3da8d17dSfengbojiang(姜凤波)
3163*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_OFF) {
3164*3da8d17dSfengbojiang(姜凤波) conf->upstream.cache_use_stale = NGX_CONF_BITMASK_SET
3165*3da8d17dSfengbojiang(姜凤波) |NGX_HTTP_UPSTREAM_FT_OFF;
3166*3da8d17dSfengbojiang(姜凤波) }
3167*3da8d17dSfengbojiang(姜凤波)
3168*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_ERROR) {
3169*3da8d17dSfengbojiang(姜凤波) conf->upstream.cache_use_stale |= NGX_HTTP_UPSTREAM_FT_NOLIVE;
3170*3da8d17dSfengbojiang(姜凤波) }
3171*3da8d17dSfengbojiang(姜凤波)
3172*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.cache_methods == 0) {
3173*3da8d17dSfengbojiang(姜凤波) conf->upstream.cache_methods = prev->upstream.cache_methods;
3174*3da8d17dSfengbojiang(姜凤波) }
3175*3da8d17dSfengbojiang(姜凤波)
3176*3da8d17dSfengbojiang(姜凤波) conf->upstream.cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD;
3177*3da8d17dSfengbojiang(姜凤波)
3178*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_ptr_value(conf->upstream.cache_bypass,
3179*3da8d17dSfengbojiang(姜凤波) prev->upstream.cache_bypass, NULL);
3180*3da8d17dSfengbojiang(姜凤波)
3181*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_ptr_value(conf->upstream.no_cache,
3182*3da8d17dSfengbojiang(姜凤波) prev->upstream.no_cache, NULL);
3183*3da8d17dSfengbojiang(姜凤波)
3184*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_ptr_value(conf->upstream.cache_valid,
3185*3da8d17dSfengbojiang(姜凤波) prev->upstream.cache_valid, NULL);
3186*3da8d17dSfengbojiang(姜凤波)
3187*3da8d17dSfengbojiang(姜凤波) if (conf->cache_key.value.data == NULL) {
3188*3da8d17dSfengbojiang(姜凤波) conf->cache_key = prev->cache_key;
3189*3da8d17dSfengbojiang(姜凤波) }
3190*3da8d17dSfengbojiang(姜凤波)
3191*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->upstream.cache_lock,
3192*3da8d17dSfengbojiang(姜凤波) prev->upstream.cache_lock, 0);
3193*3da8d17dSfengbojiang(姜凤波)
3194*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_msec_value(conf->upstream.cache_lock_timeout,
3195*3da8d17dSfengbojiang(姜凤波) prev->upstream.cache_lock_timeout, 5000);
3196*3da8d17dSfengbojiang(姜凤波)
3197*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_msec_value(conf->upstream.cache_lock_age,
3198*3da8d17dSfengbojiang(姜凤波) prev->upstream.cache_lock_age, 5000);
3199*3da8d17dSfengbojiang(姜凤波)
3200*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->upstream.cache_revalidate,
3201*3da8d17dSfengbojiang(姜凤波) prev->upstream.cache_revalidate, 0);
3202*3da8d17dSfengbojiang(姜凤波)
3203*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->upstream.cache_convert_head,
3204*3da8d17dSfengbojiang(姜凤波) prev->upstream.cache_convert_head, 1);
3205*3da8d17dSfengbojiang(姜凤波)
3206*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->upstream.cache_background_update,
3207*3da8d17dSfengbojiang(姜凤波) prev->upstream.cache_background_update, 0);
3208*3da8d17dSfengbojiang(姜凤波)
3209*3da8d17dSfengbojiang(姜凤波) #endif
3210*3da8d17dSfengbojiang(姜凤波)
3211*3da8d17dSfengbojiang(姜凤波) if (conf->method == NULL) {
3212*3da8d17dSfengbojiang(姜凤波) conf->method = prev->method;
3213*3da8d17dSfengbojiang(姜凤波) }
3214*3da8d17dSfengbojiang(姜凤波)
3215*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->upstream.pass_request_headers,
3216*3da8d17dSfengbojiang(姜凤波) prev->upstream.pass_request_headers, 1);
3217*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->upstream.pass_request_body,
3218*3da8d17dSfengbojiang(姜凤波) prev->upstream.pass_request_body, 1);
3219*3da8d17dSfengbojiang(姜凤波)
3220*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->upstream.intercept_errors,
3221*3da8d17dSfengbojiang(姜凤波) prev->upstream.intercept_errors, 0);
3222*3da8d17dSfengbojiang(姜凤波)
3223*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_SSL)
3224*3da8d17dSfengbojiang(姜凤波)
3225*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->upstream.ssl_session_reuse,
3226*3da8d17dSfengbojiang(姜凤波) prev->upstream.ssl_session_reuse, 1);
3227*3da8d17dSfengbojiang(姜凤波)
3228*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,
3229*3da8d17dSfengbojiang(姜凤波) (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1
3230*3da8d17dSfengbojiang(姜凤波) |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));
3231*3da8d17dSfengbojiang(姜凤波)
3232*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers,
3233*3da8d17dSfengbojiang(姜凤波) "DEFAULT");
3234*3da8d17dSfengbojiang(姜凤波)
3235*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.ssl_name == NULL) {
3236*3da8d17dSfengbojiang(姜凤波) conf->upstream.ssl_name = prev->upstream.ssl_name;
3237*3da8d17dSfengbojiang(姜凤波) }
3238*3da8d17dSfengbojiang(姜凤波)
3239*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->upstream.ssl_server_name,
3240*3da8d17dSfengbojiang(姜凤波) prev->upstream.ssl_server_name, 0);
3241*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->upstream.ssl_verify,
3242*3da8d17dSfengbojiang(姜凤波) prev->upstream.ssl_verify, 0);
3243*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_uint_value(conf->ssl_verify_depth,
3244*3da8d17dSfengbojiang(姜凤波) prev->ssl_verify_depth, 1);
3245*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_str_value(conf->ssl_trusted_certificate,
3246*3da8d17dSfengbojiang(姜凤波) prev->ssl_trusted_certificate, "");
3247*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, "");
3248*3da8d17dSfengbojiang(姜凤波)
3249*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_str_value(conf->ssl_certificate,
3250*3da8d17dSfengbojiang(姜凤波) prev->ssl_certificate, "");
3251*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_str_value(conf->ssl_certificate_key,
3252*3da8d17dSfengbojiang(姜凤波) prev->ssl_certificate_key, "");
3253*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_ptr_value(conf->ssl_passwords, prev->ssl_passwords, NULL);
3254*3da8d17dSfengbojiang(姜凤波)
3255*3da8d17dSfengbojiang(姜凤波) if (conf->ssl && ngx_http_proxy_set_ssl(cf, conf) != NGX_OK) {
3256*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3257*3da8d17dSfengbojiang(姜凤波) }
3258*3da8d17dSfengbojiang(姜凤波)
3259*3da8d17dSfengbojiang(姜凤波) #endif
3260*3da8d17dSfengbojiang(姜凤波)
3261*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->redirect, prev->redirect, 1);
3262*3da8d17dSfengbojiang(姜凤波)
3263*3da8d17dSfengbojiang(姜凤波) if (conf->redirect) {
3264*3da8d17dSfengbojiang(姜凤波)
3265*3da8d17dSfengbojiang(姜凤波) if (conf->redirects == NULL) {
3266*3da8d17dSfengbojiang(姜凤波) conf->redirects = prev->redirects;
3267*3da8d17dSfengbojiang(姜凤波) }
3268*3da8d17dSfengbojiang(姜凤波)
3269*3da8d17dSfengbojiang(姜凤波) if (conf->redirects == NULL && conf->url.data) {
3270*3da8d17dSfengbojiang(姜凤波)
3271*3da8d17dSfengbojiang(姜凤波) conf->redirects = ngx_array_create(cf->pool, 1,
3272*3da8d17dSfengbojiang(姜凤波) sizeof(ngx_http_proxy_rewrite_t));
3273*3da8d17dSfengbojiang(姜凤波) if (conf->redirects == NULL) {
3274*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3275*3da8d17dSfengbojiang(姜凤波) }
3276*3da8d17dSfengbojiang(姜凤波)
3277*3da8d17dSfengbojiang(姜凤波) pr = ngx_array_push(conf->redirects);
3278*3da8d17dSfengbojiang(姜凤波) if (pr == NULL) {
3279*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3280*3da8d17dSfengbojiang(姜凤波) }
3281*3da8d17dSfengbojiang(姜凤波)
3282*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&pr->pattern.complex,
3283*3da8d17dSfengbojiang(姜凤波) sizeof(ngx_http_complex_value_t));
3284*3da8d17dSfengbojiang(姜凤波)
3285*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&pr->replacement, sizeof(ngx_http_complex_value_t));
3286*3da8d17dSfengbojiang(姜凤波)
3287*3da8d17dSfengbojiang(姜凤波) pr->handler = ngx_http_proxy_rewrite_complex_handler;
3288*3da8d17dSfengbojiang(姜凤波)
3289*3da8d17dSfengbojiang(姜凤波) if (conf->vars.uri.len) {
3290*3da8d17dSfengbojiang(姜凤波) pr->pattern.complex.value = conf->url;
3291*3da8d17dSfengbojiang(姜凤波) pr->replacement.value = conf->location;
3292*3da8d17dSfengbojiang(姜凤波)
3293*3da8d17dSfengbojiang(姜凤波) } else {
3294*3da8d17dSfengbojiang(姜凤波) pr->pattern.complex.value.len = conf->url.len
3295*3da8d17dSfengbojiang(姜凤波) + sizeof("/") - 1;
3296*3da8d17dSfengbojiang(姜凤波)
3297*3da8d17dSfengbojiang(姜凤波) p = ngx_pnalloc(cf->pool, pr->pattern.complex.value.len);
3298*3da8d17dSfengbojiang(姜凤波) if (p == NULL) {
3299*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3300*3da8d17dSfengbojiang(姜凤波) }
3301*3da8d17dSfengbojiang(姜凤波)
3302*3da8d17dSfengbojiang(姜凤波) pr->pattern.complex.value.data = p;
3303*3da8d17dSfengbojiang(姜凤波)
3304*3da8d17dSfengbojiang(姜凤波) p = ngx_cpymem(p, conf->url.data, conf->url.len);
3305*3da8d17dSfengbojiang(姜凤波) *p = '/';
3306*3da8d17dSfengbojiang(姜凤波)
3307*3da8d17dSfengbojiang(姜凤波) ngx_str_set(&pr->replacement.value, "/");
3308*3da8d17dSfengbojiang(姜凤波) }
3309*3da8d17dSfengbojiang(姜凤波) }
3310*3da8d17dSfengbojiang(姜凤波) }
3311*3da8d17dSfengbojiang(姜凤波)
3312*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_ptr_value(conf->cookie_domains, prev->cookie_domains, NULL);
3313*3da8d17dSfengbojiang(姜凤波)
3314*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_ptr_value(conf->cookie_paths, prev->cookie_paths, NULL);
3315*3da8d17dSfengbojiang(姜凤波)
3316*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_uint_value(conf->http_version, prev->http_version,
3317*3da8d17dSfengbojiang(姜凤波) NGX_HTTP_VERSION_10);
3318*3da8d17dSfengbojiang(姜凤波)
3319*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_uint_value(conf->headers_hash_max_size,
3320*3da8d17dSfengbojiang(姜凤波) prev->headers_hash_max_size, 512);
3321*3da8d17dSfengbojiang(姜凤波)
3322*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_uint_value(conf->headers_hash_bucket_size,
3323*3da8d17dSfengbojiang(姜凤波) prev->headers_hash_bucket_size, 64);
3324*3da8d17dSfengbojiang(姜凤波)
3325*3da8d17dSfengbojiang(姜凤波) conf->headers_hash_bucket_size = ngx_align(conf->headers_hash_bucket_size,
3326*3da8d17dSfengbojiang(姜凤波) ngx_cacheline_size);
3327*3da8d17dSfengbojiang(姜凤波)
3328*3da8d17dSfengbojiang(姜凤波) hash.max_size = conf->headers_hash_max_size;
3329*3da8d17dSfengbojiang(姜凤波) hash.bucket_size = conf->headers_hash_bucket_size;
3330*3da8d17dSfengbojiang(姜凤波) hash.name = "proxy_headers_hash";
3331*3da8d17dSfengbojiang(姜凤波)
3332*3da8d17dSfengbojiang(姜凤波) if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream,
3333*3da8d17dSfengbojiang(姜凤波) &prev->upstream, ngx_http_proxy_hide_headers, &hash)
3334*3da8d17dSfengbojiang(姜凤波) != NGX_OK)
3335*3da8d17dSfengbojiang(姜凤波) {
3336*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3337*3da8d17dSfengbojiang(姜凤波) }
3338*3da8d17dSfengbojiang(姜凤波)
3339*3da8d17dSfengbojiang(姜凤波) clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
3340*3da8d17dSfengbojiang(姜凤波)
3341*3da8d17dSfengbojiang(姜凤波) if (clcf->noname
3342*3da8d17dSfengbojiang(姜凤波) && conf->upstream.upstream == NULL && conf->proxy_lengths == NULL)
3343*3da8d17dSfengbojiang(姜凤波) {
3344*3da8d17dSfengbojiang(姜凤波) conf->upstream.upstream = prev->upstream.upstream;
3345*3da8d17dSfengbojiang(姜凤波) conf->location = prev->location;
3346*3da8d17dSfengbojiang(姜凤波) conf->vars = prev->vars;
3347*3da8d17dSfengbojiang(姜凤波)
3348*3da8d17dSfengbojiang(姜凤波) conf->proxy_lengths = prev->proxy_lengths;
3349*3da8d17dSfengbojiang(姜凤波) conf->proxy_values = prev->proxy_values;
3350*3da8d17dSfengbojiang(姜凤波)
3351*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_SSL)
3352*3da8d17dSfengbojiang(姜凤波) conf->upstream.ssl = prev->upstream.ssl;
3353*3da8d17dSfengbojiang(姜凤波) #endif
3354*3da8d17dSfengbojiang(姜凤波) }
3355*3da8d17dSfengbojiang(姜凤波)
3356*3da8d17dSfengbojiang(姜凤波) if (clcf->lmt_excpt && clcf->handler == NULL
3357*3da8d17dSfengbojiang(姜凤波) && (conf->upstream.upstream || conf->proxy_lengths))
3358*3da8d17dSfengbojiang(姜凤波) {
3359*3da8d17dSfengbojiang(姜凤波) clcf->handler = ngx_http_proxy_handler;
3360*3da8d17dSfengbojiang(姜凤波) }
3361*3da8d17dSfengbojiang(姜凤波)
3362*3da8d17dSfengbojiang(姜凤波) if (conf->body_source.data == NULL) {
3363*3da8d17dSfengbojiang(姜凤波) conf->body_flushes = prev->body_flushes;
3364*3da8d17dSfengbojiang(姜凤波) conf->body_source = prev->body_source;
3365*3da8d17dSfengbojiang(姜凤波) conf->body_lengths = prev->body_lengths;
3366*3da8d17dSfengbojiang(姜凤波) conf->body_values = prev->body_values;
3367*3da8d17dSfengbojiang(姜凤波) }
3368*3da8d17dSfengbojiang(姜凤波)
3369*3da8d17dSfengbojiang(姜凤波) if (conf->body_source.data && conf->body_lengths == NULL) {
3370*3da8d17dSfengbojiang(姜凤波)
3371*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));
3372*3da8d17dSfengbojiang(姜凤波)
3373*3da8d17dSfengbojiang(姜凤波) sc.cf = cf;
3374*3da8d17dSfengbojiang(姜凤波) sc.source = &conf->body_source;
3375*3da8d17dSfengbojiang(姜凤波) sc.flushes = &conf->body_flushes;
3376*3da8d17dSfengbojiang(姜凤波) sc.lengths = &conf->body_lengths;
3377*3da8d17dSfengbojiang(姜凤波) sc.values = &conf->body_values;
3378*3da8d17dSfengbojiang(姜凤波) sc.complete_lengths = 1;
3379*3da8d17dSfengbojiang(姜凤波) sc.complete_values = 1;
3380*3da8d17dSfengbojiang(姜凤波)
3381*3da8d17dSfengbojiang(姜凤波) if (ngx_http_script_compile(&sc) != NGX_OK) {
3382*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3383*3da8d17dSfengbojiang(姜凤波) }
3384*3da8d17dSfengbojiang(姜凤波) }
3385*3da8d17dSfengbojiang(姜凤波)
3386*3da8d17dSfengbojiang(姜凤波) if (conf->headers_source == NULL) {
3387*3da8d17dSfengbojiang(姜凤波) conf->headers = prev->headers;
3388*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
3389*3da8d17dSfengbojiang(姜凤波) conf->headers_cache = prev->headers_cache;
3390*3da8d17dSfengbojiang(姜凤波) #endif
3391*3da8d17dSfengbojiang(姜凤波) conf->headers_source = prev->headers_source;
3392*3da8d17dSfengbojiang(姜凤波) }
3393*3da8d17dSfengbojiang(姜凤波)
3394*3da8d17dSfengbojiang(姜凤波) rc = ngx_http_proxy_init_headers(cf, conf, &conf->headers,
3395*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_headers);
3396*3da8d17dSfengbojiang(姜凤波) if (rc != NGX_OK) {
3397*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3398*3da8d17dSfengbojiang(姜凤波) }
3399*3da8d17dSfengbojiang(姜凤波)
3400*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
3401*3da8d17dSfengbojiang(姜凤波)
3402*3da8d17dSfengbojiang(姜凤波) if (conf->upstream.cache) {
3403*3da8d17dSfengbojiang(姜凤波) rc = ngx_http_proxy_init_headers(cf, conf, &conf->headers_cache,
3404*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_cache_headers);
3405*3da8d17dSfengbojiang(姜凤波) if (rc != NGX_OK) {
3406*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3407*3da8d17dSfengbojiang(姜凤波) }
3408*3da8d17dSfengbojiang(姜凤波) }
3409*3da8d17dSfengbojiang(姜凤波)
3410*3da8d17dSfengbojiang(姜凤波) #endif
3411*3da8d17dSfengbojiang(姜凤波)
3412*3da8d17dSfengbojiang(姜凤波) /*
3413*3da8d17dSfengbojiang(姜凤波) * special handling to preserve conf->headers in the "http" section
3414*3da8d17dSfengbojiang(姜凤波) * to inherit it to all servers
3415*3da8d17dSfengbojiang(姜凤波) */
3416*3da8d17dSfengbojiang(姜凤波)
3417*3da8d17dSfengbojiang(姜凤波) if (prev->headers.hash.buckets == NULL
3418*3da8d17dSfengbojiang(姜凤波) && conf->headers_source == prev->headers_source)
3419*3da8d17dSfengbojiang(姜凤波) {
3420*3da8d17dSfengbojiang(姜凤波) prev->headers = conf->headers;
3421*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
3422*3da8d17dSfengbojiang(姜凤波) prev->headers_cache = conf->headers_cache;
3423*3da8d17dSfengbojiang(姜凤波) #endif
3424*3da8d17dSfengbojiang(姜凤波) }
3425*3da8d17dSfengbojiang(姜凤波)
3426*3da8d17dSfengbojiang(姜凤波) #if (NGX_HAVE_FSTACK)
3427*3da8d17dSfengbojiang(姜凤波) /* By default, we set up a proxy on fstack */
3428*3da8d17dSfengbojiang(姜凤波) ngx_conf_merge_value(conf->kernel_network_stack,
3429*3da8d17dSfengbojiang(姜凤波) prev->kernel_network_stack, 0);
3430*3da8d17dSfengbojiang(姜凤波) #endif
3431*3da8d17dSfengbojiang(姜凤波)
3432*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
3433*3da8d17dSfengbojiang(姜凤波) }
3434*3da8d17dSfengbojiang(姜凤波)
3435*3da8d17dSfengbojiang(姜凤波)
3436*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_init_headers(ngx_conf_t * cf,ngx_http_proxy_loc_conf_t * conf,ngx_http_proxy_headers_t * headers,ngx_keyval_t * default_headers)3437*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_init_headers(ngx_conf_t *cf, ngx_http_proxy_loc_conf_t *conf,
3438*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_headers_t *headers, ngx_keyval_t *default_headers)
3439*3da8d17dSfengbojiang(姜凤波) {
3440*3da8d17dSfengbojiang(姜凤波) u_char *p;
3441*3da8d17dSfengbojiang(姜凤波) size_t size;
3442*3da8d17dSfengbojiang(姜凤波) uintptr_t *code;
3443*3da8d17dSfengbojiang(姜凤波) ngx_uint_t i;
3444*3da8d17dSfengbojiang(姜凤波) ngx_array_t headers_names, headers_merged;
3445*3da8d17dSfengbojiang(姜凤波) ngx_keyval_t *src, *s, *h;
3446*3da8d17dSfengbojiang(姜凤波) ngx_hash_key_t *hk;
3447*3da8d17dSfengbojiang(姜凤波) ngx_hash_init_t hash;
3448*3da8d17dSfengbojiang(姜凤波) ngx_http_script_compile_t sc;
3449*3da8d17dSfengbojiang(姜凤波) ngx_http_script_copy_code_t *copy;
3450*3da8d17dSfengbojiang(姜凤波)
3451*3da8d17dSfengbojiang(姜凤波) if (headers->hash.buckets) {
3452*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
3453*3da8d17dSfengbojiang(姜凤波) }
3454*3da8d17dSfengbojiang(姜凤波)
3455*3da8d17dSfengbojiang(姜凤波) if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t))
3456*3da8d17dSfengbojiang(姜凤波) != NGX_OK)
3457*3da8d17dSfengbojiang(姜凤波) {
3458*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
3459*3da8d17dSfengbojiang(姜凤波) }
3460*3da8d17dSfengbojiang(姜凤波)
3461*3da8d17dSfengbojiang(姜凤波) if (ngx_array_init(&headers_merged, cf->temp_pool, 4, sizeof(ngx_keyval_t))
3462*3da8d17dSfengbojiang(姜凤波) != NGX_OK)
3463*3da8d17dSfengbojiang(姜凤波) {
3464*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
3465*3da8d17dSfengbojiang(姜凤波) }
3466*3da8d17dSfengbojiang(姜凤波)
3467*3da8d17dSfengbojiang(姜凤波) headers->lengths = ngx_array_create(cf->pool, 64, 1);
3468*3da8d17dSfengbojiang(姜凤波) if (headers->lengths == NULL) {
3469*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
3470*3da8d17dSfengbojiang(姜凤波) }
3471*3da8d17dSfengbojiang(姜凤波)
3472*3da8d17dSfengbojiang(姜凤波) headers->values = ngx_array_create(cf->pool, 512, 1);
3473*3da8d17dSfengbojiang(姜凤波) if (headers->values == NULL) {
3474*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
3475*3da8d17dSfengbojiang(姜凤波) }
3476*3da8d17dSfengbojiang(姜凤波)
3477*3da8d17dSfengbojiang(姜凤波) if (conf->headers_source) {
3478*3da8d17dSfengbojiang(姜凤波)
3479*3da8d17dSfengbojiang(姜凤波) src = conf->headers_source->elts;
3480*3da8d17dSfengbojiang(姜凤波) for (i = 0; i < conf->headers_source->nelts; i++) {
3481*3da8d17dSfengbojiang(姜凤波)
3482*3da8d17dSfengbojiang(姜凤波) s = ngx_array_push(&headers_merged);
3483*3da8d17dSfengbojiang(姜凤波) if (s == NULL) {
3484*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
3485*3da8d17dSfengbojiang(姜凤波) }
3486*3da8d17dSfengbojiang(姜凤波)
3487*3da8d17dSfengbojiang(姜凤波) *s = src[i];
3488*3da8d17dSfengbojiang(姜凤波) }
3489*3da8d17dSfengbojiang(姜凤波) }
3490*3da8d17dSfengbojiang(姜凤波)
3491*3da8d17dSfengbojiang(姜凤波) h = default_headers;
3492*3da8d17dSfengbojiang(姜凤波)
3493*3da8d17dSfengbojiang(姜凤波) while (h->key.len) {
3494*3da8d17dSfengbojiang(姜凤波)
3495*3da8d17dSfengbojiang(姜凤波) src = headers_merged.elts;
3496*3da8d17dSfengbojiang(姜凤波) for (i = 0; i < headers_merged.nelts; i++) {
3497*3da8d17dSfengbojiang(姜凤波) if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) {
3498*3da8d17dSfengbojiang(姜凤波) goto next;
3499*3da8d17dSfengbojiang(姜凤波) }
3500*3da8d17dSfengbojiang(姜凤波) }
3501*3da8d17dSfengbojiang(姜凤波)
3502*3da8d17dSfengbojiang(姜凤波) s = ngx_array_push(&headers_merged);
3503*3da8d17dSfengbojiang(姜凤波) if (s == NULL) {
3504*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
3505*3da8d17dSfengbojiang(姜凤波) }
3506*3da8d17dSfengbojiang(姜凤波)
3507*3da8d17dSfengbojiang(姜凤波) *s = *h;
3508*3da8d17dSfengbojiang(姜凤波)
3509*3da8d17dSfengbojiang(姜凤波) next:
3510*3da8d17dSfengbojiang(姜凤波)
3511*3da8d17dSfengbojiang(姜凤波) h++;
3512*3da8d17dSfengbojiang(姜凤波) }
3513*3da8d17dSfengbojiang(姜凤波)
3514*3da8d17dSfengbojiang(姜凤波)
3515*3da8d17dSfengbojiang(姜凤波) src = headers_merged.elts;
3516*3da8d17dSfengbojiang(姜凤波) for (i = 0; i < headers_merged.nelts; i++) {
3517*3da8d17dSfengbojiang(姜凤波)
3518*3da8d17dSfengbojiang(姜凤波) hk = ngx_array_push(&headers_names);
3519*3da8d17dSfengbojiang(姜凤波) if (hk == NULL) {
3520*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
3521*3da8d17dSfengbojiang(姜凤波) }
3522*3da8d17dSfengbojiang(姜凤波)
3523*3da8d17dSfengbojiang(姜凤波) hk->key = src[i].key;
3524*3da8d17dSfengbojiang(姜凤波) hk->key_hash = ngx_hash_key_lc(src[i].key.data, src[i].key.len);
3525*3da8d17dSfengbojiang(姜凤波) hk->value = (void *) 1;
3526*3da8d17dSfengbojiang(姜凤波)
3527*3da8d17dSfengbojiang(姜凤波) if (src[i].value.len == 0) {
3528*3da8d17dSfengbojiang(姜凤波) continue;
3529*3da8d17dSfengbojiang(姜凤波) }
3530*3da8d17dSfengbojiang(姜凤波)
3531*3da8d17dSfengbojiang(姜凤波) copy = ngx_array_push_n(headers->lengths,
3532*3da8d17dSfengbojiang(姜凤波) sizeof(ngx_http_script_copy_code_t));
3533*3da8d17dSfengbojiang(姜凤波) if (copy == NULL) {
3534*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
3535*3da8d17dSfengbojiang(姜凤波) }
3536*3da8d17dSfengbojiang(姜凤波)
3537*3da8d17dSfengbojiang(姜凤波) copy->code = (ngx_http_script_code_pt) (void *)
3538*3da8d17dSfengbojiang(姜凤波) ngx_http_script_copy_len_code;
3539*3da8d17dSfengbojiang(姜凤波) copy->len = src[i].key.len;
3540*3da8d17dSfengbojiang(姜凤波)
3541*3da8d17dSfengbojiang(姜凤波) size = (sizeof(ngx_http_script_copy_code_t)
3542*3da8d17dSfengbojiang(姜凤波) + src[i].key.len + sizeof(uintptr_t) - 1)
3543*3da8d17dSfengbojiang(姜凤波) & ~(sizeof(uintptr_t) - 1);
3544*3da8d17dSfengbojiang(姜凤波)
3545*3da8d17dSfengbojiang(姜凤波) copy = ngx_array_push_n(headers->values, size);
3546*3da8d17dSfengbojiang(姜凤波) if (copy == NULL) {
3547*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
3548*3da8d17dSfengbojiang(姜凤波) }
3549*3da8d17dSfengbojiang(姜凤波)
3550*3da8d17dSfengbojiang(姜凤波) copy->code = ngx_http_script_copy_code;
3551*3da8d17dSfengbojiang(姜凤波) copy->len = src[i].key.len;
3552*3da8d17dSfengbojiang(姜凤波)
3553*3da8d17dSfengbojiang(姜凤波) p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);
3554*3da8d17dSfengbojiang(姜凤波) ngx_memcpy(p, src[i].key.data, src[i].key.len);
3555*3da8d17dSfengbojiang(姜凤波)
3556*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));
3557*3da8d17dSfengbojiang(姜凤波)
3558*3da8d17dSfengbojiang(姜凤波) sc.cf = cf;
3559*3da8d17dSfengbojiang(姜凤波) sc.source = &src[i].value;
3560*3da8d17dSfengbojiang(姜凤波) sc.flushes = &headers->flushes;
3561*3da8d17dSfengbojiang(姜凤波) sc.lengths = &headers->lengths;
3562*3da8d17dSfengbojiang(姜凤波) sc.values = &headers->values;
3563*3da8d17dSfengbojiang(姜凤波)
3564*3da8d17dSfengbojiang(姜凤波) if (ngx_http_script_compile(&sc) != NGX_OK) {
3565*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
3566*3da8d17dSfengbojiang(姜凤波) }
3567*3da8d17dSfengbojiang(姜凤波)
3568*3da8d17dSfengbojiang(姜凤波) code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));
3569*3da8d17dSfengbojiang(姜凤波) if (code == NULL) {
3570*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
3571*3da8d17dSfengbojiang(姜凤波) }
3572*3da8d17dSfengbojiang(姜凤波)
3573*3da8d17dSfengbojiang(姜凤波) *code = (uintptr_t) NULL;
3574*3da8d17dSfengbojiang(姜凤波)
3575*3da8d17dSfengbojiang(姜凤波) code = ngx_array_push_n(headers->values, sizeof(uintptr_t));
3576*3da8d17dSfengbojiang(姜凤波) if (code == NULL) {
3577*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
3578*3da8d17dSfengbojiang(姜凤波) }
3579*3da8d17dSfengbojiang(姜凤波)
3580*3da8d17dSfengbojiang(姜凤波) *code = (uintptr_t) NULL;
3581*3da8d17dSfengbojiang(姜凤波) }
3582*3da8d17dSfengbojiang(姜凤波)
3583*3da8d17dSfengbojiang(姜凤波) code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));
3584*3da8d17dSfengbojiang(姜凤波) if (code == NULL) {
3585*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
3586*3da8d17dSfengbojiang(姜凤波) }
3587*3da8d17dSfengbojiang(姜凤波)
3588*3da8d17dSfengbojiang(姜凤波) *code = (uintptr_t) NULL;
3589*3da8d17dSfengbojiang(姜凤波)
3590*3da8d17dSfengbojiang(姜凤波)
3591*3da8d17dSfengbojiang(姜凤波) hash.hash = &headers->hash;
3592*3da8d17dSfengbojiang(姜凤波) hash.key = ngx_hash_key_lc;
3593*3da8d17dSfengbojiang(姜凤波) hash.max_size = conf->headers_hash_max_size;
3594*3da8d17dSfengbojiang(姜凤波) hash.bucket_size = conf->headers_hash_bucket_size;
3595*3da8d17dSfengbojiang(姜凤波) hash.name = "proxy_headers_hash";
3596*3da8d17dSfengbojiang(姜凤波) hash.pool = cf->pool;
3597*3da8d17dSfengbojiang(姜凤波) hash.temp_pool = NULL;
3598*3da8d17dSfengbojiang(姜凤波)
3599*3da8d17dSfengbojiang(姜凤波) return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts);
3600*3da8d17dSfengbojiang(姜凤波) }
3601*3da8d17dSfengbojiang(姜凤波)
3602*3da8d17dSfengbojiang(姜凤波)
3603*3da8d17dSfengbojiang(姜凤波) static char *
ngx_http_proxy_pass(ngx_conf_t * cf,ngx_command_t * cmd,void * conf)3604*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
3605*3da8d17dSfengbojiang(姜凤波) {
3606*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *plcf = conf;
3607*3da8d17dSfengbojiang(姜凤波)
3608*3da8d17dSfengbojiang(姜凤波) size_t add;
3609*3da8d17dSfengbojiang(姜凤波) u_short port;
3610*3da8d17dSfengbojiang(姜凤波) ngx_str_t *value, *url;
3611*3da8d17dSfengbojiang(姜凤波) ngx_url_t u;
3612*3da8d17dSfengbojiang(姜凤波) ngx_uint_t n;
3613*3da8d17dSfengbojiang(姜凤波) ngx_http_core_loc_conf_t *clcf;
3614*3da8d17dSfengbojiang(姜凤波) ngx_http_script_compile_t sc;
3615*3da8d17dSfengbojiang(姜凤波)
3616*3da8d17dSfengbojiang(姜凤波) if (plcf->upstream.upstream || plcf->proxy_lengths) {
3617*3da8d17dSfengbojiang(姜凤波) return "is duplicate";
3618*3da8d17dSfengbojiang(姜凤波) }
3619*3da8d17dSfengbojiang(姜凤波)
3620*3da8d17dSfengbojiang(姜凤波) clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
3621*3da8d17dSfengbojiang(姜凤波)
3622*3da8d17dSfengbojiang(姜凤波) clcf->handler = ngx_http_proxy_handler;
3623*3da8d17dSfengbojiang(姜凤波)
3624*3da8d17dSfengbojiang(姜凤波) if (clcf->name.len && clcf->name.data[clcf->name.len - 1] == '/') {
3625*3da8d17dSfengbojiang(姜凤波) clcf->auto_redirect = 1;
3626*3da8d17dSfengbojiang(姜凤波) }
3627*3da8d17dSfengbojiang(姜凤波)
3628*3da8d17dSfengbojiang(姜凤波) value = cf->args->elts;
3629*3da8d17dSfengbojiang(姜凤波)
3630*3da8d17dSfengbojiang(姜凤波) url = &value[1];
3631*3da8d17dSfengbojiang(姜凤波)
3632*3da8d17dSfengbojiang(姜凤波) n = ngx_http_script_variables_count(url);
3633*3da8d17dSfengbojiang(姜凤波)
3634*3da8d17dSfengbojiang(姜凤波) if (n) {
3635*3da8d17dSfengbojiang(姜凤波)
3636*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));
3637*3da8d17dSfengbojiang(姜凤波)
3638*3da8d17dSfengbojiang(姜凤波) sc.cf = cf;
3639*3da8d17dSfengbojiang(姜凤波) sc.source = url;
3640*3da8d17dSfengbojiang(姜凤波) sc.lengths = &plcf->proxy_lengths;
3641*3da8d17dSfengbojiang(姜凤波) sc.values = &plcf->proxy_values;
3642*3da8d17dSfengbojiang(姜凤波) sc.variables = n;
3643*3da8d17dSfengbojiang(姜凤波) sc.complete_lengths = 1;
3644*3da8d17dSfengbojiang(姜凤波) sc.complete_values = 1;
3645*3da8d17dSfengbojiang(姜凤波)
3646*3da8d17dSfengbojiang(姜凤波) if (ngx_http_script_compile(&sc) != NGX_OK) {
3647*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3648*3da8d17dSfengbojiang(姜凤波) }
3649*3da8d17dSfengbojiang(姜凤波)
3650*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_SSL)
3651*3da8d17dSfengbojiang(姜凤波) plcf->ssl = 1;
3652*3da8d17dSfengbojiang(姜凤波) #endif
3653*3da8d17dSfengbojiang(姜凤波)
3654*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
3655*3da8d17dSfengbojiang(姜凤波) }
3656*3da8d17dSfengbojiang(姜凤波)
3657*3da8d17dSfengbojiang(姜凤波) if (ngx_strncasecmp(url->data, (u_char *) "http://", 7) == 0) {
3658*3da8d17dSfengbojiang(姜凤波) add = 7;
3659*3da8d17dSfengbojiang(姜凤波) port = 80;
3660*3da8d17dSfengbojiang(姜凤波)
3661*3da8d17dSfengbojiang(姜凤波) } else if (ngx_strncasecmp(url->data, (u_char *) "https://", 8) == 0) {
3662*3da8d17dSfengbojiang(姜凤波)
3663*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_SSL)
3664*3da8d17dSfengbojiang(姜凤波) plcf->ssl = 1;
3665*3da8d17dSfengbojiang(姜凤波)
3666*3da8d17dSfengbojiang(姜凤波) add = 8;
3667*3da8d17dSfengbojiang(姜凤波) port = 443;
3668*3da8d17dSfengbojiang(姜凤波) #else
3669*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3670*3da8d17dSfengbojiang(姜凤波) "https protocol requires SSL support");
3671*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3672*3da8d17dSfengbojiang(姜凤波) #endif
3673*3da8d17dSfengbojiang(姜凤波)
3674*3da8d17dSfengbojiang(姜凤波) } else {
3675*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid URL prefix");
3676*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3677*3da8d17dSfengbojiang(姜凤波) }
3678*3da8d17dSfengbojiang(姜凤波)
3679*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&u, sizeof(ngx_url_t));
3680*3da8d17dSfengbojiang(姜凤波)
3681*3da8d17dSfengbojiang(姜凤波) u.url.len = url->len - add;
3682*3da8d17dSfengbojiang(姜凤波) u.url.data = url->data + add;
3683*3da8d17dSfengbojiang(姜凤波) u.default_port = port;
3684*3da8d17dSfengbojiang(姜凤波) u.uri_part = 1;
3685*3da8d17dSfengbojiang(姜凤波) u.no_resolve = 1;
3686*3da8d17dSfengbojiang(姜凤波)
3687*3da8d17dSfengbojiang(姜凤波) plcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);
3688*3da8d17dSfengbojiang(姜凤波) if (plcf->upstream.upstream == NULL) {
3689*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3690*3da8d17dSfengbojiang(姜凤波) }
3691*3da8d17dSfengbojiang(姜凤波)
3692*3da8d17dSfengbojiang(姜凤波) plcf->vars.schema.len = add;
3693*3da8d17dSfengbojiang(姜凤波) plcf->vars.schema.data = url->data;
3694*3da8d17dSfengbojiang(姜凤波) plcf->vars.key_start = plcf->vars.schema;
3695*3da8d17dSfengbojiang(姜凤波)
3696*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_set_vars(&u, &plcf->vars);
3697*3da8d17dSfengbojiang(姜凤波)
3698*3da8d17dSfengbojiang(姜凤波) plcf->location = clcf->name;
3699*3da8d17dSfengbojiang(姜凤波)
3700*3da8d17dSfengbojiang(姜凤波) if (clcf->named
3701*3da8d17dSfengbojiang(姜凤波) #if (NGX_PCRE)
3702*3da8d17dSfengbojiang(姜凤波) || clcf->regex
3703*3da8d17dSfengbojiang(姜凤波) #endif
3704*3da8d17dSfengbojiang(姜凤波) || clcf->noname)
3705*3da8d17dSfengbojiang(姜凤波) {
3706*3da8d17dSfengbojiang(姜凤波) if (plcf->vars.uri.len) {
3707*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3708*3da8d17dSfengbojiang(姜凤波) "\"proxy_pass\" cannot have URI part in "
3709*3da8d17dSfengbojiang(姜凤波) "location given by regular expression, "
3710*3da8d17dSfengbojiang(姜凤波) "or inside named location, "
3711*3da8d17dSfengbojiang(姜凤波) "or inside \"if\" statement, "
3712*3da8d17dSfengbojiang(姜凤波) "or inside \"limit_except\" block");
3713*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3714*3da8d17dSfengbojiang(姜凤波) }
3715*3da8d17dSfengbojiang(姜凤波)
3716*3da8d17dSfengbojiang(姜凤波) plcf->location.len = 0;
3717*3da8d17dSfengbojiang(姜凤波) }
3718*3da8d17dSfengbojiang(姜凤波)
3719*3da8d17dSfengbojiang(姜凤波) plcf->url = *url;
3720*3da8d17dSfengbojiang(姜凤波)
3721*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
3722*3da8d17dSfengbojiang(姜凤波) }
3723*3da8d17dSfengbojiang(姜凤波)
3724*3da8d17dSfengbojiang(姜凤波)
3725*3da8d17dSfengbojiang(姜凤波) static char *
ngx_http_proxy_redirect(ngx_conf_t * cf,ngx_command_t * cmd,void * conf)3726*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_redirect(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
3727*3da8d17dSfengbojiang(姜凤波) {
3728*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *plcf = conf;
3729*3da8d17dSfengbojiang(姜凤波)
3730*3da8d17dSfengbojiang(姜凤波) u_char *p;
3731*3da8d17dSfengbojiang(姜凤波) ngx_str_t *value;
3732*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_rewrite_t *pr;
3733*3da8d17dSfengbojiang(姜凤波) ngx_http_compile_complex_value_t ccv;
3734*3da8d17dSfengbojiang(姜凤波)
3735*3da8d17dSfengbojiang(姜凤波) if (plcf->redirect == 0) {
3736*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
3737*3da8d17dSfengbojiang(姜凤波) }
3738*3da8d17dSfengbojiang(姜凤波)
3739*3da8d17dSfengbojiang(姜凤波) plcf->redirect = 1;
3740*3da8d17dSfengbojiang(姜凤波)
3741*3da8d17dSfengbojiang(姜凤波) value = cf->args->elts;
3742*3da8d17dSfengbojiang(姜凤波)
3743*3da8d17dSfengbojiang(姜凤波) if (cf->args->nelts == 2) {
3744*3da8d17dSfengbojiang(姜凤波) if (ngx_strcmp(value[1].data, "off") == 0) {
3745*3da8d17dSfengbojiang(姜凤波) plcf->redirect = 0;
3746*3da8d17dSfengbojiang(姜凤波) plcf->redirects = NULL;
3747*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
3748*3da8d17dSfengbojiang(姜凤波) }
3749*3da8d17dSfengbojiang(姜凤波)
3750*3da8d17dSfengbojiang(姜凤波) if (ngx_strcmp(value[1].data, "false") == 0) {
3751*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_ERR, cf, 0,
3752*3da8d17dSfengbojiang(姜凤波) "invalid parameter \"false\", use \"off\" instead");
3753*3da8d17dSfengbojiang(姜凤波) plcf->redirect = 0;
3754*3da8d17dSfengbojiang(姜凤波) plcf->redirects = NULL;
3755*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
3756*3da8d17dSfengbojiang(姜凤波) }
3757*3da8d17dSfengbojiang(姜凤波)
3758*3da8d17dSfengbojiang(姜凤波) if (ngx_strcmp(value[1].data, "default") != 0) {
3759*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3760*3da8d17dSfengbojiang(姜凤波) "invalid parameter \"%V\"", &value[1]);
3761*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3762*3da8d17dSfengbojiang(姜凤波) }
3763*3da8d17dSfengbojiang(姜凤波) }
3764*3da8d17dSfengbojiang(姜凤波)
3765*3da8d17dSfengbojiang(姜凤波) if (plcf->redirects == NULL) {
3766*3da8d17dSfengbojiang(姜凤波) plcf->redirects = ngx_array_create(cf->pool, 1,
3767*3da8d17dSfengbojiang(姜凤波) sizeof(ngx_http_proxy_rewrite_t));
3768*3da8d17dSfengbojiang(姜凤波) if (plcf->redirects == NULL) {
3769*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3770*3da8d17dSfengbojiang(姜凤波) }
3771*3da8d17dSfengbojiang(姜凤波) }
3772*3da8d17dSfengbojiang(姜凤波)
3773*3da8d17dSfengbojiang(姜凤波) pr = ngx_array_push(plcf->redirects);
3774*3da8d17dSfengbojiang(姜凤波) if (pr == NULL) {
3775*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3776*3da8d17dSfengbojiang(姜凤波) }
3777*3da8d17dSfengbojiang(姜凤波)
3778*3da8d17dSfengbojiang(姜凤波) if (ngx_strcmp(value[1].data, "default") == 0) {
3779*3da8d17dSfengbojiang(姜凤波) if (plcf->proxy_lengths) {
3780*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3781*3da8d17dSfengbojiang(姜凤波) "\"proxy_redirect default\" cannot be used "
3782*3da8d17dSfengbojiang(姜凤波) "with \"proxy_pass\" directive with variables");
3783*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3784*3da8d17dSfengbojiang(姜凤波) }
3785*3da8d17dSfengbojiang(姜凤波)
3786*3da8d17dSfengbojiang(姜凤波) if (plcf->url.data == NULL) {
3787*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3788*3da8d17dSfengbojiang(姜凤波) "\"proxy_redirect default\" should be placed "
3789*3da8d17dSfengbojiang(姜凤波) "after the \"proxy_pass\" directive");
3790*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3791*3da8d17dSfengbojiang(姜凤波) }
3792*3da8d17dSfengbojiang(姜凤波)
3793*3da8d17dSfengbojiang(姜凤波) pr->handler = ngx_http_proxy_rewrite_complex_handler;
3794*3da8d17dSfengbojiang(姜凤波)
3795*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&pr->pattern.complex, sizeof(ngx_http_complex_value_t));
3796*3da8d17dSfengbojiang(姜凤波)
3797*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&pr->replacement, sizeof(ngx_http_complex_value_t));
3798*3da8d17dSfengbojiang(姜凤波)
3799*3da8d17dSfengbojiang(姜凤波) if (plcf->vars.uri.len) {
3800*3da8d17dSfengbojiang(姜凤波) pr->pattern.complex.value = plcf->url;
3801*3da8d17dSfengbojiang(姜凤波) pr->replacement.value = plcf->location;
3802*3da8d17dSfengbojiang(姜凤波)
3803*3da8d17dSfengbojiang(姜凤波) } else {
3804*3da8d17dSfengbojiang(姜凤波) pr->pattern.complex.value.len = plcf->url.len + sizeof("/") - 1;
3805*3da8d17dSfengbojiang(姜凤波)
3806*3da8d17dSfengbojiang(姜凤波) p = ngx_pnalloc(cf->pool, pr->pattern.complex.value.len);
3807*3da8d17dSfengbojiang(姜凤波) if (p == NULL) {
3808*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3809*3da8d17dSfengbojiang(姜凤波) }
3810*3da8d17dSfengbojiang(姜凤波)
3811*3da8d17dSfengbojiang(姜凤波) pr->pattern.complex.value.data = p;
3812*3da8d17dSfengbojiang(姜凤波)
3813*3da8d17dSfengbojiang(姜凤波) p = ngx_cpymem(p, plcf->url.data, plcf->url.len);
3814*3da8d17dSfengbojiang(姜凤波) *p = '/';
3815*3da8d17dSfengbojiang(姜凤波)
3816*3da8d17dSfengbojiang(姜凤波) ngx_str_set(&pr->replacement.value, "/");
3817*3da8d17dSfengbojiang(姜凤波) }
3818*3da8d17dSfengbojiang(姜凤波)
3819*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
3820*3da8d17dSfengbojiang(姜凤波) }
3821*3da8d17dSfengbojiang(姜凤波)
3822*3da8d17dSfengbojiang(姜凤波)
3823*3da8d17dSfengbojiang(姜凤波) if (value[1].data[0] == '~') {
3824*3da8d17dSfengbojiang(姜凤波) value[1].len--;
3825*3da8d17dSfengbojiang(姜凤波) value[1].data++;
3826*3da8d17dSfengbojiang(姜凤波)
3827*3da8d17dSfengbojiang(姜凤波) if (value[1].data[0] == '*') {
3828*3da8d17dSfengbojiang(姜凤波) value[1].len--;
3829*3da8d17dSfengbojiang(姜凤波) value[1].data++;
3830*3da8d17dSfengbojiang(姜凤波)
3831*3da8d17dSfengbojiang(姜凤波) if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 1) != NGX_OK) {
3832*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3833*3da8d17dSfengbojiang(姜凤波) }
3834*3da8d17dSfengbojiang(姜凤波)
3835*3da8d17dSfengbojiang(姜凤波) } else {
3836*3da8d17dSfengbojiang(姜凤波) if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 0) != NGX_OK) {
3837*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3838*3da8d17dSfengbojiang(姜凤波) }
3839*3da8d17dSfengbojiang(姜凤波) }
3840*3da8d17dSfengbojiang(姜凤波)
3841*3da8d17dSfengbojiang(姜凤波) } else {
3842*3da8d17dSfengbojiang(姜凤波)
3843*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
3844*3da8d17dSfengbojiang(姜凤波)
3845*3da8d17dSfengbojiang(姜凤波) ccv.cf = cf;
3846*3da8d17dSfengbojiang(姜凤波) ccv.value = &value[1];
3847*3da8d17dSfengbojiang(姜凤波) ccv.complex_value = &pr->pattern.complex;
3848*3da8d17dSfengbojiang(姜凤波)
3849*3da8d17dSfengbojiang(姜凤波) if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
3850*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3851*3da8d17dSfengbojiang(姜凤波) }
3852*3da8d17dSfengbojiang(姜凤波)
3853*3da8d17dSfengbojiang(姜凤波) pr->handler = ngx_http_proxy_rewrite_complex_handler;
3854*3da8d17dSfengbojiang(姜凤波) }
3855*3da8d17dSfengbojiang(姜凤波)
3856*3da8d17dSfengbojiang(姜凤波)
3857*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
3858*3da8d17dSfengbojiang(姜凤波)
3859*3da8d17dSfengbojiang(姜凤波) ccv.cf = cf;
3860*3da8d17dSfengbojiang(姜凤波) ccv.value = &value[2];
3861*3da8d17dSfengbojiang(姜凤波) ccv.complex_value = &pr->replacement;
3862*3da8d17dSfengbojiang(姜凤波)
3863*3da8d17dSfengbojiang(姜凤波) if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
3864*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3865*3da8d17dSfengbojiang(姜凤波) }
3866*3da8d17dSfengbojiang(姜凤波)
3867*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
3868*3da8d17dSfengbojiang(姜凤波) }
3869*3da8d17dSfengbojiang(姜凤波)
3870*3da8d17dSfengbojiang(姜凤波)
3871*3da8d17dSfengbojiang(姜凤波) static char *
ngx_http_proxy_cookie_domain(ngx_conf_t * cf,ngx_command_t * cmd,void * conf)3872*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_cookie_domain(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
3873*3da8d17dSfengbojiang(姜凤波) {
3874*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *plcf = conf;
3875*3da8d17dSfengbojiang(姜凤波)
3876*3da8d17dSfengbojiang(姜凤波) ngx_str_t *value;
3877*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_rewrite_t *pr;
3878*3da8d17dSfengbojiang(姜凤波) ngx_http_compile_complex_value_t ccv;
3879*3da8d17dSfengbojiang(姜凤波)
3880*3da8d17dSfengbojiang(姜凤波) if (plcf->cookie_domains == NULL) {
3881*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
3882*3da8d17dSfengbojiang(姜凤波) }
3883*3da8d17dSfengbojiang(姜凤波)
3884*3da8d17dSfengbojiang(姜凤波) value = cf->args->elts;
3885*3da8d17dSfengbojiang(姜凤波)
3886*3da8d17dSfengbojiang(姜凤波) if (cf->args->nelts == 2) {
3887*3da8d17dSfengbojiang(姜凤波)
3888*3da8d17dSfengbojiang(姜凤波) if (ngx_strcmp(value[1].data, "off") == 0) {
3889*3da8d17dSfengbojiang(姜凤波) plcf->cookie_domains = NULL;
3890*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
3891*3da8d17dSfengbojiang(姜凤波) }
3892*3da8d17dSfengbojiang(姜凤波)
3893*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3894*3da8d17dSfengbojiang(姜凤波) "invalid parameter \"%V\"", &value[1]);
3895*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3896*3da8d17dSfengbojiang(姜凤波) }
3897*3da8d17dSfengbojiang(姜凤波)
3898*3da8d17dSfengbojiang(姜凤波) if (plcf->cookie_domains == NGX_CONF_UNSET_PTR) {
3899*3da8d17dSfengbojiang(姜凤波) plcf->cookie_domains = ngx_array_create(cf->pool, 1,
3900*3da8d17dSfengbojiang(姜凤波) sizeof(ngx_http_proxy_rewrite_t));
3901*3da8d17dSfengbojiang(姜凤波) if (plcf->cookie_domains == NULL) {
3902*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3903*3da8d17dSfengbojiang(姜凤波) }
3904*3da8d17dSfengbojiang(姜凤波) }
3905*3da8d17dSfengbojiang(姜凤波)
3906*3da8d17dSfengbojiang(姜凤波) pr = ngx_array_push(plcf->cookie_domains);
3907*3da8d17dSfengbojiang(姜凤波) if (pr == NULL) {
3908*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3909*3da8d17dSfengbojiang(姜凤波) }
3910*3da8d17dSfengbojiang(姜凤波)
3911*3da8d17dSfengbojiang(姜凤波) if (value[1].data[0] == '~') {
3912*3da8d17dSfengbojiang(姜凤波) value[1].len--;
3913*3da8d17dSfengbojiang(姜凤波) value[1].data++;
3914*3da8d17dSfengbojiang(姜凤波)
3915*3da8d17dSfengbojiang(姜凤波) if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 1) != NGX_OK) {
3916*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3917*3da8d17dSfengbojiang(姜凤波) }
3918*3da8d17dSfengbojiang(姜凤波)
3919*3da8d17dSfengbojiang(姜凤波) } else {
3920*3da8d17dSfengbojiang(姜凤波)
3921*3da8d17dSfengbojiang(姜凤波) if (value[1].data[0] == '.') {
3922*3da8d17dSfengbojiang(姜凤波) value[1].len--;
3923*3da8d17dSfengbojiang(姜凤波) value[1].data++;
3924*3da8d17dSfengbojiang(姜凤波) }
3925*3da8d17dSfengbojiang(姜凤波)
3926*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
3927*3da8d17dSfengbojiang(姜凤波)
3928*3da8d17dSfengbojiang(姜凤波) ccv.cf = cf;
3929*3da8d17dSfengbojiang(姜凤波) ccv.value = &value[1];
3930*3da8d17dSfengbojiang(姜凤波) ccv.complex_value = &pr->pattern.complex;
3931*3da8d17dSfengbojiang(姜凤波)
3932*3da8d17dSfengbojiang(姜凤波) if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
3933*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3934*3da8d17dSfengbojiang(姜凤波) }
3935*3da8d17dSfengbojiang(姜凤波)
3936*3da8d17dSfengbojiang(姜凤波) pr->handler = ngx_http_proxy_rewrite_domain_handler;
3937*3da8d17dSfengbojiang(姜凤波)
3938*3da8d17dSfengbojiang(姜凤波) if (value[2].data[0] == '.') {
3939*3da8d17dSfengbojiang(姜凤波) value[2].len--;
3940*3da8d17dSfengbojiang(姜凤波) value[2].data++;
3941*3da8d17dSfengbojiang(姜凤波) }
3942*3da8d17dSfengbojiang(姜凤波) }
3943*3da8d17dSfengbojiang(姜凤波)
3944*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
3945*3da8d17dSfengbojiang(姜凤波)
3946*3da8d17dSfengbojiang(姜凤波) ccv.cf = cf;
3947*3da8d17dSfengbojiang(姜凤波) ccv.value = &value[2];
3948*3da8d17dSfengbojiang(姜凤波) ccv.complex_value = &pr->replacement;
3949*3da8d17dSfengbojiang(姜凤波)
3950*3da8d17dSfengbojiang(姜凤波) if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
3951*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3952*3da8d17dSfengbojiang(姜凤波) }
3953*3da8d17dSfengbojiang(姜凤波)
3954*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
3955*3da8d17dSfengbojiang(姜凤波) }
3956*3da8d17dSfengbojiang(姜凤波)
3957*3da8d17dSfengbojiang(姜凤波)
3958*3da8d17dSfengbojiang(姜凤波) static char *
ngx_http_proxy_cookie_path(ngx_conf_t * cf,ngx_command_t * cmd,void * conf)3959*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_cookie_path(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
3960*3da8d17dSfengbojiang(姜凤波) {
3961*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *plcf = conf;
3962*3da8d17dSfengbojiang(姜凤波)
3963*3da8d17dSfengbojiang(姜凤波) ngx_str_t *value;
3964*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_rewrite_t *pr;
3965*3da8d17dSfengbojiang(姜凤波) ngx_http_compile_complex_value_t ccv;
3966*3da8d17dSfengbojiang(姜凤波)
3967*3da8d17dSfengbojiang(姜凤波) if (plcf->cookie_paths == NULL) {
3968*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
3969*3da8d17dSfengbojiang(姜凤波) }
3970*3da8d17dSfengbojiang(姜凤波)
3971*3da8d17dSfengbojiang(姜凤波) value = cf->args->elts;
3972*3da8d17dSfengbojiang(姜凤波)
3973*3da8d17dSfengbojiang(姜凤波) if (cf->args->nelts == 2) {
3974*3da8d17dSfengbojiang(姜凤波)
3975*3da8d17dSfengbojiang(姜凤波) if (ngx_strcmp(value[1].data, "off") == 0) {
3976*3da8d17dSfengbojiang(姜凤波) plcf->cookie_paths = NULL;
3977*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
3978*3da8d17dSfengbojiang(姜凤波) }
3979*3da8d17dSfengbojiang(姜凤波)
3980*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3981*3da8d17dSfengbojiang(姜凤波) "invalid parameter \"%V\"", &value[1]);
3982*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3983*3da8d17dSfengbojiang(姜凤波) }
3984*3da8d17dSfengbojiang(姜凤波)
3985*3da8d17dSfengbojiang(姜凤波) if (plcf->cookie_paths == NGX_CONF_UNSET_PTR) {
3986*3da8d17dSfengbojiang(姜凤波) plcf->cookie_paths = ngx_array_create(cf->pool, 1,
3987*3da8d17dSfengbojiang(姜凤波) sizeof(ngx_http_proxy_rewrite_t));
3988*3da8d17dSfengbojiang(姜凤波) if (plcf->cookie_paths == NULL) {
3989*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3990*3da8d17dSfengbojiang(姜凤波) }
3991*3da8d17dSfengbojiang(姜凤波) }
3992*3da8d17dSfengbojiang(姜凤波)
3993*3da8d17dSfengbojiang(姜凤波) pr = ngx_array_push(plcf->cookie_paths);
3994*3da8d17dSfengbojiang(姜凤波) if (pr == NULL) {
3995*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
3996*3da8d17dSfengbojiang(姜凤波) }
3997*3da8d17dSfengbojiang(姜凤波)
3998*3da8d17dSfengbojiang(姜凤波) if (value[1].data[0] == '~') {
3999*3da8d17dSfengbojiang(姜凤波) value[1].len--;
4000*3da8d17dSfengbojiang(姜凤波) value[1].data++;
4001*3da8d17dSfengbojiang(姜凤波)
4002*3da8d17dSfengbojiang(姜凤波) if (value[1].data[0] == '*') {
4003*3da8d17dSfengbojiang(姜凤波) value[1].len--;
4004*3da8d17dSfengbojiang(姜凤波) value[1].data++;
4005*3da8d17dSfengbojiang(姜凤波)
4006*3da8d17dSfengbojiang(姜凤波) if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 1) != NGX_OK) {
4007*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
4008*3da8d17dSfengbojiang(姜凤波) }
4009*3da8d17dSfengbojiang(姜凤波)
4010*3da8d17dSfengbojiang(姜凤波) } else {
4011*3da8d17dSfengbojiang(姜凤波) if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 0) != NGX_OK) {
4012*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
4013*3da8d17dSfengbojiang(姜凤波) }
4014*3da8d17dSfengbojiang(姜凤波) }
4015*3da8d17dSfengbojiang(姜凤波)
4016*3da8d17dSfengbojiang(姜凤波) } else {
4017*3da8d17dSfengbojiang(姜凤波)
4018*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
4019*3da8d17dSfengbojiang(姜凤波)
4020*3da8d17dSfengbojiang(姜凤波) ccv.cf = cf;
4021*3da8d17dSfengbojiang(姜凤波) ccv.value = &value[1];
4022*3da8d17dSfengbojiang(姜凤波) ccv.complex_value = &pr->pattern.complex;
4023*3da8d17dSfengbojiang(姜凤波)
4024*3da8d17dSfengbojiang(姜凤波) if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
4025*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
4026*3da8d17dSfengbojiang(姜凤波) }
4027*3da8d17dSfengbojiang(姜凤波)
4028*3da8d17dSfengbojiang(姜凤波) pr->handler = ngx_http_proxy_rewrite_complex_handler;
4029*3da8d17dSfengbojiang(姜凤波) }
4030*3da8d17dSfengbojiang(姜凤波)
4031*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
4032*3da8d17dSfengbojiang(姜凤波)
4033*3da8d17dSfengbojiang(姜凤波) ccv.cf = cf;
4034*3da8d17dSfengbojiang(姜凤波) ccv.value = &value[2];
4035*3da8d17dSfengbojiang(姜凤波) ccv.complex_value = &pr->replacement;
4036*3da8d17dSfengbojiang(姜凤波)
4037*3da8d17dSfengbojiang(姜凤波) if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
4038*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
4039*3da8d17dSfengbojiang(姜凤波) }
4040*3da8d17dSfengbojiang(姜凤波)
4041*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
4042*3da8d17dSfengbojiang(姜凤波) }
4043*3da8d17dSfengbojiang(姜凤波)
4044*3da8d17dSfengbojiang(姜凤波)
4045*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_rewrite_regex(ngx_conf_t * cf,ngx_http_proxy_rewrite_t * pr,ngx_str_t * regex,ngx_uint_t caseless)4046*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_rewrite_regex(ngx_conf_t *cf, ngx_http_proxy_rewrite_t *pr,
4047*3da8d17dSfengbojiang(姜凤波) ngx_str_t *regex, ngx_uint_t caseless)
4048*3da8d17dSfengbojiang(姜凤波) {
4049*3da8d17dSfengbojiang(姜凤波) #if (NGX_PCRE)
4050*3da8d17dSfengbojiang(姜凤波) u_char errstr[NGX_MAX_CONF_ERRSTR];
4051*3da8d17dSfengbojiang(姜凤波) ngx_regex_compile_t rc;
4052*3da8d17dSfengbojiang(姜凤波)
4053*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&rc, sizeof(ngx_regex_compile_t));
4054*3da8d17dSfengbojiang(姜凤波)
4055*3da8d17dSfengbojiang(姜凤波) rc.pattern = *regex;
4056*3da8d17dSfengbojiang(姜凤波) rc.err.len = NGX_MAX_CONF_ERRSTR;
4057*3da8d17dSfengbojiang(姜凤波) rc.err.data = errstr;
4058*3da8d17dSfengbojiang(姜凤波)
4059*3da8d17dSfengbojiang(姜凤波) if (caseless) {
4060*3da8d17dSfengbojiang(姜凤波) rc.options = NGX_REGEX_CASELESS;
4061*3da8d17dSfengbojiang(姜凤波) }
4062*3da8d17dSfengbojiang(姜凤波)
4063*3da8d17dSfengbojiang(姜凤波) pr->pattern.regex = ngx_http_regex_compile(cf, &rc);
4064*3da8d17dSfengbojiang(姜凤波) if (pr->pattern.regex == NULL) {
4065*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
4066*3da8d17dSfengbojiang(姜凤波) }
4067*3da8d17dSfengbojiang(姜凤波)
4068*3da8d17dSfengbojiang(姜凤波) pr->handler = ngx_http_proxy_rewrite_regex_handler;
4069*3da8d17dSfengbojiang(姜凤波)
4070*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
4071*3da8d17dSfengbojiang(姜凤波)
4072*3da8d17dSfengbojiang(姜凤波) #else
4073*3da8d17dSfengbojiang(姜凤波)
4074*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
4075*3da8d17dSfengbojiang(姜凤波) "using regex \"%V\" requires PCRE library", regex);
4076*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
4077*3da8d17dSfengbojiang(姜凤波)
4078*3da8d17dSfengbojiang(姜凤波) #endif
4079*3da8d17dSfengbojiang(姜凤波) }
4080*3da8d17dSfengbojiang(姜凤波)
4081*3da8d17dSfengbojiang(姜凤波)
4082*3da8d17dSfengbojiang(姜凤波) static char *
ngx_http_proxy_store(ngx_conf_t * cf,ngx_command_t * cmd,void * conf)4083*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_store(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
4084*3da8d17dSfengbojiang(姜凤波) {
4085*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *plcf = conf;
4086*3da8d17dSfengbojiang(姜凤波)
4087*3da8d17dSfengbojiang(姜凤波) ngx_str_t *value;
4088*3da8d17dSfengbojiang(姜凤波) ngx_http_script_compile_t sc;
4089*3da8d17dSfengbojiang(姜凤波)
4090*3da8d17dSfengbojiang(姜凤波) if (plcf->upstream.store != NGX_CONF_UNSET) {
4091*3da8d17dSfengbojiang(姜凤波) return "is duplicate";
4092*3da8d17dSfengbojiang(姜凤波) }
4093*3da8d17dSfengbojiang(姜凤波)
4094*3da8d17dSfengbojiang(姜凤波) value = cf->args->elts;
4095*3da8d17dSfengbojiang(姜凤波)
4096*3da8d17dSfengbojiang(姜凤波) if (ngx_strcmp(value[1].data, "off") == 0) {
4097*3da8d17dSfengbojiang(姜凤波) plcf->upstream.store = 0;
4098*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
4099*3da8d17dSfengbojiang(姜凤波) }
4100*3da8d17dSfengbojiang(姜凤波)
4101*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
4102*3da8d17dSfengbojiang(姜凤波) if (plcf->upstream.cache > 0) {
4103*3da8d17dSfengbojiang(姜凤波) return "is incompatible with \"proxy_cache\"";
4104*3da8d17dSfengbojiang(姜凤波) }
4105*3da8d17dSfengbojiang(姜凤波) #endif
4106*3da8d17dSfengbojiang(姜凤波)
4107*3da8d17dSfengbojiang(姜凤波) plcf->upstream.store = 1;
4108*3da8d17dSfengbojiang(姜凤波)
4109*3da8d17dSfengbojiang(姜凤波) if (ngx_strcmp(value[1].data, "on") == 0) {
4110*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
4111*3da8d17dSfengbojiang(姜凤波) }
4112*3da8d17dSfengbojiang(姜凤波)
4113*3da8d17dSfengbojiang(姜凤波) /* include the terminating '\0' into script */
4114*3da8d17dSfengbojiang(姜凤波) value[1].len++;
4115*3da8d17dSfengbojiang(姜凤波)
4116*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));
4117*3da8d17dSfengbojiang(姜凤波)
4118*3da8d17dSfengbojiang(姜凤波) sc.cf = cf;
4119*3da8d17dSfengbojiang(姜凤波) sc.source = &value[1];
4120*3da8d17dSfengbojiang(姜凤波) sc.lengths = &plcf->upstream.store_lengths;
4121*3da8d17dSfengbojiang(姜凤波) sc.values = &plcf->upstream.store_values;
4122*3da8d17dSfengbojiang(姜凤波) sc.variables = ngx_http_script_variables_count(&value[1]);
4123*3da8d17dSfengbojiang(姜凤波) sc.complete_lengths = 1;
4124*3da8d17dSfengbojiang(姜凤波) sc.complete_values = 1;
4125*3da8d17dSfengbojiang(姜凤波)
4126*3da8d17dSfengbojiang(姜凤波) if (ngx_http_script_compile(&sc) != NGX_OK) {
4127*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
4128*3da8d17dSfengbojiang(姜凤波) }
4129*3da8d17dSfengbojiang(姜凤波)
4130*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
4131*3da8d17dSfengbojiang(姜凤波) }
4132*3da8d17dSfengbojiang(姜凤波)
4133*3da8d17dSfengbojiang(姜凤波)
4134*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_CACHE)
4135*3da8d17dSfengbojiang(姜凤波)
4136*3da8d17dSfengbojiang(姜凤波) static char *
ngx_http_proxy_cache(ngx_conf_t * cf,ngx_command_t * cmd,void * conf)4137*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
4138*3da8d17dSfengbojiang(姜凤波) {
4139*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *plcf = conf;
4140*3da8d17dSfengbojiang(姜凤波)
4141*3da8d17dSfengbojiang(姜凤波) ngx_str_t *value;
4142*3da8d17dSfengbojiang(姜凤波) ngx_http_complex_value_t cv;
4143*3da8d17dSfengbojiang(姜凤波) ngx_http_compile_complex_value_t ccv;
4144*3da8d17dSfengbojiang(姜凤波)
4145*3da8d17dSfengbojiang(姜凤波) value = cf->args->elts;
4146*3da8d17dSfengbojiang(姜凤波)
4147*3da8d17dSfengbojiang(姜凤波) if (plcf->upstream.cache != NGX_CONF_UNSET) {
4148*3da8d17dSfengbojiang(姜凤波) return "is duplicate";
4149*3da8d17dSfengbojiang(姜凤波) }
4150*3da8d17dSfengbojiang(姜凤波)
4151*3da8d17dSfengbojiang(姜凤波) if (ngx_strcmp(value[1].data, "off") == 0) {
4152*3da8d17dSfengbojiang(姜凤波) plcf->upstream.cache = 0;
4153*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
4154*3da8d17dSfengbojiang(姜凤波) }
4155*3da8d17dSfengbojiang(姜凤波)
4156*3da8d17dSfengbojiang(姜凤波) if (plcf->upstream.store > 0) {
4157*3da8d17dSfengbojiang(姜凤波) return "is incompatible with \"proxy_store\"";
4158*3da8d17dSfengbojiang(姜凤波) }
4159*3da8d17dSfengbojiang(姜凤波)
4160*3da8d17dSfengbojiang(姜凤波) plcf->upstream.cache = 1;
4161*3da8d17dSfengbojiang(姜凤波)
4162*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
4163*3da8d17dSfengbojiang(姜凤波)
4164*3da8d17dSfengbojiang(姜凤波) ccv.cf = cf;
4165*3da8d17dSfengbojiang(姜凤波) ccv.value = &value[1];
4166*3da8d17dSfengbojiang(姜凤波) ccv.complex_value = &cv;
4167*3da8d17dSfengbojiang(姜凤波)
4168*3da8d17dSfengbojiang(姜凤波) if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
4169*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
4170*3da8d17dSfengbojiang(姜凤波) }
4171*3da8d17dSfengbojiang(姜凤波)
4172*3da8d17dSfengbojiang(姜凤波) if (cv.lengths != NULL) {
4173*3da8d17dSfengbojiang(姜凤波)
4174*3da8d17dSfengbojiang(姜凤波) plcf->upstream.cache_value = ngx_palloc(cf->pool,
4175*3da8d17dSfengbojiang(姜凤波) sizeof(ngx_http_complex_value_t));
4176*3da8d17dSfengbojiang(姜凤波) if (plcf->upstream.cache_value == NULL) {
4177*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
4178*3da8d17dSfengbojiang(姜凤波) }
4179*3da8d17dSfengbojiang(姜凤波)
4180*3da8d17dSfengbojiang(姜凤波) *plcf->upstream.cache_value = cv;
4181*3da8d17dSfengbojiang(姜凤波)
4182*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
4183*3da8d17dSfengbojiang(姜凤波) }
4184*3da8d17dSfengbojiang(姜凤波)
4185*3da8d17dSfengbojiang(姜凤波) plcf->upstream.cache_zone = ngx_shared_memory_add(cf, &value[1], 0,
4186*3da8d17dSfengbojiang(姜凤波) &ngx_http_proxy_module);
4187*3da8d17dSfengbojiang(姜凤波) if (plcf->upstream.cache_zone == NULL) {
4188*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
4189*3da8d17dSfengbojiang(姜凤波) }
4190*3da8d17dSfengbojiang(姜凤波)
4191*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
4192*3da8d17dSfengbojiang(姜凤波) }
4193*3da8d17dSfengbojiang(姜凤波)
4194*3da8d17dSfengbojiang(姜凤波)
4195*3da8d17dSfengbojiang(姜凤波) static char *
ngx_http_proxy_cache_key(ngx_conf_t * cf,ngx_command_t * cmd,void * conf)4196*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
4197*3da8d17dSfengbojiang(姜凤波) {
4198*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *plcf = conf;
4199*3da8d17dSfengbojiang(姜凤波)
4200*3da8d17dSfengbojiang(姜凤波) ngx_str_t *value;
4201*3da8d17dSfengbojiang(姜凤波) ngx_http_compile_complex_value_t ccv;
4202*3da8d17dSfengbojiang(姜凤波)
4203*3da8d17dSfengbojiang(姜凤波) value = cf->args->elts;
4204*3da8d17dSfengbojiang(姜凤波)
4205*3da8d17dSfengbojiang(姜凤波) if (plcf->cache_key.value.data) {
4206*3da8d17dSfengbojiang(姜凤波) return "is duplicate";
4207*3da8d17dSfengbojiang(姜凤波) }
4208*3da8d17dSfengbojiang(姜凤波)
4209*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
4210*3da8d17dSfengbojiang(姜凤波)
4211*3da8d17dSfengbojiang(姜凤波) ccv.cf = cf;
4212*3da8d17dSfengbojiang(姜凤波) ccv.value = &value[1];
4213*3da8d17dSfengbojiang(姜凤波) ccv.complex_value = &plcf->cache_key;
4214*3da8d17dSfengbojiang(姜凤波)
4215*3da8d17dSfengbojiang(姜凤波) if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
4216*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
4217*3da8d17dSfengbojiang(姜凤波) }
4218*3da8d17dSfengbojiang(姜凤波)
4219*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
4220*3da8d17dSfengbojiang(姜凤波) }
4221*3da8d17dSfengbojiang(姜凤波)
4222*3da8d17dSfengbojiang(姜凤波) #endif
4223*3da8d17dSfengbojiang(姜凤波)
4224*3da8d17dSfengbojiang(姜凤波)
4225*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_SSL)
4226*3da8d17dSfengbojiang(姜凤波)
4227*3da8d17dSfengbojiang(姜凤波) static char *
ngx_http_proxy_ssl_password_file(ngx_conf_t * cf,ngx_command_t * cmd,void * conf)4228*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
4229*3da8d17dSfengbojiang(姜凤波) {
4230*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_loc_conf_t *plcf = conf;
4231*3da8d17dSfengbojiang(姜凤波)
4232*3da8d17dSfengbojiang(姜凤波) ngx_str_t *value;
4233*3da8d17dSfengbojiang(姜凤波)
4234*3da8d17dSfengbojiang(姜凤波) if (plcf->ssl_passwords != NGX_CONF_UNSET_PTR) {
4235*3da8d17dSfengbojiang(姜凤波) return "is duplicate";
4236*3da8d17dSfengbojiang(姜凤波) }
4237*3da8d17dSfengbojiang(姜凤波)
4238*3da8d17dSfengbojiang(姜凤波) value = cf->args->elts;
4239*3da8d17dSfengbojiang(姜凤波)
4240*3da8d17dSfengbojiang(姜凤波) plcf->ssl_passwords = ngx_ssl_read_password_file(cf, &value[1]);
4241*3da8d17dSfengbojiang(姜凤波)
4242*3da8d17dSfengbojiang(姜凤波) if (plcf->ssl_passwords == NULL) {
4243*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
4244*3da8d17dSfengbojiang(姜凤波) }
4245*3da8d17dSfengbojiang(姜凤波)
4246*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
4247*3da8d17dSfengbojiang(姜凤波) }
4248*3da8d17dSfengbojiang(姜凤波)
4249*3da8d17dSfengbojiang(姜凤波) #endif
4250*3da8d17dSfengbojiang(姜凤波)
4251*3da8d17dSfengbojiang(姜凤波)
4252*3da8d17dSfengbojiang(姜凤波) static char *
ngx_http_proxy_lowat_check(ngx_conf_t * cf,void * post,void * data)4253*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_lowat_check(ngx_conf_t *cf, void *post, void *data)
4254*3da8d17dSfengbojiang(姜凤波) {
4255*3da8d17dSfengbojiang(姜凤波) #if (NGX_FREEBSD)
4256*3da8d17dSfengbojiang(姜凤波) ssize_t *np = data;
4257*3da8d17dSfengbojiang(姜凤波)
4258*3da8d17dSfengbojiang(姜凤波) if ((u_long) *np >= ngx_freebsd_net_inet_tcp_sendspace) {
4259*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
4260*3da8d17dSfengbojiang(姜凤波) "\"proxy_send_lowat\" must be less than %d "
4261*3da8d17dSfengbojiang(姜凤波) "(sysctl net.inet.tcp.sendspace)",
4262*3da8d17dSfengbojiang(姜凤波) ngx_freebsd_net_inet_tcp_sendspace);
4263*3da8d17dSfengbojiang(姜凤波)
4264*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
4265*3da8d17dSfengbojiang(姜凤波) }
4266*3da8d17dSfengbojiang(姜凤波)
4267*3da8d17dSfengbojiang(姜凤波) #elif !(NGX_HAVE_SO_SNDLOWAT)
4268*3da8d17dSfengbojiang(姜凤波) ssize_t *np = data;
4269*3da8d17dSfengbojiang(姜凤波)
4270*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
4271*3da8d17dSfengbojiang(姜凤波) "\"proxy_send_lowat\" is not supported, ignored");
4272*3da8d17dSfengbojiang(姜凤波)
4273*3da8d17dSfengbojiang(姜凤波) *np = 0;
4274*3da8d17dSfengbojiang(姜凤波)
4275*3da8d17dSfengbojiang(姜凤波) #endif
4276*3da8d17dSfengbojiang(姜凤波)
4277*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
4278*3da8d17dSfengbojiang(姜凤波) }
4279*3da8d17dSfengbojiang(姜凤波)
4280*3da8d17dSfengbojiang(姜凤波)
4281*3da8d17dSfengbojiang(姜凤波) #if (NGX_HTTP_SSL)
4282*3da8d17dSfengbojiang(姜凤波)
4283*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_proxy_set_ssl(ngx_conf_t * cf,ngx_http_proxy_loc_conf_t * plcf)4284*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_set_ssl(ngx_conf_t *cf, ngx_http_proxy_loc_conf_t *plcf)
4285*3da8d17dSfengbojiang(姜凤波) {
4286*3da8d17dSfengbojiang(姜凤波) ngx_pool_cleanup_t *cln;
4287*3da8d17dSfengbojiang(姜凤波)
4288*3da8d17dSfengbojiang(姜凤波) plcf->upstream.ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t));
4289*3da8d17dSfengbojiang(姜凤波) if (plcf->upstream.ssl == NULL) {
4290*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
4291*3da8d17dSfengbojiang(姜凤波) }
4292*3da8d17dSfengbojiang(姜凤波)
4293*3da8d17dSfengbojiang(姜凤波) plcf->upstream.ssl->log = cf->log;
4294*3da8d17dSfengbojiang(姜凤波)
4295*3da8d17dSfengbojiang(姜凤波) if (ngx_ssl_create(plcf->upstream.ssl, plcf->ssl_protocols, NULL)
4296*3da8d17dSfengbojiang(姜凤波) != NGX_OK)
4297*3da8d17dSfengbojiang(姜凤波) {
4298*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
4299*3da8d17dSfengbojiang(姜凤波) }
4300*3da8d17dSfengbojiang(姜凤波)
4301*3da8d17dSfengbojiang(姜凤波) cln = ngx_pool_cleanup_add(cf->pool, 0);
4302*3da8d17dSfengbojiang(姜凤波) if (cln == NULL) {
4303*3da8d17dSfengbojiang(姜凤波) ngx_ssl_cleanup_ctx(plcf->upstream.ssl);
4304*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
4305*3da8d17dSfengbojiang(姜凤波) }
4306*3da8d17dSfengbojiang(姜凤波)
4307*3da8d17dSfengbojiang(姜凤波) cln->handler = ngx_ssl_cleanup_ctx;
4308*3da8d17dSfengbojiang(姜凤波) cln->data = plcf->upstream.ssl;
4309*3da8d17dSfengbojiang(姜凤波)
4310*3da8d17dSfengbojiang(姜凤波) if (plcf->ssl_certificate.len) {
4311*3da8d17dSfengbojiang(姜凤波)
4312*3da8d17dSfengbojiang(姜凤波) if (plcf->ssl_certificate_key.len == 0) {
4313*3da8d17dSfengbojiang(姜凤波) ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
4314*3da8d17dSfengbojiang(姜凤波) "no \"proxy_ssl_certificate_key\" is defined "
4315*3da8d17dSfengbojiang(姜凤波) "for certificate \"%V\"", &plcf->ssl_certificate);
4316*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
4317*3da8d17dSfengbojiang(姜凤波) }
4318*3da8d17dSfengbojiang(姜凤波)
4319*3da8d17dSfengbojiang(姜凤波) if (ngx_ssl_certificate(cf, plcf->upstream.ssl, &plcf->ssl_certificate,
4320*3da8d17dSfengbojiang(姜凤波) &plcf->ssl_certificate_key, plcf->ssl_passwords)
4321*3da8d17dSfengbojiang(姜凤波) != NGX_OK)
4322*3da8d17dSfengbojiang(姜凤波) {
4323*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
4324*3da8d17dSfengbojiang(姜凤波) }
4325*3da8d17dSfengbojiang(姜凤波) }
4326*3da8d17dSfengbojiang(姜凤波)
4327*3da8d17dSfengbojiang(姜凤波) if (ngx_ssl_ciphers(cf, plcf->upstream.ssl, &plcf->ssl_ciphers, 0)
4328*3da8d17dSfengbojiang(姜凤波) != NGX_OK)
4329*3da8d17dSfengbojiang(姜凤波) {
4330*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
4331*3da8d17dSfengbojiang(姜凤波) }
4332*3da8d17dSfengbojiang(姜凤波)
4333*3da8d17dSfengbojiang(姜凤波) if (plcf->upstream.ssl_verify) {
4334*3da8d17dSfengbojiang(姜凤波) if (plcf->ssl_trusted_certificate.len == 0) {
4335*3da8d17dSfengbojiang(姜凤波) ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
4336*3da8d17dSfengbojiang(姜凤波) "no proxy_ssl_trusted_certificate for proxy_ssl_verify");
4337*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
4338*3da8d17dSfengbojiang(姜凤波) }
4339*3da8d17dSfengbojiang(姜凤波)
4340*3da8d17dSfengbojiang(姜凤波) if (ngx_ssl_trusted_certificate(cf, plcf->upstream.ssl,
4341*3da8d17dSfengbojiang(姜凤波) &plcf->ssl_trusted_certificate,
4342*3da8d17dSfengbojiang(姜凤波) plcf->ssl_verify_depth)
4343*3da8d17dSfengbojiang(姜凤波) != NGX_OK)
4344*3da8d17dSfengbojiang(姜凤波) {
4345*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
4346*3da8d17dSfengbojiang(姜凤波) }
4347*3da8d17dSfengbojiang(姜凤波)
4348*3da8d17dSfengbojiang(姜凤波) if (ngx_ssl_crl(cf, plcf->upstream.ssl, &plcf->ssl_crl) != NGX_OK) {
4349*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
4350*3da8d17dSfengbojiang(姜凤波) }
4351*3da8d17dSfengbojiang(姜凤波) }
4352*3da8d17dSfengbojiang(姜凤波)
4353*3da8d17dSfengbojiang(姜凤波) if (ngx_ssl_client_session_cache(cf, plcf->upstream.ssl,
4354*3da8d17dSfengbojiang(姜凤波) plcf->upstream.ssl_session_reuse)
4355*3da8d17dSfengbojiang(姜凤波) != NGX_OK)
4356*3da8d17dSfengbojiang(姜凤波) {
4357*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
4358*3da8d17dSfengbojiang(姜凤波) }
4359*3da8d17dSfengbojiang(姜凤波)
4360*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
4361*3da8d17dSfengbojiang(姜凤波) }
4362*3da8d17dSfengbojiang(姜凤波)
4363*3da8d17dSfengbojiang(姜凤波) #endif
4364*3da8d17dSfengbojiang(姜凤波)
4365*3da8d17dSfengbojiang(姜凤波)
4366*3da8d17dSfengbojiang(姜凤波) static void
ngx_http_proxy_set_vars(ngx_url_t * u,ngx_http_proxy_vars_t * v)4367*3da8d17dSfengbojiang(姜凤波) ngx_http_proxy_set_vars(ngx_url_t *u, ngx_http_proxy_vars_t *v)
4368*3da8d17dSfengbojiang(姜凤波) {
4369*3da8d17dSfengbojiang(姜凤波) if (u->family != AF_UNIX) {
4370*3da8d17dSfengbojiang(姜凤波)
4371*3da8d17dSfengbojiang(姜凤波) if (u->no_port || u->port == u->default_port) {
4372*3da8d17dSfengbojiang(姜凤波)
4373*3da8d17dSfengbojiang(姜凤波) v->host_header = u->host;
4374*3da8d17dSfengbojiang(姜凤波)
4375*3da8d17dSfengbojiang(姜凤波) if (u->default_port == 80) {
4376*3da8d17dSfengbojiang(姜凤波) ngx_str_set(&v->port, "80");
4377*3da8d17dSfengbojiang(姜凤波)
4378*3da8d17dSfengbojiang(姜凤波) } else {
4379*3da8d17dSfengbojiang(姜凤波) ngx_str_set(&v->port, "443");
4380*3da8d17dSfengbojiang(姜凤波) }
4381*3da8d17dSfengbojiang(姜凤波)
4382*3da8d17dSfengbojiang(姜凤波) } else {
4383*3da8d17dSfengbojiang(姜凤波) v->host_header.len = u->host.len + 1 + u->port_text.len;
4384*3da8d17dSfengbojiang(姜凤波) v->host_header.data = u->host.data;
4385*3da8d17dSfengbojiang(姜凤波) v->port = u->port_text;
4386*3da8d17dSfengbojiang(姜凤波) }
4387*3da8d17dSfengbojiang(姜凤波)
4388*3da8d17dSfengbojiang(姜凤波) v->key_start.len += v->host_header.len;
4389*3da8d17dSfengbojiang(姜凤波)
4390*3da8d17dSfengbojiang(姜凤波) } else {
4391*3da8d17dSfengbojiang(姜凤波) ngx_str_set(&v->host_header, "localhost");
4392*3da8d17dSfengbojiang(姜凤波) ngx_str_null(&v->port);
4393*3da8d17dSfengbojiang(姜凤波) v->key_start.len += sizeof("unix:") - 1 + u->host.len + 1;
4394*3da8d17dSfengbojiang(姜凤波) }
4395*3da8d17dSfengbojiang(姜凤波)
4396*3da8d17dSfengbojiang(姜凤波) v->uri = u->uri;
4397*3da8d17dSfengbojiang(姜凤波) }
4398