annotate ngx_http_auth_request_module.c @ 10:2b95417a1715

Auth request: fix body handling again. Setting r->discard_body is wrong way to go as it causes lingering timer to be armed on subrequest finalization. Create fake body instead. This also allows to protect real body file from being closed in case it was already read. Though it doesn't matter now as we set r->header_only and relevant code in ngx_http_upstream_send_response() isn't reached.
author Maxim Dounin <mdounin@mdounin.ru>
date Wed, 24 Mar 2010 07:23:22 +0300
parents fb05a061532c
children d4c131d13048
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;
fb05a061532c Auth request: auth_request_set directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
388
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 }