1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
4e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
5e18a033bSKonstantin Ananyev * Copyright (C) Manlio Perillo (manlio.perillo@gmail.com)
6e18a033bSKonstantin Ananyev */
7e18a033bSKonstantin Ananyev
8e18a033bSKonstantin Ananyev
9e18a033bSKonstantin Ananyev#include <ngx_config.h>
10e18a033bSKonstantin Ananyev#include <ngx_core.h>
11e18a033bSKonstantin Ananyev#include <ngx_http.h>
12e18a033bSKonstantin Ananyev
13e18a033bSKonstantin Ananyev
14e18a033bSKonstantin Ananyevtypedef struct {
15e18a033bSKonstantin Ananyev    ngx_array_t                caches;  /* ngx_http_file_cache_t * */
16e18a033bSKonstantin Ananyev} ngx_http_scgi_main_conf_t;
17e18a033bSKonstantin Ananyev
18e18a033bSKonstantin Ananyev
19e18a033bSKonstantin Ananyevtypedef struct {
20e18a033bSKonstantin Ananyev    ngx_array_t               *flushes;
21e18a033bSKonstantin Ananyev    ngx_array_t               *lengths;
22e18a033bSKonstantin Ananyev    ngx_array_t               *values;
23e18a033bSKonstantin Ananyev    ngx_uint_t                 number;
24e18a033bSKonstantin Ananyev    ngx_hash_t                 hash;
25e18a033bSKonstantin Ananyev} ngx_http_scgi_params_t;
26e18a033bSKonstantin Ananyev
27e18a033bSKonstantin Ananyev
28e18a033bSKonstantin Ananyevtypedef struct {
29e18a033bSKonstantin Ananyev    ngx_http_upstream_conf_t   upstream;
30e18a033bSKonstantin Ananyev
31e18a033bSKonstantin Ananyev    ngx_http_scgi_params_t     params;
32e18a033bSKonstantin Ananyev#if (NGX_HTTP_CACHE)
33e18a033bSKonstantin Ananyev    ngx_http_scgi_params_t     params_cache;
34e18a033bSKonstantin Ananyev#endif
35e18a033bSKonstantin Ananyev    ngx_array_t               *params_source;
36e18a033bSKonstantin Ananyev
37e18a033bSKonstantin Ananyev    ngx_array_t               *scgi_lengths;
38e18a033bSKonstantin Ananyev    ngx_array_t               *scgi_values;
39e18a033bSKonstantin Ananyev
40e18a033bSKonstantin Ananyev#if (NGX_HTTP_CACHE)
41e18a033bSKonstantin Ananyev    ngx_http_complex_value_t   cache_key;
42e18a033bSKonstantin Ananyev#endif
43e18a033bSKonstantin Ananyev} ngx_http_scgi_loc_conf_t;
44e18a033bSKonstantin Ananyev
45e18a033bSKonstantin Ananyev
46e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_scgi_eval(ngx_http_request_t *r,
47e18a033bSKonstantin Ananyev    ngx_http_scgi_loc_conf_t *scf);
48e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_scgi_create_request(ngx_http_request_t *r);
49e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_scgi_reinit_request(ngx_http_request_t *r);
50e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_scgi_process_status_line(ngx_http_request_t *r);
51e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_scgi_process_header(ngx_http_request_t *r);
52e18a033bSKonstantin Ananyevstatic void ngx_http_scgi_abort_request(ngx_http_request_t *r);
53e18a033bSKonstantin Ananyevstatic void ngx_http_scgi_finalize_request(ngx_http_request_t *r, ngx_int_t rc);
54e18a033bSKonstantin Ananyev
55e18a033bSKonstantin Ananyevstatic void *ngx_http_scgi_create_main_conf(ngx_conf_t *cf);
56e18a033bSKonstantin Ananyevstatic void *ngx_http_scgi_create_loc_conf(ngx_conf_t *cf);
57e18a033bSKonstantin Ananyevstatic char *ngx_http_scgi_merge_loc_conf(ngx_conf_t *cf, void *parent,
58e18a033bSKonstantin Ananyev    void *child);
59e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_scgi_init_params(ngx_conf_t *cf,
60e18a033bSKonstantin Ananyev    ngx_http_scgi_loc_conf_t *conf, ngx_http_scgi_params_t *params,
61e18a033bSKonstantin Ananyev    ngx_keyval_t *default_params);
62e18a033bSKonstantin Ananyev
63e18a033bSKonstantin Ananyevstatic char *ngx_http_scgi_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
64e18a033bSKonstantin Ananyevstatic char *ngx_http_scgi_store(ngx_conf_t *cf, ngx_command_t *cmd,
65e18a033bSKonstantin Ananyev    void *conf);
66e18a033bSKonstantin Ananyev
67e18a033bSKonstantin Ananyev#if (NGX_HTTP_CACHE)
68e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_scgi_create_key(ngx_http_request_t *r);
69e18a033bSKonstantin Ananyevstatic char *ngx_http_scgi_cache(ngx_conf_t *cf, ngx_command_t *cmd,
70e18a033bSKonstantin Ananyev    void *conf);
71e18a033bSKonstantin Ananyevstatic char *ngx_http_scgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd,
72e18a033bSKonstantin Ananyev    void *conf);
73e18a033bSKonstantin Ananyev#endif
74e18a033bSKonstantin Ananyev
75e18a033bSKonstantin Ananyev
76e18a033bSKonstantin Ananyevstatic ngx_conf_bitmask_t ngx_http_scgi_next_upstream_masks[] = {
77e18a033bSKonstantin Ananyev    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },
78e18a033bSKonstantin Ananyev    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },
79e18a033bSKonstantin Ananyev    { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },
80e18a033bSKonstantin Ananyev    { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT },
81e18a033bSKonstantin Ananyev    { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },
82e18a033bSKonstantin Ananyev    { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },
83e18a033bSKonstantin Ananyev    { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },
84e18a033bSKonstantin Ananyev    { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },
85e18a033bSKonstantin Ananyev    { ngx_string("http_429"), NGX_HTTP_UPSTREAM_FT_HTTP_429 },
86e18a033bSKonstantin Ananyev    { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING },
87e18a033bSKonstantin Ananyev    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },
88e18a033bSKonstantin Ananyev    { ngx_null_string, 0 }
89e18a033bSKonstantin Ananyev};
90e18a033bSKonstantin Ananyev
91e18a033bSKonstantin Ananyev
92e18a033bSKonstantin Ananyevngx_module_t  ngx_http_scgi_module;
93e18a033bSKonstantin Ananyev
94e18a033bSKonstantin Ananyev
95e18a033bSKonstantin Ananyevstatic ngx_command_t ngx_http_scgi_commands[] = {
96e18a033bSKonstantin Ananyev
97e18a033bSKonstantin Ananyev    { ngx_string("scgi_pass"),
98e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
99e18a033bSKonstantin Ananyev      ngx_http_scgi_pass,
100e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
101e18a033bSKonstantin Ananyev      0,
102e18a033bSKonstantin Ananyev      NULL },
103e18a033bSKonstantin Ananyev
104e18a033bSKonstantin Ananyev    { ngx_string("scgi_store"),
105e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
106e18a033bSKonstantin Ananyev      ngx_http_scgi_store,
107e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
108e18a033bSKonstantin Ananyev      0,
109e18a033bSKonstantin Ananyev      NULL },
110e18a033bSKonstantin Ananyev
111e18a033bSKonstantin Ananyev    { ngx_string("scgi_store_access"),
112e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,
113e18a033bSKonstantin Ananyev      ngx_conf_set_access_slot,
114e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
115e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.store_access),
116e18a033bSKonstantin Ananyev      NULL },
117e18a033bSKonstantin Ananyev
118e18a033bSKonstantin Ananyev    { ngx_string("scgi_buffering"),
119e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
120e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
121e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
122e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.buffering),
123e18a033bSKonstantin Ananyev      NULL },
124e18a033bSKonstantin Ananyev
125e18a033bSKonstantin Ananyev    { ngx_string("scgi_request_buffering"),
126e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
127e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
128e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
129e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.request_buffering),
130e18a033bSKonstantin Ananyev      NULL },
131e18a033bSKonstantin Ananyev
132e18a033bSKonstantin Ananyev    { ngx_string("scgi_ignore_client_abort"),
133e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
134e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
135e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
136e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.ignore_client_abort),
137e18a033bSKonstantin Ananyev      NULL },
138e18a033bSKonstantin Ananyev
139e18a033bSKonstantin Ananyev    { ngx_string("scgi_bind"),
140e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
141e18a033bSKonstantin Ananyev      ngx_http_upstream_bind_set_slot,
142e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
143e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.local),
144e18a033bSKonstantin Ananyev      NULL },
145e18a033bSKonstantin Ananyev
146e18a033bSKonstantin Ananyev    { ngx_string("scgi_connect_timeout"),
147e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
148e18a033bSKonstantin Ananyev      ngx_conf_set_msec_slot,
149e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
150e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.connect_timeout),
151e18a033bSKonstantin Ananyev      NULL },
152e18a033bSKonstantin Ananyev
153e18a033bSKonstantin Ananyev    { ngx_string("scgi_send_timeout"),
154e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
155e18a033bSKonstantin Ananyev      ngx_conf_set_msec_slot,
156e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
157e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.send_timeout),
158e18a033bSKonstantin Ananyev      NULL },
159e18a033bSKonstantin Ananyev
160e18a033bSKonstantin Ananyev    { ngx_string("scgi_buffer_size"),
161e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
162e18a033bSKonstantin Ananyev      ngx_conf_set_size_slot,
163e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
164e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.buffer_size),
165e18a033bSKonstantin Ananyev      NULL },
166e18a033bSKonstantin Ananyev
167e18a033bSKonstantin Ananyev    { ngx_string("scgi_pass_request_headers"),
168e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
169e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
170e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
171e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.pass_request_headers),
172e18a033bSKonstantin Ananyev      NULL },
173e18a033bSKonstantin Ananyev
174e18a033bSKonstantin Ananyev    { ngx_string("scgi_pass_request_body"),
175e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
176e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
177e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
178e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.pass_request_body),
179e18a033bSKonstantin Ananyev      NULL },
180e18a033bSKonstantin Ananyev
181e18a033bSKonstantin Ananyev    { ngx_string("scgi_intercept_errors"),
182e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
183e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
184e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
185e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.intercept_errors),
186e18a033bSKonstantin Ananyev      NULL },
187e18a033bSKonstantin Ananyev
188e18a033bSKonstantin Ananyev    { ngx_string("scgi_read_timeout"),
189e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
190e18a033bSKonstantin Ananyev      ngx_conf_set_msec_slot,
191e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
192e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.read_timeout),
193e18a033bSKonstantin Ananyev      NULL },
194e18a033bSKonstantin Ananyev
195e18a033bSKonstantin Ananyev    { ngx_string("scgi_buffers"),
196e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
197e18a033bSKonstantin Ananyev      ngx_conf_set_bufs_slot,
198e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
199e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.bufs),
200e18a033bSKonstantin Ananyev      NULL },
201e18a033bSKonstantin Ananyev
202e18a033bSKonstantin Ananyev    { ngx_string("scgi_busy_buffers_size"),
203e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
204e18a033bSKonstantin Ananyev      ngx_conf_set_size_slot,
205e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
206e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.busy_buffers_size_conf),
207e18a033bSKonstantin Ananyev      NULL },
208e18a033bSKonstantin Ananyev
209e18a033bSKonstantin Ananyev    { ngx_string("scgi_force_ranges"),
210e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
211e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
212e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
213e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.force_ranges),
214e18a033bSKonstantin Ananyev      NULL },
215e18a033bSKonstantin Ananyev
216e18a033bSKonstantin Ananyev    { ngx_string("scgi_limit_rate"),
217e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
218e18a033bSKonstantin Ananyev      ngx_conf_set_size_slot,
219e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
220e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.limit_rate),
221e18a033bSKonstantin Ananyev      NULL },
222e18a033bSKonstantin Ananyev
223e18a033bSKonstantin Ananyev#if (NGX_HTTP_CACHE)
224e18a033bSKonstantin Ananyev
225e18a033bSKonstantin Ananyev    { ngx_string("scgi_cache"),
226e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
227e18a033bSKonstantin Ananyev      ngx_http_scgi_cache,
228e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
229e18a033bSKonstantin Ananyev      0,
230e18a033bSKonstantin Ananyev      NULL },
231e18a033bSKonstantin Ananyev
232e18a033bSKonstantin Ananyev    { ngx_string("scgi_cache_key"),
233e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
234e18a033bSKonstantin Ananyev      ngx_http_scgi_cache_key,
235e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
236e18a033bSKonstantin Ananyev      0,
237e18a033bSKonstantin Ananyev      NULL },
238e18a033bSKonstantin Ananyev
239e18a033bSKonstantin Ananyev    { ngx_string("scgi_cache_path"),
240e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,
241e18a033bSKonstantin Ananyev      ngx_http_file_cache_set_slot,
242e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF_OFFSET,
243e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_main_conf_t, caches),
244e18a033bSKonstantin Ananyev      &ngx_http_scgi_module },
245e18a033bSKonstantin Ananyev
246e18a033bSKonstantin Ananyev    { ngx_string("scgi_cache_bypass"),
247e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
248e18a033bSKonstantin Ananyev      ngx_http_set_predicate_slot,
249e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
250e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_bypass),
251e18a033bSKonstantin Ananyev      NULL },
252e18a033bSKonstantin Ananyev
253e18a033bSKonstantin Ananyev    { ngx_string("scgi_no_cache"),
254e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
255e18a033bSKonstantin Ananyev      ngx_http_set_predicate_slot,
256e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
257e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.no_cache),
258e18a033bSKonstantin Ananyev      NULL },
259e18a033bSKonstantin Ananyev
260e18a033bSKonstantin Ananyev    { ngx_string("scgi_cache_valid"),
261e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
262e18a033bSKonstantin Ananyev      ngx_http_file_cache_valid_set_slot,
263e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
264e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_valid),
265e18a033bSKonstantin Ananyev      NULL },
266e18a033bSKonstantin Ananyev
267e18a033bSKonstantin Ananyev    { ngx_string("scgi_cache_min_uses"),
268e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
269e18a033bSKonstantin Ananyev      ngx_conf_set_num_slot,
270e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
271e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_min_uses),
272e18a033bSKonstantin Ananyev      NULL },
273e18a033bSKonstantin Ananyev
274e18a033bSKonstantin Ananyev    { ngx_string("scgi_cache_max_range_offset"),
275e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
276e18a033bSKonstantin Ananyev      ngx_conf_set_off_slot,
277e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
278e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_max_range_offset),
279e18a033bSKonstantin Ananyev      NULL },
280e18a033bSKonstantin Ananyev
281e18a033bSKonstantin Ananyev    { ngx_string("scgi_cache_use_stale"),
282e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
283e18a033bSKonstantin Ananyev      ngx_conf_set_bitmask_slot,
284e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
285e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_use_stale),
286e18a033bSKonstantin Ananyev      &ngx_http_scgi_next_upstream_masks },
287e18a033bSKonstantin Ananyev
288e18a033bSKonstantin Ananyev    { ngx_string("scgi_cache_methods"),
289e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
290e18a033bSKonstantin Ananyev      ngx_conf_set_bitmask_slot,
291e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
292e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_methods),
293e18a033bSKonstantin Ananyev      &ngx_http_upstream_cache_method_mask },
294e18a033bSKonstantin Ananyev
295e18a033bSKonstantin Ananyev    { ngx_string("scgi_cache_lock"),
296e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
297e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
298e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
299e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_lock),
300e18a033bSKonstantin Ananyev      NULL },
301e18a033bSKonstantin Ananyev
302e18a033bSKonstantin Ananyev    { ngx_string("scgi_cache_lock_timeout"),
303e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
304e18a033bSKonstantin Ananyev      ngx_conf_set_msec_slot,
305e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
306e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_lock_timeout),
307e18a033bSKonstantin Ananyev      NULL },
308e18a033bSKonstantin Ananyev
309e18a033bSKonstantin Ananyev    { ngx_string("scgi_cache_lock_age"),
310e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
311e18a033bSKonstantin Ananyev      ngx_conf_set_msec_slot,
312e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
313e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_lock_age),
314e18a033bSKonstantin Ananyev      NULL },
315e18a033bSKonstantin Ananyev
316e18a033bSKonstantin Ananyev    { ngx_string("scgi_cache_revalidate"),
317e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
318e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
319e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
320e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_revalidate),
321e18a033bSKonstantin Ananyev      NULL },
322e18a033bSKonstantin Ananyev
323e18a033bSKonstantin Ananyev    { ngx_string("scgi_cache_background_update"),
324e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
325e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
326e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
327e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_background_update),
328e18a033bSKonstantin Ananyev      NULL },
329e18a033bSKonstantin Ananyev
330e18a033bSKonstantin Ananyev#endif
331e18a033bSKonstantin Ananyev
332e18a033bSKonstantin Ananyev    { ngx_string("scgi_temp_path"),
333e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,
334e18a033bSKonstantin Ananyev      ngx_conf_set_path_slot,
335e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
336e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.temp_path),
337e18a033bSKonstantin Ananyev      NULL },
338e18a033bSKonstantin Ananyev
339e18a033bSKonstantin Ananyev    { ngx_string("scgi_max_temp_file_size"),
340e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
341e18a033bSKonstantin Ananyev      ngx_conf_set_size_slot,
342e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
343e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.max_temp_file_size_conf),
344e18a033bSKonstantin Ananyev      NULL },
345e18a033bSKonstantin Ananyev
346e18a033bSKonstantin Ananyev    { ngx_string("scgi_temp_file_write_size"),
347e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
348e18a033bSKonstantin Ananyev      ngx_conf_set_size_slot,
349e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
350e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.temp_file_write_size_conf),
351e18a033bSKonstantin Ananyev      NULL },
352e18a033bSKonstantin Ananyev
353e18a033bSKonstantin Ananyev    { ngx_string("scgi_next_upstream"),
354e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
355e18a033bSKonstantin Ananyev      ngx_conf_set_bitmask_slot,
356e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
357e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.next_upstream),
358e18a033bSKonstantin Ananyev      &ngx_http_scgi_next_upstream_masks },
359e18a033bSKonstantin Ananyev
360e18a033bSKonstantin Ananyev    { ngx_string("scgi_next_upstream_tries"),
361e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
362e18a033bSKonstantin Ananyev      ngx_conf_set_num_slot,
363e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
364e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.next_upstream_tries),
365e18a033bSKonstantin Ananyev      NULL },
366e18a033bSKonstantin Ananyev
367e18a033bSKonstantin Ananyev    { ngx_string("scgi_next_upstream_timeout"),
368e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
369e18a033bSKonstantin Ananyev      ngx_conf_set_msec_slot,
370e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
371e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.next_upstream_timeout),
372e18a033bSKonstantin Ananyev      NULL },
373e18a033bSKonstantin Ananyev
374e18a033bSKonstantin Ananyev    { ngx_string("scgi_param"),
375e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE23,
376e18a033bSKonstantin Ananyev      ngx_http_upstream_param_set_slot,
377e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
378e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, params_source),
379e18a033bSKonstantin Ananyev      NULL },
380e18a033bSKonstantin Ananyev
381e18a033bSKonstantin Ananyev    { ngx_string("scgi_pass_header"),
382e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
383e18a033bSKonstantin Ananyev      ngx_conf_set_str_array_slot,
384e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
385e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.pass_headers),
386e18a033bSKonstantin Ananyev      NULL },
387e18a033bSKonstantin Ananyev
388e18a033bSKonstantin Ananyev    { ngx_string("scgi_hide_header"),
389e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
390e18a033bSKonstantin Ananyev      ngx_conf_set_str_array_slot,
391e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
392e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.hide_headers),
393e18a033bSKonstantin Ananyev      NULL },
394e18a033bSKonstantin Ananyev
395e18a033bSKonstantin Ananyev    { ngx_string("scgi_ignore_headers"),
396e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
397e18a033bSKonstantin Ananyev      ngx_conf_set_bitmask_slot,
398e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
399e18a033bSKonstantin Ananyev      offsetof(ngx_http_scgi_loc_conf_t, upstream.ignore_headers),
400e18a033bSKonstantin Ananyev      &ngx_http_upstream_ignore_headers_masks },
401e18a033bSKonstantin Ananyev
402e18a033bSKonstantin Ananyev      ngx_null_command
403e18a033bSKonstantin Ananyev};
404e18a033bSKonstantin Ananyev
405e18a033bSKonstantin Ananyev
406e18a033bSKonstantin Ananyevstatic ngx_http_module_t ngx_http_scgi_module_ctx = {
407e18a033bSKonstantin Ananyev    NULL,                                  /* preconfiguration */
408e18a033bSKonstantin Ananyev    NULL,                                  /* postconfiguration */
409e18a033bSKonstantin Ananyev
410e18a033bSKonstantin Ananyev    ngx_http_scgi_create_main_conf,        /* create main configuration */
411e18a033bSKonstantin Ananyev    NULL,                                  /* init main configuration */
412e18a033bSKonstantin Ananyev
413