Mercurial > hg > nginx-quic
annotate src/http/ngx_http_write_filter_module.c @ 6376:0e0e2e522fa2
HTTP/2: fixed padding handling in HEADERS frame with CONTINUATION.
author | Valentin Bartenev <vbart@nginx.com> |
---|---|
date | Tue, 02 Feb 2016 16:33:55 +0300 |
parents | b8926ba4d087 |
children | f01ab2dbcfdc |
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; |
5926
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
51 ngx_uint_t last, flush, sync; |
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; |
5926
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
65 sync = 0; |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
66 last = 0; |
509 | 67 ll = &r->out; |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
68 |
155
46eb23d9471d
nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
154
diff
changeset
|
69 /* 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
|
70 |
509 | 71 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
|
72 ll = &cl->next; |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
73 |
667 | 74 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0, |
479 | 75 "write old buf t:%d f:%d %p, pos %p, size: %z " |
6044
b8926ba4d087
Format specifier fixed for file size of buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5926
diff
changeset
|
76 "file: %O, size: %O", |
479 | 77 cl->buf->temporary, cl->buf->in_file, |
78 cl->buf->start, cl->buf->pos, | |
79 cl->buf->last - cl->buf->pos, | |
80 cl->buf->file_pos, | |
81 cl->buf->file_last - cl->buf->file_pos); | |
82 | |
461 | 83 #if 1 |
84 if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) { | |
667 | 85 ngx_log_error(NGX_LOG_ALERT, c->log, 0, |
483 | 86 "zero size buf in writer " |
87 "t:%d r:%d f:%d %p %p-%p %p %O-%O", | |
88 cl->buf->temporary, | |
89 cl->buf->recycled, | |
90 cl->buf->in_file, | |
91 cl->buf->start, | |
92 cl->buf->pos, | |
93 cl->buf->last, | |
94 cl->buf->file, | |
95 cl->buf->file_pos, | |
96 cl->buf->file_last); | |
97 | |
461 | 98 ngx_debug_point(); |
489 | 99 return NGX_ERROR; |
461 | 100 } |
101 #endif | |
102 | |
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
|
103 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
|
104 |
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
|
105 if (cl->buf->flush || cl->buf->recycled) { |
499 | 106 flush = 1; |
41
59e7c7f30d49
nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
107 } |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
108 |
5926
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
109 if (cl->buf->sync) { |
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
110 sync = 1; |
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
111 } |
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
112 |
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
|
113 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
|
114 last = 1; |
41
59e7c7f30d49
nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
115 } |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
116 } |
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
117 |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
118 /* 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
|
119 |
332
159dd60d257a
nginx-0.0.3-2004-05-10-23:53:35 import
Igor Sysoev <igor@sysoev.ru>
parents:
319
diff
changeset
|
120 for (ln = in; ln; ln = ln->next) { |
501 | 121 cl = ngx_alloc_chain_link(r->pool); |
122 if (cl == NULL) { | |
461 | 123 return NGX_ERROR; |
124 } | |
125 | |
126 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
|
127 *ll = cl; |
46eb23d9471d
nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
154
diff
changeset
|
128 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
|
129 |
667 | 130 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0, |
479 | 131 "write new buf t:%d f:%d %p, pos %p, size: %z " |
6044
b8926ba4d087
Format specifier fixed for file size of buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5926
diff
changeset
|
132 "file: %O, size: %O", |
479 | 133 cl->buf->temporary, cl->buf->in_file, |
134 cl->buf->start, cl->buf->pos, | |
135 cl->buf->last - cl->buf->pos, | |
136 cl->buf->file_pos, | |
137 cl->buf->file_last - cl->buf->file_pos); | |
138 | |
461 | 139 #if 1 |
140 if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) { | |
667 | 141 ngx_log_error(NGX_LOG_ALERT, c->log, 0, |
483 | 142 "zero size buf in writer " |
143 "t:%d r:%d f:%d %p %p-%p %p %O-%O", | |
144 cl->buf->temporary, | |
145 cl->buf->recycled, | |
146 cl->buf->in_file, | |
147 cl->buf->start, | |
148 cl->buf->pos, | |
149 cl->buf->last, | |
150 cl->buf->file, | |
151 cl->buf->file_pos, | |
152 cl->buf->file_last); | |
153 | |
461 | 154 ngx_debug_point(); |
489 | 155 return NGX_ERROR; |
461 | 156 } |
157 #endif | |
158 | |
403
ea3113b181d1
nginx-0.0.9-2004-07-28-23:21:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
402
diff
changeset
|
159 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
|
160 |
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
|
161 if (cl->buf->flush || cl->buf->recycled) { |
499 | 162 flush = 1; |
153
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 |
5926
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
165 if (cl->buf->sync) { |
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
166 sync = 1; |
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
167 } |
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
168 |
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
|
169 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
|
170 last = 1; |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
171 } |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
172 } |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
173 |
461 | 174 *ll = NULL; |
175 | |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
176 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0, |
499 | 177 "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
|
178 |
509 | 179 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
|
180 |
142
cb77c084acdb
nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
119
diff
changeset
|
181 /* |
509 | 182 * 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
|
183 * 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
|
184 * 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
|
185 */ |
71
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
186 |
499 | 187 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
|
188 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
|
189 } |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
190 |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
191 if (c->write->delayed) { |
597 | 192 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
|
193 return NGX_AGAIN; |
57c2e18d3572
nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents:
75
diff
changeset
|
194 } |
57c2e18d3572
nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents:
75
diff
changeset
|
195 |
5513
311803b21504
SPDY: body filter was replaced by c->send_chain() function.
Valentin Bartenev <vbart@nginx.com>
parents:
5201
diff
changeset
|
196 if (size == 0 |
311803b21504
SPDY: body filter was replaced by c->send_chain() function.
Valentin Bartenev <vbart@nginx.com>
parents:
5201
diff
changeset
|
197 && !(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
|
198 && !(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
|
199 { |
5926
08bfc7188a41
Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5884
diff
changeset
|
200 if (last || flush || sync) { |
4833
3464d0b63300
Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
201 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
|
202 ln = cl; |
3464d0b63300
Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
203 cl = cl->next; |
3464d0b63300
Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
204 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
|
205 } |
597 | 206 |
4833
3464d0b63300
Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
207 r->out = NULL; |
597 | 208 c->buffered &= ~NGX_HTTP_WRITE_BUFFERED; |
501 | 209 |
499 | 210 return NGX_OK; |
211 } | |
212 | |
667 | 213 ngx_log_error(NGX_LOG_ALERT, c->log, 0, |
483 | 214 "the http output chain is empty"); |
461 | 215 |
483 | 216 ngx_debug_point(); |
217 | |
218 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
|
219 } |
5526213be452
nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
142
diff
changeset
|
220 |
635 | 221 if (r->limit_rate) { |
5201
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
222 if (r->limit_rate_after == 0) { |
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
223 r->limit_rate_after = clcf->limit_rate_after; |
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
224 } |
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
225 |
4961
ed576bd1d9c0
Limit rate: fixed integer overflow in limit calculation (ticket #256).
Valentin Bartenev <vbart@nginx.com>
parents:
4833
diff
changeset
|
226 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
|
227 - (c->sent - r->limit_rate_after); |
633 | 228 |
1194
8ea6caa62c89
style fix: change variable name
Igor Sysoev <igor@sysoev.ru>
parents:
1179
diff
changeset
|
229 if (limit <= 0) { |
635 | 230 c->write->delayed = 1; |
5884
8486205d10db
Write filter: stored delay in a variable, no functional changes.
Roman Arutyunyan <arut@nginx.com>
parents:
5513
diff
changeset
|
231 delay = (ngx_msec_t) (- limit * 1000 / r->limit_rate + 1); |
8486205d10db
Write filter: stored delay in a variable, no functional changes.
Roman Arutyunyan <arut@nginx.com>
parents:
5513
diff
changeset
|
232 ngx_add_timer(c->write, delay); |
635 | 233 |
234 c->buffered |= NGX_HTTP_WRITE_BUFFERED; | |
235 | |
236 return NGX_AGAIN; | |
237 } | |
238 | |
4384
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
239 if (clcf->sendfile_max_chunk |
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
240 && (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
|
241 { |
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
242 limit = clcf->sendfile_max_chunk; |
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
243 } |
1197 | 244 |
635 | 245 } else { |
4384
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
246 limit = clcf->sendfile_max_chunk; |
633 | 247 } |
248 | |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
249 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
|
250 |
633 | 251 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
|
252 "http write filter limit %O", limit); |
633 | 253 |
1194
8ea6caa62c89
style fix: change variable name
Igor Sysoev <igor@sysoev.ru>
parents:
1179
diff
changeset
|
254 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
|
255 |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
256 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
461 | 257 "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
|
258 |
633 | 259 if (chain == NGX_CHAIN_ERROR) { |
260 c->error = 1; | |
261 return NGX_ERROR; | |
262 } | |
263 | |
1197 | 264 if (r->limit_rate) { |
2907 | 265 |
266 nsent = c->sent; | |
267 | |
5201
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
268 if (r->limit_rate_after) { |
2907 | 269 |
5201
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
270 sent -= r->limit_rate_after; |
2907 | 271 if (sent < 0) { |
272 sent = 0; | |
273 } | |
274 | |
5201
06fbbde04098
Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4961
diff
changeset
|
275 nsent -= r->limit_rate_after; |
2907 | 276 if (nsent < 0) { |
277 nsent = 0; | |
278 } | |
279 } | |
280 | |
4383
5130c16a130e
Fixed throughput problems with large limit_rate.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2907
diff
changeset
|
281 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
|
282 |
6a8a066adc98
improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents:
1412
diff
changeset
|
283 if (delay > 0) { |
4384
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
284 limit = 0; |
1657
6a8a066adc98
improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents:
1412
diff
changeset
|
285 c->write->delayed = 1; |
6a8a066adc98
improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents:
1412
diff
changeset
|
286 ngx_add_timer(c->write, delay); |
6a8a066adc98
improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents:
1412
diff
changeset
|
287 } |
4384
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
288 } |
1197 | 289 |
4384
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
290 if (limit |
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
291 && c->write->ready |
a8b6d5dee539
Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4383
diff
changeset
|
292 && 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
|
293 { |
1197 | 294 c->write->delayed = 1; |
295 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
|
296 } |
361
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
356
diff
changeset
|
297 |
509 | 298 for (cl = r->out; cl && cl != chain; /* void */) { |
507 | 299 ln = cl; |
300 cl = cl->next; | |
301 ngx_free_chain(r->pool, ln); | |
302 } | |
303 | |
509 | 304 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
|
305 |
597 | 306 if (chain) { |
307 c->buffered |= NGX_HTTP_WRITE_BUFFERED; | |
308 return NGX_AGAIN; | |
309 } | |
310 | |
311 c->buffered &= ~NGX_HTTP_WRITE_BUFFERED; | |
312 | |
313 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
|
314 return NGX_AGAIN; |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
315 } |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
316 |
399
4e21d1291a14
nginx-0.0.7-2004-07-25-22:34:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
396
diff
changeset
|
317 return NGX_OK; |
1
d220029ac7f3
nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
318 } |
9
6f58641241bb
nginx-0.0.1-2002-09-07-14:14:25 import
Igor Sysoev <igor@sysoev.ru>
parents:
8
diff
changeset
|
319 |
6f58641241bb
nginx-0.0.1-2002-09-07-14:14:25 import
Igor Sysoev <igor@sysoev.ru>
parents:
8
diff
changeset
|
320 |
501 | 321 static ngx_int_t |
681 | 322 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
|
323 { |
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
324 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
|
325 |
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
326 return NGX_OK; |
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
327 } |