Mercurial > hg > nginx-quic
annotate src/http/modules/ngx_http_stub_status_module.c @ 5396:42f874c0b970
Mail: added session close on smtp_greeting_delay violation.
A server MUST send greeting before other replies, while before this
change in case of smtp_greeting_delay violation the 220 greeting was
sent after several 503 replies to commands received before greeting,
resulting in protocol synchronization loss. Moreover, further commands
were accepted after the greeting.
While closing a connection isn't strictly RFC compliant (RFC 5321
requires servers to wait for a QUIT before closing a connection), it's
probably good enough for practial uses.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 30 Sep 2013 22:09:50 +0400 |
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 } |