annotate ngx_http_auth_request_module.c @ 7:fb05a061532c

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