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