annotate src/http/modules/ngx_http_auth_request_module.c @ 7746:88eca63261c3

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