1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Unbit S.a.s. 2009-2010
4e18a033bSKonstantin Ananyev * Copyright (C) 2008 Manlio Perillo (manlio.perillo@gmail.com)
5e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
6e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
7e18a033bSKonstantin Ananyev */
8e18a033bSKonstantin Ananyev
9e18a033bSKonstantin Ananyev
10e18a033bSKonstantin Ananyev#include <ngx_config.h>
11e18a033bSKonstantin Ananyev#include <ngx_core.h>
12e18a033bSKonstantin Ananyev#include <ngx_http.h>
13e18a033bSKonstantin Ananyev
14e18a033bSKonstantin Ananyev
15e18a033bSKonstantin Ananyevtypedef struct {
16e18a033bSKonstantin Ananyev    ngx_array_t                caches;  /* ngx_http_file_cache_t * */
17e18a033bSKonstantin Ananyev} ngx_http_uwsgi_main_conf_t;
18e18a033bSKonstantin Ananyev
19e18a033bSKonstantin Ananyev
20e18a033bSKonstantin Ananyevtypedef struct {
21e18a033bSKonstantin Ananyev    ngx_array_t               *flushes;
22e18a033bSKonstantin Ananyev    ngx_array_t               *lengths;
23e18a033bSKonstantin Ananyev    ngx_array_t               *values;
24e18a033bSKonstantin Ananyev    ngx_uint_t                 number;
25e18a033bSKonstantin Ananyev    ngx_hash_t                 hash;
26e18a033bSKonstantin Ananyev} ngx_http_uwsgi_params_t;
27e18a033bSKonstantin Ananyev
28e18a033bSKonstantin Ananyev
29e18a033bSKonstantin Ananyevtypedef struct {
30e18a033bSKonstantin Ananyev    ngx_http_upstream_conf_t   upstream;
31e18a033bSKonstantin Ananyev
32e18a033bSKonstantin Ananyev    ngx_http_uwsgi_params_t    params;
33e18a033bSKonstantin Ananyev#if (NGX_HTTP_CACHE)
34e18a033bSKonstantin Ananyev    ngx_http_uwsgi_params_t    params_cache;
35e18a033bSKonstantin Ananyev#endif
36e18a033bSKonstantin Ananyev    ngx_array_t               *params_source;
37e18a033bSKonstantin Ananyev
38e18a033bSKonstantin Ananyev    ngx_array_t               *uwsgi_lengths;
39e18a033bSKonstantin Ananyev    ngx_array_t               *uwsgi_values;
40e18a033bSKonstantin Ananyev
41e18a033bSKonstantin Ananyev#if (NGX_HTTP_CACHE)
42e18a033bSKonstantin Ananyev    ngx_http_complex_value_t   cache_key;
43e18a033bSKonstantin Ananyev#endif
44e18a033bSKonstantin Ananyev
45e18a033bSKonstantin Ananyev    ngx_str_t                  uwsgi_string;
46e18a033bSKonstantin Ananyev
47e18a033bSKonstantin Ananyev    ngx_uint_t                 modifier1;
48e18a033bSKonstantin Ananyev    ngx_uint_t                 modifier2;
49e18a033bSKonstantin Ananyev
50e18a033bSKonstantin Ananyev#if (NGX_HTTP_SSL)
51e18a033bSKonstantin Ananyev    ngx_uint_t                 ssl;
52e18a033bSKonstantin Ananyev    ngx_uint_t                 ssl_protocols;
53e18a033bSKonstantin Ananyev    ngx_str_t                  ssl_ciphers;
54e18a033bSKonstantin Ananyev    ngx_uint_t                 ssl_verify_depth;
55e18a033bSKonstantin Ananyev    ngx_str_t                  ssl_trusted_certificate;
56e18a033bSKonstantin Ananyev    ngx_str_t                  ssl_crl;
57e18a033bSKonstantin Ananyev    ngx_str_t                  ssl_certificate;
58e18a033bSKonstantin Ananyev    ngx_str_t                  ssl_certificate_key;
59e18a033bSKonstantin Ananyev    ngx_array_t               *ssl_passwords;
60e18a033bSKonstantin Ananyev#endif
61e18a033bSKonstantin Ananyev} ngx_http_uwsgi_loc_conf_t;
62e18a033bSKonstantin Ananyev
63e18a033bSKonstantin Ananyev
64e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_uwsgi_eval(ngx_http_request_t *r,
65e18a033bSKonstantin Ananyev    ngx_http_uwsgi_loc_conf_t *uwcf);
66e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_uwsgi_create_request(ngx_http_request_t *r);
67e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_uwsgi_reinit_request(ngx_http_request_t *r);
68e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_uwsgi_process_status_line(ngx_http_request_t *r);
69e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_uwsgi_process_header(ngx_http_request_t *r);
70e18a033bSKonstantin Ananyevstatic void ngx_http_uwsgi_abort_request(ngx_http_request_t *r);
71e18a033bSKonstantin Ananyevstatic void ngx_http_uwsgi_finalize_request(ngx_http_request_t *r,
72e18a033bSKonstantin Ananyev    ngx_int_t rc);
73e18a033bSKonstantin Ananyev
74e18a033bSKonstantin Ananyevstatic void *ngx_http_uwsgi_create_main_conf(ngx_conf_t *cf);
75e18a033bSKonstantin Ananyevstatic void *ngx_http_uwsgi_create_loc_conf(ngx_conf_t *cf);
76e18a033bSKonstantin Ananyevstatic char *ngx_http_uwsgi_merge_loc_conf(ngx_conf_t *cf, void *parent,
77e18a033bSKonstantin Ananyev    void *child);
78e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_uwsgi_init_params(ngx_conf_t *cf,
79e18a033bSKonstantin Ananyev    ngx_http_uwsgi_loc_conf_t *conf, ngx_http_uwsgi_params_t *params,
80e18a033bSKonstantin Ananyev    ngx_keyval_t *default_params);
81e18a033bSKonstantin Ananyev
82e18a033bSKonstantin Ananyevstatic char *ngx_http_uwsgi_pass(ngx_conf_t *cf, ngx_command_t *cmd,
83e18a033bSKonstantin Ananyev    void *conf);
84e18a033bSKonstantin Ananyevstatic char *ngx_http_uwsgi_store(ngx_conf_t *cf, ngx_command_t *cmd,
85e18a033bSKonstantin Ananyev    void *conf);
86e18a033bSKonstantin Ananyev
87e18a033bSKonstantin Ananyev#if (NGX_HTTP_CACHE)
88e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_uwsgi_create_key(ngx_http_request_t *r);
89e18a033bSKonstantin Ananyevstatic char *ngx_http_uwsgi_cache(ngx_conf_t *cf, ngx_command_t *cmd,
90e18a033bSKonstantin Ananyev    void *conf);
91e18a033bSKonstantin Ananyevstatic char *ngx_http_uwsgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd,
92e18a033bSKonstantin Ananyev    void *conf);
93e18a033bSKonstantin Ananyev#endif
94e18a033bSKonstantin Ananyev
95e18a033bSKonstantin Ananyev#if (NGX_HTTP_SSL)
96e18a033bSKonstantin Ananyevstatic char *ngx_http_uwsgi_ssl_password_file(ngx_conf_t *cf,
97e18a033bSKonstantin Ananyev    ngx_command_t *cmd, void *conf);
98e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_uwsgi_set_ssl(ngx_conf_t *cf,
99e18a033bSKonstantin Ananyev    ngx_http_uwsgi_loc_conf_t *uwcf);
100e18a033bSKonstantin Ananyev#endif
101e18a033bSKonstantin Ananyev
102e18a033bSKonstantin Ananyev
103e18a033bSKonstantin Ananyevstatic ngx_conf_num_bounds_t  ngx_http_uwsgi_modifier_bounds = {
104e18a033bSKonstantin Ananyev    ngx_conf_check_num_bounds, 0, 255
105e18a033bSKonstantin Ananyev};
106e18a033bSKonstantin Ananyev
107e18a033bSKonstantin Ananyev
108e18a033bSKonstantin Ananyevstatic ngx_conf_bitmask_t ngx_http_uwsgi_next_upstream_masks[] = {
109e18a033bSKonstantin Ananyev    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },
110e18a033bSKonstantin Ananyev    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },
111e18a033bSKonstantin Ananyev    { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },
112e18a033bSKonstantin Ananyev    { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT },
113e18a033bSKonstantin Ananyev    { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },
114e18a033bSKonstantin Ananyev    { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },
115e18a033bSKonstantin Ananyev    { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },
116e18a033bSKonstantin Ananyev    { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },
117e18a033bSKonstantin Ananyev    { ngx_string("http_429"), NGX_HTTP_UPSTREAM_FT_HTTP_429 },
118e18a033bSKonstantin Ananyev    { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING },
119e18a033bSKonstantin Ananyev    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },
120e18a033bSKonstantin Ananyev    { ngx_null_string, 0 }
121e18a033bSKonstantin Ananyev};
122e18a033bSKonstantin Ananyev
123e18a033bSKonstantin Ananyev
124e18a033bSKonstantin Ananyev#if (NGX_HTTP_SSL)
125e18a033bSKonstantin Ananyev
126e18a033bSKonstantin Ananyevstatic ngx_conf_bitmask_t  ngx_http_uwsgi_ssl_protocols[] = {
127e18a033bSKonstantin Ananyev    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },
128e18a033bSKonstantin Ananyev    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },
129e18a033bSKonstantin Ananyev    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },
130e18a033bSKonstantin Ananyev    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },
131e18a033bSKonstantin Ananyev    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },
132e18a033bSKonstantin Ananyev    { ngx_null_string, 0 }
133e18a033bSKonstantin Ananyev};
134e18a033bSKonstantin Ananyev
135e18a033bSKonstantin Ananyev#endif
136e18a033bSKonstantin Ananyev
137e18a033bSKonstantin Ananyev
138e18a033bSKonstantin Ananyevngx_module_t  ngx_http_uwsgi_module;
139e18a033bSKonstantin Ananyev
140e18a033bSKonstantin Ananyev
141e18a033bSKonstantin Ananyevstatic ngx_command_t ngx_http_uwsgi_commands[] = {
142e18a033bSKonstantin Ananyev
143e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_pass"),
144e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
145e18a033bSKonstantin Ananyev      ngx_http_uwsgi_pass,
146e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
147e18a033bSKonstantin Ananyev      0,
148e18a033bSKonstantin Ananyev      NULL },
149e18a033bSKonstantin Ananyev
150e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_modifier1"),
151e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
152e18a033bSKonstantin Ananyev      ngx_conf_set_num_slot,
153e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
154e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, modifier1),
155e18a033bSKonstantin Ananyev      &ngx_http_uwsgi_modifier_bounds },
156e18a033bSKonstantin Ananyev
157e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_modifier2"),
158e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
159e18a033bSKonstantin Ananyev      ngx_conf_set_num_slot,
160e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
161e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, modifier2),
162e18a033bSKonstantin Ananyev      &ngx_http_uwsgi_modifier_bounds },
163e18a033bSKonstantin Ananyev
164e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_store"),
165e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
166e18a033bSKonstantin Ananyev      ngx_http_uwsgi_store,
167e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
168e18a033bSKonstantin Ananyev      0,
169e18a033bSKonstantin Ananyev      NULL },
170e18a033bSKonstantin Ananyev
171e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_store_access"),
172e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,
173e18a033bSKonstantin Ananyev      ngx_conf_set_access_slot,
174e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
175e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.store_access),
176e18a033bSKonstantin Ananyev      NULL },
177e18a033bSKonstantin Ananyev
178e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_buffering"),
179e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
180e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
181e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
182e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.buffering),
183e18a033bSKonstantin Ananyev      NULL },
184e18a033bSKonstantin Ananyev
185e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_request_buffering"),
186e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
187e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
188e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
189e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.request_buffering),
190e18a033bSKonstantin Ananyev      NULL },
191e18a033bSKonstantin Ananyev
192e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_ignore_client_abort"),
193e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
194e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
195e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
196e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.ignore_client_abort),
197e18a033bSKonstantin Ananyev      NULL },
198e18a033bSKonstantin Ananyev
199e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_bind"),
200e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
201e18a033bSKonstantin Ananyev      ngx_http_upstream_bind_set_slot,
202e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
203e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.local),
204e18a033bSKonstantin Ananyev      NULL },
205e18a033bSKonstantin Ananyev
206e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_connect_timeout"),
207e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
208e18a033bSKonstantin Ananyev      ngx_conf_set_msec_slot,
209e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
210e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.connect_timeout),
211e18a033bSKonstantin Ananyev      NULL },
212e18a033bSKonstantin Ananyev
213e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_send_timeout"),
214e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
215e18a033bSKonstantin Ananyev      ngx_conf_set_msec_slot,
216e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
217e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.send_timeout),
218e18a033bSKonstantin Ananyev      NULL },
219e18a033bSKonstantin Ananyev
220e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_buffer_size"),
221e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
222e18a033bSKonstantin Ananyev      ngx_conf_set_size_slot,
223e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
224e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.buffer_size),
225e18a033bSKonstantin Ananyev      NULL },
226e18a033bSKonstantin Ananyev
227e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_pass_request_headers"),
228e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
229e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
230e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
231e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.pass_request_headers),
232e18a033bSKonstantin Ananyev      NULL },
233e18a033bSKonstantin Ananyev
234e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_pass_request_body"),
235e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
236e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
237e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
238e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.pass_request_body),
239e18a033bSKonstantin Ananyev      NULL },
240e18a033bSKonstantin Ananyev
241e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_intercept_errors"),
242e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
243e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
244e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
245e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.intercept_errors),
246e18a033bSKonstantin Ananyev      NULL },
247e18a033bSKonstantin Ananyev
248e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_read_timeout"),
249e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
250e18a033bSKonstantin Ananyev      ngx_conf_set_msec_slot,
251e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
252e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.read_timeout),
253e18a033bSKonstantin Ananyev      NULL },
254e18a033bSKonstantin Ananyev
255e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_buffers"),
256e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
257e18a033bSKonstantin Ananyev      ngx_conf_set_bufs_slot,
258e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
259e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.bufs),
260e18a033bSKonstantin Ananyev      NULL },
261e18a033bSKonstantin Ananyev
262e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_busy_buffers_size"),
263e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
264e18a033bSKonstantin Ananyev      ngx_conf_set_size_slot,
265e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
266e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.busy_buffers_size_conf),
267e18a033bSKonstantin Ananyev      NULL },
268e18a033bSKonstantin Ananyev
269e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_force_ranges"),
270e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
271e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
272e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
273e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.force_ranges),
274e18a033bSKonstantin Ananyev      NULL },
275e18a033bSKonstantin Ananyev
276e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_limit_rate"),
277e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
278e18a033bSKonstantin Ananyev      ngx_conf_set_size_slot,
279e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
280e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.limit_rate),
281e18a033bSKonstantin Ananyev      NULL },
282e18a033bSKonstantin Ananyev
283e18a033bSKonstantin Ananyev#if (NGX_HTTP_CACHE)
284e18a033bSKonstantin Ananyev
285e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_cache"),
286e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
287e18a033bSKonstantin Ananyev      ngx_http_uwsgi_cache,
288e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
289e18a033bSKonstantin Ananyev      0,
290e18a033bSKonstantin Ananyev      NULL },
291e18a033bSKonstantin Ananyev
292e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_cache_key"),
293e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
294e18a033bSKonstantin Ananyev      ngx_http_uwsgi_cache_key,
295e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
296e18a033bSKonstantin Ananyev      0,
297e18a033bSKonstantin Ananyev      NULL },
298e18a033bSKonstantin Ananyev
299e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_cache_path"),
300e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,
301e18a033bSKonstantin Ananyev      ngx_http_file_cache_set_slot,
302e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF_OFFSET,
303e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_main_conf_t, caches),
304e18a033bSKonstantin Ananyev      &ngx_http_uwsgi_module },
305e18a033bSKonstantin Ananyev
306e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_cache_bypass"),
307e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
308e18a033bSKonstantin Ananyev      ngx_http_set_predicate_slot,
309e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
310e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_bypass),
311e18a033bSKonstantin Ananyev      NULL },
312e18a033bSKonstantin Ananyev
313e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_no_cache"),
314e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
315e18a033bSKonstantin Ananyev      ngx_http_set_predicate_slot,
316e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
317e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.no_cache),
318e18a033bSKonstantin Ananyev      NULL },
319e18a033bSKonstantin Ananyev
320e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_cache_valid"),
321e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
322e18a033bSKonstantin Ananyev      ngx_http_file_cache_valid_set_slot,
323e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
324e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_valid),
325e18a033bSKonstantin Ananyev      NULL },
326e18a033bSKonstantin Ananyev
327e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_cache_min_uses"),
328e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
329e18a033bSKonstantin Ananyev      ngx_conf_set_num_slot,
330e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
331e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_min_uses),
332e18a033bSKonstantin Ananyev      NULL },
333e18a033bSKonstantin Ananyev
334e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_cache_max_range_offset"),
335e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
336e18a033bSKonstantin Ananyev      ngx_conf_set_off_slot,
337e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
338e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_max_range_offset),
339e18a033bSKonstantin Ananyev      NULL },
340e18a033bSKonstantin Ananyev
341e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_cache_use_stale"),
342e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
343e18a033bSKonstantin Ananyev      ngx_conf_set_bitmask_slot,
344e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
345e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_use_stale),
346e18a033bSKonstantin Ananyev      &ngx_http_uwsgi_next_upstream_masks },
347e18a033bSKonstantin Ananyev
348e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_cache_methods"),
349e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
350e18a033bSKonstantin Ananyev      ngx_conf_set_bitmask_slot,
351e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
352e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_methods),
353e18a033bSKonstantin Ananyev      &ngx_http_upstream_cache_method_mask },
354e18a033bSKonstantin Ananyev
355e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_cache_lock"),
356e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
357e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
358e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
359e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_lock),
360e18a033bSKonstantin Ananyev      NULL },
361e18a033bSKonstantin Ananyev
362e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_cache_lock_timeout"),
363e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
364e18a033bSKonstantin Ananyev      ngx_conf_set_msec_slot,
365e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
366e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_lock_timeout),
367e18a033bSKonstantin Ananyev      NULL },
368e18a033bSKonstantin Ananyev
369e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_cache_lock_age"),
370e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
371e18a033bSKonstantin Ananyev      ngx_conf_set_msec_slot,
372e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
373e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_lock_age),
374e18a033bSKonstantin Ananyev      NULL },
375e18a033bSKonstantin Ananyev
376e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_cache_revalidate"),
377e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
378e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
379e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
380e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_revalidate),
381e18a033bSKonstantin Ananyev      NULL },
382e18a033bSKonstantin Ananyev
383e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_cache_background_update"),
384e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
385e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
386e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
387e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_background_update),
388e18a033bSKonstantin Ananyev      NULL },
389e18a033bSKonstantin Ananyev
390e18a033bSKonstantin Ananyev#endif
391e18a033bSKonstantin Ananyev
392e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_temp_path"),
393e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,
394e18a033bSKonstantin Ananyev      ngx_conf_set_path_slot,
395e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
396e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.temp_path),
397e18a033bSKonstantin Ananyev      NULL },
398e18a033bSKonstantin Ananyev
399e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_max_temp_file_size"),
400e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
401e18a033bSKonstantin Ananyev      ngx_conf_set_size_slot,
402e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
403e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.max_temp_file_size_conf),
404e18a033bSKonstantin Ananyev      NULL },
405e18a033bSKonstantin Ananyev
406e18a033bSKonstantin Ananyev    { ngx_string("uwsgi_temp_file_write_size"),
407e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
408e18a033bSKonstantin Ananyev      ngx_conf_set_size_slot,
409e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
410e18a033bSKonstantin Ananyev      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.temp_file_write_size_conf),
411e18a033bSKonstantin Ananyev      NULL },
412e18a033bSKonstantin Ananyev
413