Mercurial > hg > ngx_http_auth_request_module
annotate ngx_http_auth_request_module.c @ 17:662785733552 default tip
Auth request: style.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Wed, 21 Aug 2013 19:39:31 +0400 |
parents | a19a77bf7b70 |
children |
rev | line source |
---|---|
0 | 1 |
2 /* | |
3 * Copyright (C) Maxim Dounin | |
4 */ | |
5 | |
6 | |
7 #include <ngx_config.h> | |
8 #include <ngx_core.h> | |
9 #include <ngx_http.h> | |
10 | |
11 | |
12 typedef struct { | |
13 ngx_str_t uri; | |
7
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
14 ngx_array_t *vars; |
0 | 15 } ngx_http_auth_request_conf_t; |
16 | |
17 | 17 |
0 | 18 typedef struct { |
19 ngx_uint_t done; | |
20 ngx_uint_t status; | |
21 ngx_http_request_t *subrequest; | |
22 } ngx_http_auth_request_ctx_t; | |
23 | |
17 | 24 |
7
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
25 typedef struct { |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
26 ngx_int_t index; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
27 ngx_http_complex_value_t value; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
28 ngx_http_set_variable_pt set_handler; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
29 } ngx_http_auth_request_variable_t; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
30 |
0 | 31 |
32 static ngx_int_t ngx_http_auth_request_handler(ngx_http_request_t *r); | |
33 static ngx_int_t ngx_http_auth_request_done(ngx_http_request_t *r, | |
34 void *data, ngx_int_t rc); | |
7
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
35 static ngx_int_t ngx_http_auth_request_set_variables(ngx_http_request_t *r, |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
36 ngx_http_auth_request_conf_t *arcf, ngx_http_auth_request_ctx_t *ctx); |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
37 static ngx_int_t ngx_http_auth_request_variable(ngx_http_request_t *r, |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
38 ngx_http_variable_value_t *v, uintptr_t data); |
0 | 39 static void *ngx_http_auth_request_create_conf(ngx_conf_t *cf); |
40 static char *ngx_http_auth_request_merge_conf(ngx_conf_t *cf, | |
41 void *parent, void *child); | |
42 static ngx_int_t ngx_http_auth_request_init(ngx_conf_t *cf); | |
1
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
43 static char *ngx_http_auth_request(ngx_conf_t *cf, ngx_command_t *cmd, |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
44 void *conf); |
7
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
45 static char *ngx_http_auth_request_set(ngx_conf_t *cf, ngx_command_t *cmd, |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
46 void *conf); |
0 | 47 |
48 | |
49 static ngx_command_t ngx_http_auth_request_commands[] = { | |
50 | |
51 { ngx_string("auth_request"), | |
52 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
1
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
53 ngx_http_auth_request, |
0 | 54 NGX_HTTP_LOC_CONF_OFFSET, |
1
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
55 0, |
0 | 56 NULL }, |
57 | |
7
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
58 { ngx_string("auth_request_set"), |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
59 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
60 ngx_http_auth_request_set, |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
61 NGX_HTTP_LOC_CONF_OFFSET, |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
62 0, |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
63 NULL }, |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
64 |
0 | 65 ngx_null_command |
66 }; | |
67 | |
68 | |
69 static ngx_http_module_t ngx_http_auth_request_module_ctx = { | |
70 NULL, /* preconfiguration */ | |
71 ngx_http_auth_request_init, /* postconfiguration */ | |
72 | |
73 NULL, /* create main configuration */ | |
74 NULL, /* init main configuration */ | |
75 | |
76 NULL, /* create server configuration */ | |
77 NULL, /* merge server configuration */ | |
78 | |
79 ngx_http_auth_request_create_conf, /* create location configuration */ | |
80 ngx_http_auth_request_merge_conf /* merge location configuration */ | |
81 }; | |
82 | |
83 | |
84 ngx_module_t ngx_http_auth_request_module = { | |
85 NGX_MODULE_V1, | |
86 &ngx_http_auth_request_module_ctx, /* module context */ | |
87 ngx_http_auth_request_commands, /* module directives */ | |
88 NGX_HTTP_MODULE, /* module type */ | |
89 NULL, /* init master */ | |
90 NULL, /* init module */ | |
91 NULL, /* init process */ | |
92 NULL, /* init thread */ | |
93 NULL, /* exit thread */ | |
94 NULL, /* exit process */ | |
95 NULL, /* exit master */ | |
96 NGX_MODULE_V1_PADDING | |
97 }; | |
98 | |
99 | |
100 static ngx_int_t | |
101 ngx_http_auth_request_handler(ngx_http_request_t *r) | |
102 { | |
103 ngx_table_elt_t *h, *ho; | |
104 ngx_http_request_t *sr; | |
105 ngx_http_post_subrequest_t *ps; | |
106 ngx_http_auth_request_ctx_t *ctx; | |
107 ngx_http_auth_request_conf_t *arcf; | |
108 | |
109 arcf = ngx_http_get_module_loc_conf(r, ngx_http_auth_request_module); | |
110 | |
111 if (arcf->uri.len == 0) { | |
112 return NGX_DECLINED; | |
113 } | |
114 | |
115 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
116 "auth request handler"); | |
117 | |
118 ctx = ngx_http_get_module_ctx(r, ngx_http_auth_request_module); | |
119 | |
120 if (ctx != NULL) { | |
121 if (!ctx->done) { | |
122 return NGX_AGAIN; | |
123 } | |
124 | |
7
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
125 /* |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
126 * as soon as we are done - explicitly set variables to make |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
127 * sure they will be available after internal redirects |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
128 */ |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
129 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
130 if (ngx_http_auth_request_set_variables(r, arcf, ctx) != NGX_OK) { |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
131 return NGX_ERROR; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
132 } |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
133 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
134 /* return appropriate status */ |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
135 |
0 | 136 if (ctx->status == NGX_HTTP_FORBIDDEN) { |
137 return ctx->status; | |
138 } | |
139 | |
140 if (ctx->status == NGX_HTTP_UNAUTHORIZED) { | |
141 sr = ctx->subrequest; | |
142 | |
143 h = sr->headers_out.www_authenticate; | |
144 | |
145 if (!h && sr->upstream) { | |
146 h = sr->upstream->headers_in.www_authenticate; | |
147 } | |
148 | |
149 if (h) { | |
150 ho = ngx_list_push(&r->headers_out.headers); | |
151 if (ho == NULL) { | |
152 return NGX_ERROR; | |
153 } | |
154 | |
155 *ho = *h; | |
156 | |
157 r->headers_out.www_authenticate = ho; | |
158 } | |
159 | |
160 return ctx->status; | |
161 } | |
162 | |
163 if (ctx->status >= NGX_HTTP_OK | |
164 && ctx->status < NGX_HTTP_SPECIAL_RESPONSE) | |
165 { | |
166 return NGX_OK; | |
167 } | |
168 | |
169 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
170 "auth request unexpected status: %d", ctx->status); | |
171 | |
172 return NGX_HTTP_INTERNAL_SERVER_ERROR; | |
173 } | |
174 | |
175 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_auth_request_ctx_t)); | |
176 if (ctx == NULL) { | |
177 return NGX_ERROR; | |
178 } | |
179 | |
180 ps = ngx_palloc(r->pool, sizeof(ngx_http_post_subrequest_t)); | |
181 if (ps == NULL) { | |
182 return NGX_ERROR; | |
183 } | |
184 | |
185 ps->handler = ngx_http_auth_request_done; | |
186 ps->data = ctx; | |
187 | |
188 if (ngx_http_subrequest(r, &arcf->uri, NULL, &sr, ps, | |
189 NGX_HTTP_SUBREQUEST_WAITED) | |
190 != NGX_OK) | |
191 { | |
192 return NGX_ERROR; | |
193 } | |
194 | |
10
2b95417a1715
Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
195 /* |
2b95417a1715
Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
196 * allocate fake request body to avoid attempts to read it and to make |
2b95417a1715
Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
197 * sure real body file (if already read) won't be closed by upstream |
2b95417a1715
Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
198 */ |
2b95417a1715
Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
199 |
2b95417a1715
Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
200 sr->request_body = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t)); |
2b95417a1715
Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
201 if (sr->request_body == NULL) { |
2b95417a1715
Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
202 return NGX_ERROR; |
2b95417a1715
Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
203 } |
2b95417a1715
Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
204 |
0 | 205 sr->header_only = 1; |
206 | |
207 ctx->subrequest = sr; | |
208 | |
209 ngx_http_set_ctx(r, ctx, ngx_http_auth_request_module); | |
210 | |
211 return NGX_AGAIN; | |
212 } | |
213 | |
214 | |
215 static ngx_int_t | |
216 ngx_http_auth_request_done(ngx_http_request_t *r, void *data, ngx_int_t rc) | |
217 { | |
218 ngx_http_auth_request_ctx_t *ctx = data; | |
219 | |
220 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
221 "auth request done s:%d", r->headers_out.status); | |
222 | |
223 ctx->done = 1; | |
224 ctx->status = r->headers_out.status; | |
225 | |
226 return rc; | |
227 } | |
228 | |
229 | |
7
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
230 static ngx_int_t |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
231 ngx_http_auth_request_set_variables(ngx_http_request_t *r, |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
232 ngx_http_auth_request_conf_t *arcf, ngx_http_auth_request_ctx_t *ctx) |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
233 { |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
234 ngx_str_t val; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
235 ngx_http_variable_t *v; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
236 ngx_http_variable_value_t *vv; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
237 ngx_http_auth_request_variable_t *av, *last; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
238 ngx_http_core_main_conf_t *cmcf; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
239 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
240 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
241 "auth request set variables"); |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
242 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
243 if (arcf->vars == NULL) { |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
244 return NGX_OK; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
245 } |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
246 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
247 cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
248 v = cmcf->variables.elts; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
249 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
250 av = arcf->vars->elts; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
251 last = av + arcf->vars->nelts; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
252 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
253 while (av < last) { |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
254 /* |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
255 * explicitly set new value to make sure it will be available after |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
256 * internal redirects |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
257 */ |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
258 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
259 vv = &r->variables[av->index]; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
260 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
261 if (ngx_http_complex_value(ctx->subrequest, &av->value, &val) |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
262 != NGX_OK) |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
263 { |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
264 return NGX_ERROR; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
265 } |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
266 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
267 vv->valid = 1; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
268 vv->not_found = 0; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
269 vv->data = val.data; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
270 vv->len = val.len; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
271 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
272 if (av->set_handler) { |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
273 /* |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
274 * set_handler only available in cmcf->variables_keys, so we store |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
275 * it explicitly |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
276 */ |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
277 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
278 av->set_handler(r, vv, v[av->index].data); |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
279 } |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
280 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
281 av++; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
282 } |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
283 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
284 return NGX_OK; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
285 } |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
286 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
287 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
288 static ngx_int_t |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
289 ngx_http_auth_request_variable(ngx_http_request_t *r, |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
290 ngx_http_variable_value_t *v, uintptr_t data) |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
291 { |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
292 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
293 "auth request variable"); |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
294 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
295 v->not_found = 1; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
296 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
297 return NGX_OK; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
298 } |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
299 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
300 |
0 | 301 static void * |
302 ngx_http_auth_request_create_conf(ngx_conf_t *cf) | |
303 { | |
304 ngx_http_auth_request_conf_t *conf; | |
305 | |
306 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_auth_request_conf_t)); | |
307 if (conf == NULL) { | |
308 return NULL; | |
309 } | |
310 | |
311 /* | |
312 * set by ngx_pcalloc(): | |
313 * | |
16
a19a77bf7b70
Auth request: comment fix.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
314 * conf->uri = { 0, NULL }; |
0 | 315 */ |
316 | |
7
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
317 conf->vars = NGX_CONF_UNSET_PTR; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
318 |
0 | 319 return conf; |
320 } | |
321 | |
322 | |
323 static char * | |
324 ngx_http_auth_request_merge_conf(ngx_conf_t *cf, void *parent, void *child) | |
325 { | |
326 ngx_http_auth_request_conf_t *prev = parent; | |
327 ngx_http_auth_request_conf_t *conf = child; | |
328 | |
329 ngx_conf_merge_str_value(conf->uri, prev->uri, ""); | |
7
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
330 ngx_conf_merge_ptr_value(conf->vars, prev->vars, NULL); |
0 | 331 |
332 return NGX_CONF_OK; | |
333 } | |
334 | |
335 | |
336 static ngx_int_t | |
337 ngx_http_auth_request_init(ngx_conf_t *cf) | |
338 { | |
339 ngx_http_handler_pt *h; | |
340 ngx_http_core_main_conf_t *cmcf; | |
341 | |
342 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); | |
343 | |
344 h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers); | |
345 if (h == NULL) { | |
346 return NGX_ERROR; | |
347 } | |
348 | |
349 *h = ngx_http_auth_request_handler; | |
350 | |
351 return NGX_OK; | |
352 } | |
1
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
353 |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
354 |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
355 static char * |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
356 ngx_http_auth_request(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
357 { |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
358 ngx_http_auth_request_conf_t *arcf = conf; |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
359 |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
360 ngx_str_t *value; |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
361 |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
362 if (arcf->uri.data != NULL) { |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
363 return "is duplicate"; |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
364 } |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
365 |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
366 value = cf->args->elts; |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
367 |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
368 if (ngx_strcmp(value[1].data, "off") == 0) { |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
369 arcf->uri.len = 0; |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
370 arcf->uri.data = (u_char *) ""; |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
371 |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
372 return NGX_CONF_OK; |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
373 } |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
374 |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
375 arcf->uri = value[1]; |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
376 |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
377 return NGX_CONF_OK; |
dfc5ae42367a
Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
378 } |
7
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
379 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
380 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
381 static char * |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
382 ngx_http_auth_request_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
383 { |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
384 ngx_http_auth_request_conf_t *arcf = conf; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
385 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
386 ngx_str_t *value; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
387 ngx_http_variable_t *v; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
388 ngx_http_auth_request_variable_t *av; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
389 ngx_http_compile_complex_value_t ccv; |
14
d4c131d13048
Auth request: whitespace fix.
Maxim Dounin <mdounin@mdounin.ru>
parents:
10
diff
changeset
|
390 |
7
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
391 value = cf->args->elts; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
392 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
393 if (value[1].data[0] != '$') { |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
394 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
395 "invalid variable name \"%V\"", &value[1]); |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
396 return NGX_CONF_ERROR; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
397 } |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
398 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
399 value[1].len--; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
400 value[1].data++; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
401 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
402 if (arcf->vars == NGX_CONF_UNSET_PTR) { |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
403 arcf->vars = ngx_array_create(cf->pool, 1, |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
404 sizeof(ngx_http_auth_request_variable_t)); |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
405 if (arcf->vars == NULL) { |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
406 return NGX_CONF_ERROR; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
407 } |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
408 } |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
409 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
410 av = ngx_array_push(arcf->vars); |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
411 if (av == NULL) { |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
412 return NGX_CONF_ERROR; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
413 } |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
414 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
415 v = ngx_http_add_variable(cf, &value[1], NGX_HTTP_VAR_CHANGEABLE); |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
416 if (v == NULL) { |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
417 return NGX_CONF_ERROR; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
418 } |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
419 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
420 av->index = ngx_http_get_variable_index(cf, &value[1]); |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
421 if (av->index == NGX_ERROR) { |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
422 return NGX_CONF_ERROR; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
423 } |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
424 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
425 if (v->get_handler == NULL) { |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
426 v->get_handler = ngx_http_auth_request_variable; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
427 v->data = (uintptr_t) av; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
428 } |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
429 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
430 av->set_handler = v->set_handler; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
431 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
432 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
433 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
434 ccv.cf = cf; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
435 ccv.value = &value[2]; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
436 ccv.complex_value = &av->value; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
437 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
438 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
439 return NGX_CONF_ERROR; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
440 } |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
441 |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
442 return NGX_CONF_OK; |
fb05a061532c
Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
443 } |