annotate ngx_http_auth_request_module.c @ 14:d4c131d13048

Auth request: whitespace fix.
author Maxim Dounin <mdounin@mdounin.ru>
date Sun, 21 Jul 2013 04:34:47 +0400
parents 2b95417a1715
children a19a77bf7b70
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
10
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
193 /*
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
194 * 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
195 * 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
196 */
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
197
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
198 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
199 if (sr->request_body == NULL) {
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
200 return NGX_ERROR;
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
201 }
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
202
0
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
203 sr->header_only = 1;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
204
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
205 ctx->subrequest = sr;
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_set_ctx(r, ctx, ngx_http_auth_request_module);
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 return NGX_AGAIN;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
210 }
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
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
213 static ngx_int_t
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
214 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
215 {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
216 ngx_http_auth_request_ctx_t *ctx = data;
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
219 "auth request done s:%d", r->headers_out.status);
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
220
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
221 ctx->done = 1;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
222 ctx->status = r->headers_out.status;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
223
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
224 return rc;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
225 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
226
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
227
7
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
228 static ngx_int_t
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
229 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
230 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
231 {
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
232 ngx_str_t val;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
233 ngx_http_variable_t *v;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
234 ngx_http_variable_value_t *vv;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
235 ngx_http_auth_request_variable_t *av, *last;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
236 ngx_http_core_main_conf_t *cmcf;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
237
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
238 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
239 "auth request set variables");
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
240
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
241 if (arcf->vars == NULL) {
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
242 return NGX_OK;
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
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
245 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
246 v = cmcf->variables.elts;
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 av = arcf->vars->elts;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
249 last = av + arcf->vars->nelts;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
250
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
251 while (av < last) {
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 * 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
254 * internal redirects
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
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
257 vv = &r->variables[av->index];
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 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
260 != NGX_OK)
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
261 {
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
262 return NGX_ERROR;
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
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
265 vv->valid = 1;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
266 vv->not_found = 0;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
267 vv->data = val.data;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
268 vv->len = val.len;
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 if (av->set_handler) {
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 * 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
273 * it explicitly
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 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
277 }
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
278
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
279 av++;
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
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
282 return NGX_OK;
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
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 static ngx_int_t
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
287 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
288 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
289 {
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
290 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
291 "auth request variable");
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
292
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
293 v->not_found = 1;
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 return NGX_OK;
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
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
298
0
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
299 static void *
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
300 ngx_http_auth_request_create_conf(ngx_conf_t *cf)
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
301 {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
302 ngx_http_auth_request_conf_t *conf;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
303
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
304 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_auth_request_conf_t));
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
305 if (conf == NULL) {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
306 return NULL;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
307 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
308
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 * set by ngx_pcalloc():
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 * conf->uri.len = { 0, NULL };
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
313 */
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
314
7
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
315 conf->vars = NGX_CONF_UNSET_PTR;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
316
0
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
317 return conf;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
318 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
319
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 static char *
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
322 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
323 {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
324 ngx_http_auth_request_conf_t *prev = parent;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
325 ngx_http_auth_request_conf_t *conf = child;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
326
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
327 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
328 ngx_conf_merge_ptr_value(conf->vars, prev->vars, NULL);
0
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
329
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
330 return NGX_CONF_OK;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
331 }
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
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
334 static ngx_int_t
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
335 ngx_http_auth_request_init(ngx_conf_t *cf)
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 ngx_http_handler_pt *h;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
338 ngx_http_core_main_conf_t *cmcf;
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 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
341
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
342 h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
343 if (h == NULL) {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
344 return NGX_ERROR;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
345 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
346
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
347 *h = ngx_http_auth_request_handler;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
348
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
349 return NGX_OK;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
350 }
1
dfc5ae42367a Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
351
dfc5ae42367a Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
352
dfc5ae42367a Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
353 static char *
dfc5ae42367a Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
354 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
355 {
dfc5ae42367a Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
356 ngx_http_auth_request_conf_t *arcf = 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_str_t *value;
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 if (arcf->uri.data != NULL) {
dfc5ae42367a Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
361 return "is duplicate";
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 value = cf->args->elts;
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 if (ngx_strcmp(value[1].data, "off") == 0) {
dfc5ae42367a Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
367 arcf->uri.len = 0;
dfc5ae42367a Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
368 arcf->uri.data = (u_char *) "";
dfc5ae42367a Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
369
dfc5ae42367a Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
370 return NGX_CONF_OK;
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
dfc5ae42367a Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
373 arcf->uri = value[1];
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 return NGX_CONF_OK;
dfc5ae42367a Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
376 }
7
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
377
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
378
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
379 static char *
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
380 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
381 {
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
382 ngx_http_auth_request_conf_t *arcf = 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_str_t *value;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
385 ngx_http_variable_t *v;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
386 ngx_http_auth_request_variable_t *av;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
387 ngx_http_compile_complex_value_t ccv;
14
d4c131d13048 Auth request: whitespace fix.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
388
7
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
389 value = cf->args->elts;
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 (value[1].data[0] != '$') {
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
392 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
393 "invalid variable name \"%V\"", &value[1]);
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
394 return NGX_CONF_ERROR;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
395 }
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 value[1].len--;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
398 value[1].data++;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
399
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
400 if (arcf->vars == NGX_CONF_UNSET_PTR) {
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
401 arcf->vars = ngx_array_create(cf->pool, 1,
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
402 sizeof(ngx_http_auth_request_variable_t));
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
403 if (arcf->vars == NULL) {
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
404 return NGX_CONF_ERROR;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
405 }
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
406 }
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 av = ngx_array_push(arcf->vars);
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
409 if (av == NULL) {
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
410 return NGX_CONF_ERROR;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
411 }
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 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
414 if (v == NULL) {
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
415 return NGX_CONF_ERROR;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
416 }
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 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
419 if (av->index == NGX_ERROR) {
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
420 return NGX_CONF_ERROR;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
421 }
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 if (v->get_handler == NULL) {
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
424 v->get_handler = ngx_http_auth_request_variable;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
425 v->data = (uintptr_t) av;
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
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
428 av->set_handler = v->set_handler;
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 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
431
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
432 ccv.cf = cf;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
433 ccv.value = &value[2];
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
434 ccv.complex_value = &av->value;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
435
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
436 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
437 return NGX_CONF_ERROR;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
438 }
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
439
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
440 return NGX_CONF_OK;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
441 }