annotate ngx_http_auth_request_module.c @ 17:662785733552 default tip

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