Mercurial > hg > nginx-quic
annotate src/http/ngx_http_write_filter_module.c @ 5650:363395795384
SPDY: moved a variable initialization near to its check.
This should prevent attempts of using pointer before it was checked, since
all modern compilers are able to spot access to uninitialized variable.
No functional changes.
author | Valentin Bartenev <vbart@nginx.com> |
---|---|
date | Wed, 09 Apr 2014 18:15:32 +0400 |
parents | 311803b21504 |
children | 8486205d10db |
rev | line source |
---|---|
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
403
diff
changeset
|
1 |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
403
diff
changeset
|
2 /* |
444
42d11f017717
nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents:
441
diff
changeset
|
3 * Copyright (C) Igor Sysoev |
4412 | 4 * Copyright (C) Nginx, Inc. |
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
403
diff
changeset
|
5 */ |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
403
diff
changeset
|
6 |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
7 |
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
8 #include <ngx_config.h> |
99
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
96
diff
changeset
|
9 #include <ngx_core.h> |
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
96
diff
changeset
|
10 #include <ngx_http.h> |
43
53cd05892261
nginx-0.0.1-2002-12-27-19:22:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
42
diff
changeset
|
11 |
53cd05892261
nginx-0.0.1-2002-12-27-19:22:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
42
diff
changeset
|
12 |
681 | 13 static ngx_int_t ngx_http_write_filter_init(ngx_conf_t *cf); |
10
4f3879d9b6f6
nginx-0.0.1-2002-09-11-19:18:33 import
Igor Sysoev <igor@sysoev.ru>
parents:
9
diff
changeset
|
14 |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
15 |
667 | 16 static ngx_http_module_t ngx_http_write_filter_module_ctx = { |
509 | 17 NULL, /* preconfiguration */ |
681 | 18 ngx_http_write_filter_init, /* postconfiguration */ |
177
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
19 |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
20 NULL, /* create main configuration */ |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
21 NULL, /* init main configuration */ |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
67
diff
changeset
|
22 |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
23 NULL, /* create server configuration */ |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
24 NULL, /* merge server configuration */ |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
25 |
391
b670db10cbbd
nginx-0.0.7-2004-07-14-20:01:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
363
diff
changeset
|
26 NULL, /* create location configuration */ |
b670db10cbbd
nginx-0.0.7-2004-07-14-20:01:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
363
diff
changeset
|
27 NULL, /* merge location configuration */ |
10
4f3879d9b6f6
nginx-0.0.1-2002-09-11-19:18:33 import
Igor Sysoev <igor@sysoev.ru>
parents:
9
diff
changeset
|
28 }; |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
29 |
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
30 |
41
59e7c7f30d49
nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
31 ngx_module_t ngx_http_write_filter_module = { |
509 | 32 NGX_MODULE_V1, |
90
37530da31268
nginx-0.0.1-2003-05-16-19:27:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
83
diff
changeset
|
33 &ngx_http_write_filter_module_ctx, /* module context */ |
391
b670db10cbbd
nginx-0.0.7-2004-07-14-20:01:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
363
diff
changeset
|
34 NULL, /* module directives */ |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
91
diff
changeset
|
35 NGX_HTTP_MODULE, /* module type */ |
541 | 36 NULL, /* init master */ |
681 | 37 NULL, /* init module */ |
541 | 38 NULL, /* init process */ |
39 NULL, /* init thread */ | |
40 NULL, /* exit thread */ | |
41 NULL, /* exit process */ | |
42 NULL, /* exit master */ | |
43 NGX_MODULE_V1_PADDING | |
41
59e7c7f30d49
nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
44 }; |
59e7c7f30d49
nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
45 |
59e7c7f30d49
nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
46 |
501 | 47 ngx_int_t |
48 ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in) | |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
49 { |
2907 | 50 off_t size, sent, nsent, limit; |
509 | 51 ngx_uint_t last, flush; |
1657
6a8a066adc98
improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents:
1412
diff
changeset
|
52 ngx_msec_t delay; |
509 | 53 ngx_chain_t *cl, *ln, **ll, *chain; |
54 ngx_connection_t *c; | |
55 ngx_http_core_loc_conf_t *clcf; | |
9
6f58641241bb
nginx-0.0.1-2002-09-07-14:14:25 import
Igor Sysoev <igor@sysoev.ru>
parents:
8
diff
changeset
|
56 |
527 | 57 c = r->connection; |
58 | |
583 | 59 if (c->error) { |
527 | 60 return NGX_ERROR; |
61 } | |
62 | |
303
00c5660d2707
nginx-0.0.3-2004-04-01-20:20:53 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
63 size = 0; |
00c5660d2707
nginx-0.0.3-2004-04-01-20:20:53 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
64 flush = 0; |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
65 last = 0; |
509 | 66 ll = &r->out; |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
67 |
155
46eb23d9471d
nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
154
diff
changeset
|
68 /* find the size, the flush point and the last link of the saved chain */ |
71
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
69 |
509 | 70 for (cl = r->out; cl; cl = cl->next) { |
155
46eb23d9471d
nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
154
diff
changeset
|
71 ll = &cl->next; |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
72 |
667 | 73 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0, |
479 | 74 "write old buf t:%d f:%d %p, pos %p, size: %z " |
75 "file: %O, size: %z", | |
76 cl->buf->temporary, cl->buf->in_file, | |
77 cl->buf->start, cl->buf->pos, | |
78 cl->buf->last - cl->buf->pos, | |
79 cl->buf->file_pos, | |
80 cl->buf->file_last - cl->buf->file_pos); | |
81 | |
461 | 82 #if 1 |
83 if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) { | |
667 | 84 ngx_log_error(NGX_LOG_ALERT, c->log, 0, |
483 | 85 "zero size buf in writer " |
86 "t:%d r:%d f:%d %p %p-%p %p %O-%O", | |
87 cl->buf->temporary, | |
88 cl->buf->recycled, | |
89 cl->buf->in_file, | |
90 cl->buf->start, | |
91 cl->buf->pos, | |
92 cl->buf->last, | |
93 cl->buf->file, | |
94 cl->buf->file_pos, | |
95 cl->buf->file_last); | |
96 | |
461 | 97 ngx_debug_point(); |
489 | 98 return NGX_ERROR; |
461 | 99 } |
100 #endif | |
101 | |
343
6bdf858bff8c
nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents:
333
diff
changeset
|
102 size += ngx_buf_size(cl->buf); |
3
34a521b1a148
nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
1
diff
changeset
|
103 |
343
6bdf858bff8c
nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents:
333
diff
changeset
|
104 if (cl->buf->flush || cl->buf->recycled) { |
499 | 105 flush = 1; |
41
59e7c7f30d49
nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
106 } |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
107 |
343
6bdf858bff8c
nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents:
333
diff
changeset
|
108 if (cl->buf->last_buf) { |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
109 last = 1; |
41
59e7c7f30d49
nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
110 } |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
111 } |
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
112 |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
113 /* add the new chain to the existent one */ |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
114 |
332
159dd60d257a
nginx-0.0.3-2004-05-10-23:53:35 import
Igor Sysoev <igor@sysoev.ru>
parents:
319
diff
changeset
|
115 for (ln = in; ln; ln = ln->next) { |
501 | 116 cl = ngx_alloc_chain_link(r->pool); |
117 if (cl == NULL) { | |
461 | 118 return NGX_ERROR; |
119 } | |
120 | |
121 cl->buf = ln->buf; | |
155
46eb23d9471d
nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
154
diff
changeset
|
122 *ll = cl; |
46eb23d9471d
nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
154
diff
changeset
|
123 ll = &cl->next; |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
124 |
667 | 125 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0, |
479 | 126 "write new buf t:%d f:%d %p, pos %p, size: %z " |
127 "file: %O, size: %z", | |
128 cl->buf->temporary, cl->buf->in_file, | |
129 cl->buf->start, cl->buf->pos, | |
130 cl->buf->last - cl->buf->pos, | |
131 cl->buf->file_pos, | |
132 cl->buf->file_last - cl->buf->file_pos); | |
133 | |
461 | 134 #if 1 |
135 if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) { | |
667 | 136 ngx_log_error(NGX_LOG_ALERT, c->log, 0, |
483 | 137 "zero size buf in writer " |
138 "t:%d r:%d f:%d %p %p-%p %p %O-%O", | |
139 cl->buf->temporary, | |
140 cl->buf->recycled, | |
141 cl->buf->in_file, | |
142 cl->buf->start, | |
143 cl->buf->pos, | |
144 cl->buf->last, | |
145 cl->buf->file, | |
146 cl->buf->file_pos, | |
147 cl->buf->file_last); | |
148 | |
461 | 149 ngx_debug_point(); |
489 | 150 return NGX_ERROR; |
461 | 151 } |
152 #endif | |
153 | |
403
ea3113b181d1
nginx-0.0.9-2004-07-28-23:21:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
402
diff
changeset
|
154 size += ngx_buf_size(cl->buf); |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
155 |
343
6bdf858bff8c
nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents:
333
diff
changeset
|
156 if (cl->buf->flush || cl->buf->recycled) { |
499 | 157 flush = 1; |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
158 } |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
159 |
343
6bdf858bff8c
nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents:
333
diff
changeset
|
160 if (cl->buf->last_buf) { |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
161 last = 1; |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
162 } |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
163 } |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
164 |
461 | 165 *ll = NULL; |
166 | |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
167 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0, |
499 | 168 "http write filter: l:%d f:%d s:%O", last, flush, size); |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
169 |
509 | 170 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
154
eac26585476e
nginx-0.0.1-2003-10-22-11:05:29 import
Igor Sysoev <igor@sysoev.ru>
parents:
153
diff
changeset
|
171 |
142
cb77c084acdb
nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
119
diff
changeset
|
172 /* |
509 | 173 * avoid the output if there are no last buf, no flush point, |
344
e366ba5db8f8
nginx-0.0.3-2004-06-01-10:04:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
343
diff
changeset
|
174 * there are the incoming bufs and the size of all bufs |
332
159dd60d257a
nginx-0.0.3-2004-05-10-23:53:35 import
Igor Sysoev <igor@sysoev.ru>
parents:
319
diff
changeset
|
175 * is smaller than "postpone_output" directive |
142
cb77c084acdb
nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
119
diff
changeset
|
176 */ |
71
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
177 |
499 | 178 if (!last && !flush && in && size < (off_t) clcf->postpone_output) { |
4
c5f071d376e5
nginx-0.0.1-2002-08-22-19:24:03 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
179 return NGX_OK; |
41
59e7c7f30d49
nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
180 } |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
181 |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
182 if (c->write->delayed) { |
597 | 183 c->buffered |= NGX_HTTP_WRITE_BUFFERED; |
77
57c2e18d3572
nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents:
75
diff
changeset
|
184 return NGX_AGAIN; |
57c2e18d3572
nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents:
75
diff
changeset
|
185 } |
57c2e18d3572
nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents:
75
diff
changeset
|
186 |
5513
311803b21504
SPDY: body filter was replaced by c->send_chain() function.
Valentin Bartenev <vbart@nginx.com>
parents:
5201
diff
changeset
|
187 if (size == 0 |
311803b21504
SPDY: body filter was replaced by c->send_chain() function.
Valentin Bartenev <vbart@nginx.com>
parents:
5201
diff
changeset
|
188 && !(c->buffered & NGX_LOWLEVEL_BUFFERED) |
311803b21504
SPDY: body filter was replaced by c->send_chain() function.
Valentin Bartenev <vbart@nginx.com>
parents:
5201
diff
changeset
|
189 && !(last && c->need_last_buf)) |
311803b21504
SPDY: body filter was replaced by c->send_chain() function.
Valentin Bartenev <vbart@nginx.com>
parents:
5201
diff
changeset
|
190 { |
4833
3464d0b63300
Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
191 if (last || flush) { |
3464d0b63300
Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
192 for (cl = r->out; cl; /* void */) { |
3464d0b63300
Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
193 ln = cl; |
3464d0b63300
Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
194 cl = cl->next; |
3464d0b63300
Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
195 ngx_free_chain(r->pool, ln); |
3464d0b63300
Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
196 } |
597 | 197 |
4833
3464d0b63300
Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
198 r->out = NULL; |
597 | 199 c->buffered &= ~NGX_HTTP_WRITE_BUFFERED; |
501 | 200 |
499 | 201 return NGX_OK; |
202 } | |
203 | |
667 | 204 ngx_log_error(NGX_LOG_ALERT, c->log, 0, |
483 | 205 "the http output chain is empty"); |
461 | 206 |
483 | 207 ngx_debug_point(); |
208 | |
209 return NGX_ERROR; | |
143
5526213be452
nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
142
diff
changeset
|
210 } |
5526213be452
nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
142
diff
changeset
|
211 |
635 | 212 if (r->limit_rate) { |
5201
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
213 if (r->limit_rate_after == 0) { |
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
214 r->limit_rate_after = clcf->limit_rate_after; |
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
215 } |
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
216 |
4961
ed576bd1d9c0
Limit rate: fixed integer overflow in limit calculation (ticket #256).
Valentin Bartenev <vbart@nginx.com>
parents:
4833
diff
changeset
|
217 limit = (off_t) r->limit_rate * (ngx_time() - r->start_sec + 1) |
5201
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
218 - (c->sent - r->limit_rate_after); |
633 | 219 |
1194
8ea6caa62c89
style fix: change variable name
Igor Sysoev <igor@sysoev.ru>
parents:
1179
diff
changeset
|
220 if (limit <= 0) { |
635 | 221 c->write->delayed = 1; |
667 | 222 ngx_add_timer(c->write, |
1194
8ea6caa62c89
style fix: change variable name
Igor Sysoev <igor@sysoev.ru>
parents:
1179
diff
changeset
|
223 (ngx_msec_t) (- limit * 1000 / r->limit_rate + 1)); |
635 | 224 |
225 c->buffered |= NGX_HTTP_WRITE_BUFFERED; | |
226 | |
227 return NGX_AGAIN; | |
228 } | |
229 | |
4384
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
230 if (clcf->sendfile_max_chunk |
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
231 && (off_t) clcf->sendfile_max_chunk < limit) |
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
232 { |
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
233 limit = clcf->sendfile_max_chunk; |
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
234 } |
1197 | 235 |
635 | 236 } else { |
4384
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
237 limit = clcf->sendfile_max_chunk; |
633 | 238 } |
239 | |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
240 sent = c->sent; |
361
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
356
diff
changeset
|
241 |
633 | 242 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
1194
8ea6caa62c89
style fix: change variable name
Igor Sysoev <igor@sysoev.ru>
parents:
1179
diff
changeset
|
243 "http write filter limit %O", limit); |
633 | 244 |
1194
8ea6caa62c89
style fix: change variable name
Igor Sysoev <igor@sysoev.ru>
parents:
1179
diff
changeset
|
245 chain = c->send_chain(c, r->out, limit); |
61
4f3e2abcc2c4
nginx-0.0.1-2003-02-11-19:42:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
59
diff
changeset
|
246 |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
247 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
461 | 248 "http write filter %p", chain); |
61
4f3e2abcc2c4
nginx-0.0.1-2003-02-11-19:42:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
59
diff
changeset
|
249 |
633 | 250 if (chain == NGX_CHAIN_ERROR) { |
251 c->error = 1; | |
252 return NGX_ERROR; | |
253 } | |
254 | |
1197 | 255 if (r->limit_rate) { |
2907 | 256 |
257 nsent = c->sent; | |
258 | |
5201
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
259 if (r->limit_rate_after) { |
2907 | 260 |
5201
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
261 sent -= r->limit_rate_after; |
2907 | 262 if (sent < 0) { |
263 sent = 0; | |
264 } | |
265 | |
5201
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
266 nsent -= r->limit_rate_after; |
2907 | 267 if (nsent < 0) { |
268 nsent = 0; | |
269 } | |
270 } | |
271 | |
4383
5130c16a130e
Fixed throughput problems with large limit_rate.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2907
diff
changeset
|
272 delay = (ngx_msec_t) ((nsent - sent) * 1000 / r->limit_rate); |
1657
6a8a066adc98
improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents:
1412
diff
changeset
|
273 |
6a8a066adc98
improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents:
1412
diff
changeset
|
274 if (delay > 0) { |
4384
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
275 limit = 0; |
1657
6a8a066adc98
improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents:
1412
diff
changeset
|
276 c->write->delayed = 1; |
6a8a066adc98
improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents:
1412
diff
changeset
|
277 ngx_add_timer(c->write, delay); |
6a8a066adc98
improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents:
1412
diff
changeset
|
278 } |
4384
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
279 } |
1197 | 280 |
4384
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
281 if (limit |
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
282 && c->write->ready |
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
283 && c->sent - sent >= limit - (off_t) (2 * ngx_pagesize)) |
1408
e67ef50c3176
set delay only when almost whole sendfile_max_chunk was transferred
Igor Sysoev <igor@sysoev.ru>
parents:
1197
diff
changeset
|
284 { |
1197 | 285 c->write->delayed = 1; |
286 ngx_add_timer(c->write, 1); | |
362
7650aea1816f
nginx-0.0.7-2004-06-21-19:59:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
361
diff
changeset
|
287 } |
361
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
356
diff
changeset
|
288 |
509 | 289 for (cl = r->out; cl && cl != chain; /* void */) { |
507 | 290 ln = cl; |
291 cl = cl->next; | |
292 ngx_free_chain(r->pool, ln); | |
293 } | |
294 | |
509 | 295 r->out = chain; |
399
4e21d1291a14
nginx-0.0.7-2004-07-25-22:34:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
396
diff
changeset
|
296 |
597 | 297 if (chain) { |
298 c->buffered |= NGX_HTTP_WRITE_BUFFERED; | |
299 return NGX_AGAIN; | |
300 } | |
301 | |
302 c->buffered &= ~NGX_HTTP_WRITE_BUFFERED; | |
303 | |
304 if ((c->buffered & NGX_LOWLEVEL_BUFFERED) && r->postponed == NULL) { | |
395
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
305 return NGX_AGAIN; |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
306 } |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
307 |
399
4e21d1291a14
nginx-0.0.7-2004-07-25-22:34:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
396
diff
changeset
|
308 return NGX_OK; |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
309 } |
9
6f58641241bb
nginx-0.0.1-2002-09-07-14:14:25 import
Igor Sysoev <igor@sysoev.ru>
parents:
8
diff
changeset
|
310 |
6f58641241bb
nginx-0.0.1-2002-09-07-14:14:25 import
Igor Sysoev <igor@sysoev.ru>
parents:
8
diff
changeset
|
311 |
501 | 312 static ngx_int_t |
681 | 313 ngx_http_write_filter_init(ngx_conf_t *cf) |
71
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
314 { |
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
315 ngx_http_top_body_filter = ngx_http_write_filter; |
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
316 |
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
317 return NGX_OK; |
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
318 } |