1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
4e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
5e18a033bSKonstantin Ananyev */
6e18a033bSKonstantin Ananyev
7e18a033bSKonstantin Ananyev
8e18a033bSKonstantin Ananyev#include <ngx_config.h>
9e18a033bSKonstantin Ananyev#include <ngx_core.h>
10e18a033bSKonstantin Ananyev#include <ngx_http.h>
11e18a033bSKonstantin Ananyev
12e18a033bSKonstantin Ananyev
13e18a033bSKonstantin Ananyevtypedef struct {
14e18a033bSKonstantin Ananyev    ngx_array_t                    caches;  /* ngx_http_file_cache_t * */
15e18a033bSKonstantin Ananyev} ngx_http_proxy_main_conf_t;
16e18a033bSKonstantin Ananyev
17e18a033bSKonstantin Ananyev
18e18a033bSKonstantin Ananyevtypedef struct ngx_http_proxy_rewrite_s  ngx_http_proxy_rewrite_t;
19e18a033bSKonstantin Ananyev
20e18a033bSKonstantin Ananyevtypedef ngx_int_t (*ngx_http_proxy_rewrite_pt)(ngx_http_request_t *r,
21e18a033bSKonstantin Ananyev    ngx_table_elt_t *h, size_t prefix, size_t len,
22e18a033bSKonstantin Ananyev    ngx_http_proxy_rewrite_t *pr);
23e18a033bSKonstantin Ananyev
24e18a033bSKonstantin Ananyevstruct ngx_http_proxy_rewrite_s {
25e18a033bSKonstantin Ananyev    ngx_http_proxy_rewrite_pt      handler;
26e18a033bSKonstantin Ananyev
27e18a033bSKonstantin Ananyev    union {
28e18a033bSKonstantin Ananyev        ngx_http_complex_value_t   complex;
29e18a033bSKonstantin Ananyev#if (NGX_PCRE)
30e18a033bSKonstantin Ananyev        ngx_http_regex_t          *regex;
31e18a033bSKonstantin Ananyev#endif
32e18a033bSKonstantin Ananyev    } pattern;
33e18a033bSKonstantin Ananyev
34e18a033bSKonstantin Ananyev    ngx_http_complex_value_t       replacement;
35e18a033bSKonstantin Ananyev};
36e18a033bSKonstantin Ananyev
37e18a033bSKonstantin Ananyev
38e18a033bSKonstantin Ananyevtypedef struct {
39e18a033bSKonstantin Ananyev    ngx_str_t                      key_start;
40e18a033bSKonstantin Ananyev    ngx_str_t                      schema;
41e18a033bSKonstantin Ananyev    ngx_str_t                      host_header;
42e18a033bSKonstantin Ananyev    ngx_str_t                      port;
43e18a033bSKonstantin Ananyev    ngx_str_t                      uri;
44e18a033bSKonstantin Ananyev} ngx_http_proxy_vars_t;
45e18a033bSKonstantin Ananyev
46e18a033bSKonstantin Ananyev
47e18a033bSKonstantin Ananyevtypedef struct {
48e18a033bSKonstantin Ananyev    ngx_array_t                   *flushes;
49e18a033bSKonstantin Ananyev    ngx_array_t                   *lengths;
50e18a033bSKonstantin Ananyev    ngx_array_t                   *values;
51e18a033bSKonstantin Ananyev    ngx_hash_t                     hash;
52e18a033bSKonstantin Ananyev} ngx_http_proxy_headers_t;
53e18a033bSKonstantin Ananyev
54e18a033bSKonstantin Ananyev
55e18a033bSKonstantin Ananyevtypedef struct {
56e18a033bSKonstantin Ananyev    ngx_http_upstream_conf_t       upstream;
57e18a033bSKonstantin Ananyev
58e18a033bSKonstantin Ananyev    ngx_array_t                   *body_flushes;
59e18a033bSKonstantin Ananyev    ngx_array_t                   *body_lengths;
60e18a033bSKonstantin Ananyev    ngx_array_t                   *body_values;
61e18a033bSKonstantin Ananyev    ngx_str_t                      body_source;
62e18a033bSKonstantin Ananyev
63e18a033bSKonstantin Ananyev    ngx_http_proxy_headers_t       headers;
64e18a033bSKonstantin Ananyev#if (NGX_HTTP_CACHE)
65e18a033bSKonstantin Ananyev    ngx_http_proxy_headers_t       headers_cache;
66e18a033bSKonstantin Ananyev#endif
67e18a033bSKonstantin Ananyev    ngx_array_t                   *headers_source;
68e18a033bSKonstantin Ananyev
69e18a033bSKonstantin Ananyev    ngx_array_t                   *proxy_lengths;
70e18a033bSKonstantin Ananyev    ngx_array_t                   *proxy_values;
71e18a033bSKonstantin Ananyev
72e18a033bSKonstantin Ananyev    ngx_array_t                   *redirects;
73e18a033bSKonstantin Ananyev    ngx_array_t                   *cookie_domains;
74e18a033bSKonstantin Ananyev    ngx_array_t                   *cookie_paths;
75e18a033bSKonstantin Ananyev
76e18a033bSKonstantin Ananyev    ngx_http_complex_value_t      *method;
77e18a033bSKonstantin Ananyev    ngx_str_t                      location;
78e18a033bSKonstantin Ananyev    ngx_str_t                      url;
79e18a033bSKonstantin Ananyev
80e18a033bSKonstantin Ananyev#if (NGX_HTTP_CACHE)
81e18a033bSKonstantin Ananyev    ngx_http_complex_value_t       cache_key;
82e18a033bSKonstantin Ananyev#endif
83e18a033bSKonstantin Ananyev
84e18a033bSKonstantin Ananyev    ngx_http_proxy_vars_t          vars;
85e18a033bSKonstantin Ananyev
86e18a033bSKonstantin Ananyev    ngx_flag_t                     redirect;
87e18a033bSKonstantin Ananyev
88e18a033bSKonstantin Ananyev    ngx_uint_t                     http_version;
89e18a033bSKonstantin Ananyev
90e18a033bSKonstantin Ananyev    ngx_uint_t                     headers_hash_max_size;
91e18a033bSKonstantin Ananyev    ngx_uint_t                     headers_hash_bucket_size;
92e18a033bSKonstantin Ananyev
93e18a033bSKonstantin Ananyev#if (NGX_HTTP_SSL)
94e18a033bSKonstantin Ananyev    ngx_uint_t                     ssl;
95e18a033bSKonstantin Ananyev    ngx_uint_t                     ssl_protocols;
96e18a033bSKonstantin Ananyev    ngx_str_t                      ssl_ciphers;
97e18a033bSKonstantin Ananyev    ngx_uint_t                     ssl_verify_depth;
98e18a033bSKonstantin Ananyev    ngx_str_t                      ssl_trusted_certificate;
99e18a033bSKonstantin Ananyev    ngx_str_t                      ssl_crl;
100e18a033bSKonstantin Ananyev    ngx_str_t                      ssl_certificate;
101e18a033bSKonstantin Ananyev    ngx_str_t                      ssl_certificate_key;
102e18a033bSKonstantin Ananyev    ngx_array_t                   *ssl_passwords;
103e18a033bSKonstantin Ananyev#endif
104e18a033bSKonstantin Ananyev} ngx_http_proxy_loc_conf_t;
105e18a033bSKonstantin Ananyev
106e18a033bSKonstantin Ananyev
107e18a033bSKonstantin Ananyevtypedef struct {
108e18a033bSKonstantin Ananyev    ngx_http_status_t              status;
109e18a033bSKonstantin Ananyev    ngx_http_chunked_t             chunked;
110e18a033bSKonstantin Ananyev    ngx_http_proxy_vars_t          vars;
111e18a033bSKonstantin Ananyev    off_t                          internal_body_length;
112e18a033bSKonstantin Ananyev
113e18a033bSKonstantin Ananyev    ngx_chain_t                   *free;
114e18a033bSKonstantin Ananyev    ngx_chain_t                   *busy;
115e18a033bSKonstantin Ananyev
116e18a033bSKonstantin Ananyev    unsigned                       head:1;
117e18a033bSKonstantin Ananyev    unsigned                       internal_chunked:1;
118e18a033bSKonstantin Ananyev    unsigned                       header_sent:1;
119e18a033bSKonstantin Ananyev} ngx_http_proxy_ctx_t;
120e18a033bSKonstantin Ananyev
121e18a033bSKonstantin Ananyev
122e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_eval(ngx_http_request_t *r,
123e18a033bSKonstantin Ananyev    ngx_http_proxy_ctx_t *ctx, ngx_http_proxy_loc_conf_t *plcf);
124e18a033bSKonstantin Ananyev#if (NGX_HTTP_CACHE)
125e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_create_key(ngx_http_request_t *r);
126e18a033bSKonstantin Ananyev#endif
127e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_create_request(ngx_http_request_t *r);
128e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_reinit_request(ngx_http_request_t *r);
129e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_body_output_filter(void *data, ngx_chain_t *in);
130e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_process_status_line(ngx_http_request_t *r);
131e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_process_header(ngx_http_request_t *r);
132e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_input_filter_init(void *data);
133e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_copy_filter(ngx_event_pipe_t *p,
134e18a033bSKonstantin Ananyev    ngx_buf_t *buf);
135e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_chunked_filter(ngx_event_pipe_t *p,
136e18a033bSKonstantin Ananyev    ngx_buf_t *buf);
137e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_non_buffered_copy_filter(void *data,
138e18a033bSKonstantin Ananyev    ssize_t bytes);
139e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_non_buffered_chunked_filter(void *data,
140e18a033bSKonstantin Ananyev    ssize_t bytes);
141e18a033bSKonstantin Ananyevstatic void ngx_http_proxy_abort_request(ngx_http_request_t *r);
142e18a033bSKonstantin Ananyevstatic void ngx_http_proxy_finalize_request(ngx_http_request_t *r,
143e18a033bSKonstantin Ananyev    ngx_int_t rc);
144e18a033bSKonstantin Ananyev
145e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_host_variable(ngx_http_request_t *r,
146e18a033bSKonstantin Ananyev    ngx_http_variable_value_t *v, uintptr_t data);
147e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_port_variable(ngx_http_request_t *r,
148e18a033bSKonstantin Ananyev    ngx_http_variable_value_t *v, uintptr_t data);
149e18a033bSKonstantin Ananyevstatic ngx_int_t
150e18a033bSKonstantin Ananyev    ngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t *r,
151e18a033bSKonstantin Ananyev    ngx_http_variable_value_t *v, uintptr_t data);
152e18a033bSKonstantin Ananyevstatic ngx_int_t
153e18a033bSKonstantin Ananyev    ngx_http_proxy_internal_body_length_variable(ngx_http_request_t *r,
154e18a033bSKonstantin Ananyev    ngx_http_variable_value_t *v, uintptr_t data);
155e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_internal_chunked_variable(ngx_http_request_t *r,
156e18a033bSKonstantin Ananyev    ngx_http_variable_value_t *v, uintptr_t data);
157e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_rewrite_redirect(ngx_http_request_t *r,
158e18a033bSKonstantin Ananyev    ngx_table_elt_t *h, size_t prefix);
159e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_rewrite_cookie(ngx_http_request_t *r,
160e18a033bSKonstantin Ananyev    ngx_table_elt_t *h);
161e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_rewrite_cookie_value(ngx_http_request_t *r,
162e18a033bSKonstantin Ananyev    ngx_table_elt_t *h, u_char *value, ngx_array_t *rewrites);
163e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_rewrite(ngx_http_request_t *r,
164e18a033bSKonstantin Ananyev    ngx_table_elt_t *h, size_t prefix, size_t len, ngx_str_t *replacement);
165e18a033bSKonstantin Ananyev
166e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_add_variables(ngx_conf_t *cf);
167e18a033bSKonstantin Ananyevstatic void *ngx_http_proxy_create_main_conf(ngx_conf_t *cf);
168e18a033bSKonstantin Ananyevstatic void *ngx_http_proxy_create_loc_conf(ngx_conf_t *cf);
169e18a033bSKonstantin Ananyevstatic char *ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf,
170e18a033bSKonstantin Ananyev    void *parent, void *child);
171e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_init_headers(ngx_conf_t *cf,
172e18a033bSKonstantin Ananyev    ngx_http_proxy_loc_conf_t *conf, ngx_http_proxy_headers_t *headers,
173e18a033bSKonstantin Ananyev    ngx_keyval_t *default_headers);
174e18a033bSKonstantin Ananyev
175e18a033bSKonstantin Ananyevstatic char *ngx_http_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd,
176e18a033bSKonstantin Ananyev    void *conf);
177e18a033bSKonstantin Ananyevstatic char *ngx_http_proxy_redirect(ngx_conf_t *cf, ngx_command_t *cmd,
178e18a033bSKonstantin Ananyev    void *conf);
179e18a033bSKonstantin Ananyevstatic char *ngx_http_proxy_cookie_domain(ngx_conf_t *cf, ngx_command_t *cmd,
180e18a033bSKonstantin Ananyev    void *conf);
181e18a033bSKonstantin Ananyevstatic char *ngx_http_proxy_cookie_path(ngx_conf_t *cf, ngx_command_t *cmd,
182e18a033bSKonstantin Ananyev    void *conf);
183e18a033bSKonstantin Ananyevstatic char *ngx_http_proxy_store(ngx_conf_t *cf, ngx_command_t *cmd,
184e18a033bSKonstantin Ananyev    void *conf);
185e18a033bSKonstantin Ananyev#if (NGX_HTTP_CACHE)
186e18a033bSKonstantin Ananyevstatic char *ngx_http_proxy_cache(ngx_conf_t *cf, ngx_command_t *cmd,
187e18a033bSKonstantin Ananyev    void *conf);
188e18a033bSKonstantin Ananyevstatic char *ngx_http_proxy_cache_key(ngx_conf_t *cf, ngx_command_t *cmd,
189e18a033bSKonstantin Ananyev    void *conf);
190e18a033bSKonstantin Ananyev#endif
191e18a033bSKonstantin Ananyev#if (NGX_HTTP_SSL)
192e18a033bSKonstantin Ananyevstatic char *ngx_http_proxy_ssl_password_file(ngx_conf_t *cf,
193e18a033bSKonstantin Ananyev    ngx_command_t *cmd, void *conf);
194e18a033bSKonstantin Ananyev#endif
195e18a033bSKonstantin Ananyev
196e18a033bSKonstantin Ananyevstatic char *ngx_http_proxy_lowat_check(ngx_conf_t *cf, void *post, void *data);
197e18a033bSKonstantin Ananyev
198e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_rewrite_regex(ngx_conf_t *cf,
199e18a033bSKonstantin Ananyev    ngx_http_proxy_rewrite_t *pr, ngx_str_t *regex, ngx_uint_t caseless);
200e18a033bSKonstantin Ananyev
201e18a033bSKonstantin Ananyev#if (NGX_HTTP_SSL)
202e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_proxy_set_ssl(ngx_conf_t *cf,
203e18a033bSKonstantin Ananyev    ngx_http_proxy_loc_conf_t *plcf);
204e18a033bSKonstantin Ananyev#endif
205e18a033bSKonstantin Ananyevstatic void ngx_http_proxy_set_vars(ngx_url_t *u, ngx_http_proxy_vars_t *v);
206e18a033bSKonstantin Ananyev
207e18a033bSKonstantin Ananyev
208e18a033bSKonstantin Ananyevstatic ngx_conf_post_t  ngx_http_proxy_lowat_post =
209e18a033bSKonstantin Ananyev    { ngx_http_proxy_lowat_check };
210e18a033bSKonstantin Ananyev
211e18a033bSKonstantin Ananyev
212e18a033bSKonstantin Ananyevstatic ngx_conf_bitmask_t  ngx_http_proxy_next_upstream_masks[] = {
213e18a033bSKonstantin Ananyev    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },
214e18a033bSKonstantin Ananyev    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },
215e18a033bSKonstantin Ananyev    { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },
216e18a033bSKonstantin Ananyev    { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT },
217e18a033bSKonstantin Ananyev    { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },
218e18a033bSKonstantin Ananyev    { ngx_string("http_502"), NGX_HTTP_UPSTREAM_FT_HTTP_502 },
219e18a033bSKonstantin Ananyev    { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },
220e18a033bSKonstantin Ananyev    { ngx_string("http_504"), NGX_HTTP_UPSTREAM_FT_HTTP_504 },
221e18a033bSKonstantin Ananyev    { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },
222e18a033bSKonstantin Ananyev    { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },
223e18a033bSKonstantin Ananyev    { ngx_string("http_429"), NGX_HTTP_UPSTREAM_FT_HTTP_429 },
224e18a033bSKonstantin Ananyev    { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING },
225e18a033bSKonstantin Ananyev    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },
226e18a033bSKonstantin Ananyev    { ngx_null_string, 0 }
227e18a033bSKonstantin Ananyev};
228e18a033bSKonstantin Ananyev
229e18a033bSKonstantin Ananyev
230e18a033bSKonstantin Ananyev#if (NGX_HTTP_SSL)
231e18a033bSKonstantin Ananyev
232e18a033bSKonstantin Ananyevstatic ngx_conf_bitmask_t  ngx_http_proxy_ssl_protocols[] = {
233e18a033bSKonstantin Ananyev    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },
234e18a033bSKonstantin Ananyev    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },
235e18a033bSKonstantin Ananyev    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },
236e18a033bSKonstantin Ananyev    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },
237e18a033bSKonstantin Ananyev    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },
238e18a033bSKonstantin Ananyev    { ngx_null_string, 0 }
239e18a033bSKonstantin Ananyev};
240e18a033bSKonstantin Ananyev
241e18a033bSKonstantin Ananyev#endif
242e18a033bSKonstantin Ananyev
243e18a033bSKonstantin Ananyev
244e18a033bSKonstantin Ananyevstatic ngx_conf_enum_t  ngx_http_proxy_http_version[] = {
245e18a033bSKonstantin Ananyev    { ngx_string("1.0"), NGX_HTTP_VERSION_10 },
246e18a033bSKonstantin Ananyev    { ngx_string("1.1"), NGX_HTTP_VERSION_11 },
247e18a033bSKonstantin Ananyev    { ngx_null_string, 0 }
248e18a033bSKonstantin Ananyev};
249e18a033bSKonstantin Ananyev
250e18a033bSKonstantin Ananyev
251e18a033bSKonstantin Ananyevngx_module_t  ngx_http_proxy_module;
252e18a033bSKonstantin Ananyev
253e18a033bSKonstantin Ananyev
254e18a033bSKonstantin Ananyevstatic ngx_command_t  ngx_http_proxy_commands[] = {
255e18a033bSKonstantin Ananyev
256e18a033bSKonstantin Ananyev    { ngx_string("proxy_pass"),
257e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,
258e18a033bSKonstantin Ananyev      ngx_http_proxy_pass,
259e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
260e18a033bSKonstantin Ananyev      0,
261e18a033bSKonstantin Ananyev      NULL },
262e18a033bSKonstantin Ananyev
263e18a033bSKonstantin Ananyev    { ngx_string("proxy_redirect"),
264e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
265e18a033bSKonstantin Ananyev      ngx_http_proxy_redirect,
266e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
267e18a033bSKonstantin Ananyev      0,
268e18a033bSKonstantin Ananyev      NULL },
269e18a033bSKonstantin Ananyev
270e18a033bSKonstantin Ananyev    { ngx_string("proxy_cookie_domain"),
271e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
272e18a033bSKonstantin Ananyev      ngx_http_proxy_cookie_domain,
273e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
274e18a033bSKonstantin Ananyev      0,
275e18a033bSKonstantin Ananyev      NULL },
276e18a033bSKonstantin Ananyev
277e18a033bSKonstantin Ananyev    { ngx_string("proxy_cookie_path"),
278e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
279e18a033bSKonstantin Ananyev      ngx_http_proxy_cookie_path,
280e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
281e18a033bSKonstantin Ananyev      0,
282e18a033bSKonstantin Ananyev      NULL },
283e18a033bSKonstantin Ananyev
284e18a033bSKonstantin Ananyev    { ngx_string("proxy_store"),
285e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
286e18a033bSKonstantin Ananyev      ngx_http_proxy_store,
287e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
288e18a033bSKonstantin Ananyev      0,
289e18a033bSKonstantin Ananyev      NULL },
290e18a033bSKonstantin Ananyev
291e18a033bSKonstantin Ananyev    { ngx_string("proxy_store_access"),
292e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,
293e18a033bSKonstantin Ananyev      ngx_conf_set_access_slot,
294e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
295e18a033bSKonstantin Ananyev      offsetof(ngx_http_proxy_loc_conf_t, upstream.store_access),
296e18a033bSKonstantin Ananyev      NULL },
297e18a033bSKonstantin Ananyev
298e18a033bSKonstantin Ananyev    { ngx_string("proxy_buffering"),
299e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
300e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
301e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
302e18a033bSKonstantin Ananyev      offsetof(ngx_http_proxy_loc_conf_t, upstream.buffering),
303e18a033bSKonstantin Ananyev      NULL },
304e18a033bSKonstantin Ananyev
305e18a033bSKonstantin Ananyev    { ngx_string("proxy_request_buffering"),
306e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
307e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
308e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
309e18a033bSKonstantin Ananyev      offsetof(ngx_http_proxy_loc_conf_t, upstream.request_buffering),
310e18a033bSKonstantin Ananyev      NULL },
311e18a033bSKonstantin Ananyev
312e18a033bSKonstantin Ananyev    { ngx_string("proxy_ignore_client_abort"),
313e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
314e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
315e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
316e18a033bSKonstantin Ananyev      offsetof(ngx_http_proxy_loc_conf_t, upstream.ignore_client_abort),
317e18a033bSKonstantin Ananyev      NULL },
318e18a033bSKonstantin Ananyev
319e18a033bSKonstantin Ananyev    { ngx_string("proxy_bind"),
320e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
321e18a033bSKonstantin Ananyev      ngx_http_upstream_bind_set_slot,
322e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
323e18a033bSKonstantin Ananyev      offsetof(ngx_http_proxy_loc_conf_t, upstream.local),
324e18a033bSKonstantin Ananyev      NULL },
325e18a033bSKonstantin Ananyev
326e18a033bSKonstantin Ananyev    { ngx_string("proxy_connect_timeout"),
327e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
328e18a033bSKonstantin Ananyev      ngx_conf_set_msec_slot,
329e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
330e18a033bSKonstantin Ananyev      offsetof(ngx_http_proxy_loc_conf_t, upstream.connect_timeout),
331e18a033bSKonstantin Ananyev      NULL },
332e18a033bSKonstantin Ananyev
333e18a033bSKonstantin Ananyev    { ngx_string("proxy_send_timeout"),
334e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
335e18a033bSKonstantin Ananyev      ngx_conf_set_msec_slot,
336e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
337e18a033bSKonstantin Ananyev      offsetof(ngx_http_proxy_loc_conf_t, upstream.send_timeout),
338e18a033bSKonstantin Ananyev      NULL },
339e18a033bSKonstantin Ananyev
340e18a033bSKonstantin Ananyev    { ngx_string("proxy_send_lowat"),
341e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
342e18a033bSKonstantin Ananyev      ngx_conf_set_size_slot,
343e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
344e18a033bSKonstantin Ananyev      offsetof(ngx_http_proxy_loc_conf_t, upstream.send_lowat),
345e18a033bSKonstantin Ananyev      &ngx_http_proxy_lowat_post },
346e18a033bSKonstantin Ananyev
347e18a033bSKonstantin Ananyev    { ngx_string("proxy_intercept_errors"),
348e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
349e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
350e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
351e18a033bSKonstantin Ananyev      offsetof(ngx_http_proxy_loc_conf_t, upstream.intercept_errors),
352e18a033bSKonstantin Ananyev      NULL },
353e18a033bSKonstantin Ananyev
354e18a033bSKonstantin Ananyev    { ngx_string("proxy_set_header"),
355e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
356e18a033bSKonstantin Ananyev      ngx_conf_set_keyval_slot,
357e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
358e18a033bSKonstantin Ananyev      offsetof(ngx_http_proxy_loc_conf_t, headers_source),
359e18a033bSKonstantin Ananyev      NULL },
360e18a033bSKonstantin Ananyev
361e18a033bSKonstantin Ananyev    { ngx_string("proxy_headers_hash_max_size"),
362e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
363e18a033bSKonstantin Ananyev      ngx_conf_set_num_slot,
364e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
365e18a033bSKonstantin Ananyev      offsetof(ngx_http_proxy_loc_conf_t, headers_hash_max_size),
366e18a033bSKonstantin Ananyev      NULL },
367e18a033bSKonstantin Ananyev
368e18a033bSKonstantin Ananyev    { ngx_string("proxy_headers_hash_bucket_size"),
369e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
370e18a033bSKonstantin Ananyev      ngx_conf_set_num_slot,
371e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
372e18a033bSKonstantin Ananyev      offsetof(ngx_http_proxy_loc_conf_t, headers_hash_bucket_size),
373e18a033bSKonstantin Ananyev      NULL },
374e18a033bSKonstantin Ananyev
375e18a033bSKonstantin Ananyev    { ngx_string("proxy_set_body"),
376e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
377e18a033bSKonstantin Ananyev      ngx_conf_set_str_slot,
378e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
379e18a033bSKonstantin Ananyev      offsetof(ngx_http_proxy_loc_conf_t, body_source),
380e18a033bSKonstantin Ananyev      NULL },
381e18a033bSKonstantin Ananyev
382e18a033bSKonstantin Ananyev    { ngx_string("proxy_method"),
383e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
384e18a033bSKonstantin Ananyev      ngx_http_set_complex_value_slot,
385e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
386e18a033bSKonstantin Ananyev      offsetof(ngx_http_proxy_loc_conf_t, method),
387e18a033bSKonstantin Ananyev      NULL },
388e18a033bSKonstantin Ananyev
389e18a033bSKonstantin Ananyev    { ngx_string("proxy_pass_request_headers"),
390e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
391e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
392e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
393e18a033bSKonstantin Ananyev      offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_request_headers),
394e18a033bSKonstantin Ananyev      NULL },
395e18a033bSKonstantin Ananyev
396e18a033bSKonstantin Ananyev    { ngx_string("proxy_pass_request_body"),
397e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
398e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
399e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
400e18a033bSKonstantin Ananyev      offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_request_body),
401e18a033bSKonstantin Ananyev      NULL },
402e18a033bSKonstantin Ananyev
403e18a033bSKonstantin Ananyev    { ngx_string("proxy_buffer_size"),
404e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
405e18a033bSKonstantin Ananyev      ngx_conf_set_size_slot,
406e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
407e18a033bSKonstantin Ananyev      offsetof(ngx_http_proxy_loc_conf_t, upstream.buffer_size),
408e18a033bSKonstantin Ananyev      NULL },
409e18a033bSKonstantin Ananyev
410e18a033bSKonstantin Ananyev    { ngx_string("proxy_read_timeout"),
411