Mercurial > hg > nginx
annotate src/http/modules/ngx_http_stub_status_module.c @ 5249:725fb71ab1a6
SPDY: pass through the full status when available.
Avoid stripping the status text when proxying for compatibility with http.
author | Jim Radford <radford@galvanix.com> |
---|---|
date | Fri, 07 Jun 2013 13:16:00 -0700 |
parents | ee739104d164 |
children | 2cfc095a607a |
rev | line source |
---|---|
577 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4412 | 4 * Copyright (C) Nginx, Inc. |
577 | 5 */ |
6 | |
487 | 7 |
8 #include <ngx_config.h> | |
9 #include <ngx_core.h> | |
10 #include <ngx_http.h> | |
11 | |
12 | |
5079
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
13 static ngx_int_t ngx_http_stub_status_variable(ngx_http_request_t *r, |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
14 ngx_http_variable_value_t *v, uintptr_t data); |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
15 static ngx_int_t ngx_http_stub_status_add_variables(ngx_conf_t *cf); |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
16 |
487 | 17 static char *ngx_http_set_status(ngx_conf_t *cf, ngx_command_t *cmd, |
18 void *conf); | |
577 | 19 |
487 | 20 static ngx_command_t ngx_http_status_commands[] = { |
21 | |
22 { ngx_string("stub_status"), | |
23 NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, | |
24 ngx_http_set_status, | |
25 0, | |
26 0, | |
27 NULL }, | |
28 | |
29 ngx_null_command | |
577 | 30 }; |
487 | 31 |
32 | |
577 | 33 |
667 | 34 static ngx_http_module_t ngx_http_stub_status_module_ctx = { |
5079
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
35 ngx_http_stub_status_add_variables, /* preconfiguration */ |
509 | 36 NULL, /* postconfiguration */ |
487 | 37 |
38 NULL, /* create main configuration */ | |
39 NULL, /* init main configuration */ | |
577 | 40 |
487 | 41 NULL, /* create server configuration */ |
42 NULL, /* merge server configuration */ | |
577 | 43 |
487 | 44 NULL, /* create location configuration */ |
45 NULL /* merge location configuration */ | |
46 }; | |
47 | |
48 | |
49 ngx_module_t ngx_http_stub_status_module = { | |
509 | 50 NGX_MODULE_V1, |
487 | 51 &ngx_http_stub_status_module_ctx, /* module context */ |
52 ngx_http_status_commands, /* module directives */ | |
53 NGX_HTTP_MODULE, /* module type */ | |
541 | 54 NULL, /* init master */ |
487 | 55 NULL, /* init module */ |
541 | 56 NULL, /* init process */ |
57 NULL, /* init thread */ | |
58 NULL, /* exit thread */ | |
59 NULL, /* exit process */ | |
60 NULL, /* exit master */ | |
61 NGX_MODULE_V1_PADDING | |
487 | 62 }; |
63 | |
64 | |
5079
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
65 static ngx_http_variable_t ngx_http_stub_status_vars[] = { |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
66 |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
67 { ngx_string("connections_active"), NULL, ngx_http_stub_status_variable, |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
68 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
69 |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
70 { ngx_string("connections_reading"), NULL, ngx_http_stub_status_variable, |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
71 1, NGX_HTTP_VAR_NOCACHEABLE, 0 }, |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
72 |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
73 { ngx_string("connections_writing"), NULL, ngx_http_stub_status_variable, |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
74 2, NGX_HTTP_VAR_NOCACHEABLE, 0 }, |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
75 |
5115
a29c574d61fa
Status: introduced the "ngx_stat_waiting" counter.
Valentin Bartenev <vbart@nginx.com>
parents:
5079
diff
changeset
|
76 { ngx_string("connections_waiting"), NULL, ngx_http_stub_status_variable, |
a29c574d61fa
Status: introduced the "ngx_stat_waiting" counter.
Valentin Bartenev <vbart@nginx.com>
parents:
5079
diff
changeset
|
77 3, NGX_HTTP_VAR_NOCACHEABLE, 0 }, |
a29c574d61fa
Status: introduced the "ngx_stat_waiting" counter.
Valentin Bartenev <vbart@nginx.com>
parents:
5079
diff
changeset
|
78 |
5079
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
79 { ngx_null_string, NULL, NULL, 0, 0, 0 } |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
80 }; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
81 |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
82 |
487 | 83 static ngx_int_t ngx_http_status_handler(ngx_http_request_t *r) |
84 { | |
495 | 85 size_t size; |
86 ngx_int_t rc; | |
87 ngx_buf_t *b; | |
88 ngx_chain_t out; | |
5115
a29c574d61fa
Status: introduced the "ngx_stat_waiting" counter.
Valentin Bartenev <vbart@nginx.com>
parents:
5079
diff
changeset
|
89 ngx_atomic_int_t ap, hn, ac, rq, rd, wr, wa; |
577 | 90 |
487 | 91 if (r->method != NGX_HTTP_GET && r->method != NGX_HTTP_HEAD) { |
92 return NGX_HTTP_NOT_ALLOWED; | |
93 } | |
94 | |
1370
cc114c85be0f
rename ngx_http_discard_body() to ngx_http_discard_request_body()
Igor Sysoev <igor@sysoev.ru>
parents:
667
diff
changeset
|
95 rc = ngx_http_discard_request_body(r); |
487 | 96 |
1374 | 97 if (rc != NGX_OK) { |
487 | 98 return rc; |
99 } | |
100 | |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
1563
diff
changeset
|
101 ngx_str_set(&r->headers_out.content_type, "text/plain"); |
487 | 102 |
103 if (r->method == NGX_HTTP_HEAD) { | |
104 r->headers_out.status = NGX_HTTP_OK; | |
105 | |
106 rc = ngx_http_send_header(r); | |
107 | |
108 if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { | |
109 return rc; | |
110 } | |
111 } | |
112 | |
495 | 113 size = sizeof("Active connections: \n") + NGX_ATOMIC_T_LEN |
487 | 114 + sizeof("server accepts handled requests\n") - 1 |
495 | 115 + 6 + 3 * NGX_ATOMIC_T_LEN |
116 + sizeof("Reading: Writing: Waiting: \n") + 3 * NGX_ATOMIC_T_LEN; | |
487 | 117 |
501 | 118 b = ngx_create_temp_buf(r->pool, size); |
119 if (b == NULL) { | |
487 | 120 return NGX_HTTP_INTERNAL_SERVER_ERROR; |
121 } | |
122 | |
123 out.buf = b; | |
124 out.next = NULL; | |
125 | |
126 ap = *ngx_stat_accepted; | |
495 | 127 hn = *ngx_stat_handled; |
487 | 128 ac = *ngx_stat_active; |
129 rq = *ngx_stat_requests; | |
130 rd = *ngx_stat_reading; | |
131 wr = *ngx_stat_writing; | |
5115
a29c574d61fa
Status: introduced the "ngx_stat_waiting" counter.
Valentin Bartenev <vbart@nginx.com>
parents:
5079
diff
changeset
|
132 wa = *ngx_stat_waiting; |
487 | 133 |
509 | 134 b->last = ngx_sprintf(b->last, "Active connections: %uA \n", ac); |
487 | 135 |
136 b->last = ngx_cpymem(b->last, "server accepts handled requests\n", | |
137 sizeof("server accepts handled requests\n") - 1); | |
138 | |
509 | 139 b->last = ngx_sprintf(b->last, " %uA %uA %uA \n", ap, hn, rq); |
487 | 140 |
509 | 141 b->last = ngx_sprintf(b->last, "Reading: %uA Writing: %uA Waiting: %uA \n", |
5115
a29c574d61fa
Status: introduced the "ngx_stat_waiting" counter.
Valentin Bartenev <vbart@nginx.com>
parents:
5079
diff
changeset
|
142 rd, wr, wa); |
487 | 143 |
144 r->headers_out.status = NGX_HTTP_OK; | |
145 r->headers_out.content_length_n = b->last - b->pos; | |
146 | |
4611
2b6cb7528409
Allows particular modules to handle subrequests properly.
Andrey Belov <defan@nginx.com>
parents:
4412
diff
changeset
|
147 b->last_buf = (r == r->main) ? 1 : 0; |
5243
ee739104d164
Status: the "last_in_chain" flag must be set.
Valentin Bartenev <vbart@nginx.com>
parents:
5115
diff
changeset
|
148 b->last_in_chain = 1; |
487 | 149 |
150 rc = ngx_http_send_header(r); | |
151 | |
152 if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { | |
153 return rc; | |
154 } | |
155 | |
1563
022ec9420f80
style fix: remove double semicolons
Igor Sysoev <igor@sysoev.ru>
parents:
1374
diff
changeset
|
156 return ngx_http_output_filter(r, &out); |
487 | 157 } |
158 | |
159 | |
5079
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
160 static ngx_int_t |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
161 ngx_http_stub_status_variable(ngx_http_request_t *r, |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
162 ngx_http_variable_value_t *v, uintptr_t data) |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
163 { |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
164 u_char *p; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
165 ngx_atomic_int_t value; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
166 |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
167 p = ngx_pnalloc(r->pool, NGX_ATOMIC_T_LEN); |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
168 if (p == NULL) { |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
169 return NGX_ERROR; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
170 } |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
171 |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
172 switch (data) { |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
173 case 0: |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
174 value = *ngx_stat_active; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
175 break; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
176 |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
177 case 1: |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
178 value = *ngx_stat_reading; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
179 break; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
180 |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
181 case 2: |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
182 value = *ngx_stat_writing; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
183 break; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
184 |
5115
a29c574d61fa
Status: introduced the "ngx_stat_waiting" counter.
Valentin Bartenev <vbart@nginx.com>
parents:
5079
diff
changeset
|
185 case 3: |
a29c574d61fa
Status: introduced the "ngx_stat_waiting" counter.
Valentin Bartenev <vbart@nginx.com>
parents:
5079
diff
changeset
|
186 value = *ngx_stat_waiting; |
a29c574d61fa
Status: introduced the "ngx_stat_waiting" counter.
Valentin Bartenev <vbart@nginx.com>
parents:
5079
diff
changeset
|
187 break; |
a29c574d61fa
Status: introduced the "ngx_stat_waiting" counter.
Valentin Bartenev <vbart@nginx.com>
parents:
5079
diff
changeset
|
188 |
5079
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
189 /* suppress warning */ |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
190 default: |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
191 value = 0; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
192 break; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
193 } |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
194 |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
195 v->len = ngx_sprintf(p, "%uA", value) - p; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
196 v->valid = 1; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
197 v->no_cacheable = 0; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
198 v->not_found = 0; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
199 v->data = p; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
200 |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
201 return NGX_OK; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
202 } |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
203 |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
204 |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
205 static ngx_int_t |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
206 ngx_http_stub_status_add_variables(ngx_conf_t *cf) |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
207 { |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
208 ngx_http_variable_t *var, *v; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
209 |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
210 for (v = ngx_http_stub_status_vars; v->name.len; v++) { |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
211 var = ngx_http_add_variable(cf, &v->name, v->flags); |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
212 if (var == NULL) { |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
213 return NGX_ERROR; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
214 } |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
215 |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
216 var->get_handler = v->get_handler; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
217 var->data = v->data; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
218 } |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
219 |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
220 return NGX_OK; |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
221 } |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
222 |
1c472e3b8c10
Introduced variables in ngx_http_stub_status module.
Andrey Belov <defan@nginx.com>
parents:
4611
diff
changeset
|
223 |
487 | 224 static char *ngx_http_set_status(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
225 { | |
226 ngx_http_core_loc_conf_t *clcf; | |
227 | |
228 clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); | |
229 clcf->handler = ngx_http_status_handler; | |
230 | |
231 return NGX_CONF_OK; | |
232 } |