annotate src/http/ngx_http_write_filter_module.c @ 7690:8253424d1aff

Added size check to ngx_http_alloc_large_header_buffer(). This ensures that copying won't write more than the buffer size even if the buffer comes from hc->free and it is smaller than the large client header buffer size in the virtual host configuration. This might happen if size of large client header buffers is different in name-based virtual hosts, similarly to the problem with number of buffers fixed in 6926:e662cbf1b932.
author Maxim Dounin <mdounin@mdounin.ru>
date Thu, 06 Aug 2020 05:02:22 +0300
parents c19ca381b2e6
children 61e9c078ee3d 94daa42ff5ce
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4384
diff changeset
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
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
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
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
16 static ngx_http_module_t ngx_http_write_filter_module_ctx = {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
17 NULL, /* preconfiguration */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
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
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
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
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
36 NULL, /* init master */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
37 NULL, /* init module */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
38 NULL, /* init process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
39 NULL, /* init thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
40 NULL, /* exit thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
41 NULL, /* exit process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
42 NULL, /* exit master */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
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
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
47 ngx_int_t
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
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
4f5753877376 limit_rate_after
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
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
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
53 ngx_chain_t *cl, *ln, **ll, *chain;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
54 ngx_connection_t *c;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
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
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 513
diff changeset
57 c = r->connection;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 513
diff changeset
58
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
59 if (c->error) {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 513
diff changeset
60 return NGX_ERROR;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 513
diff changeset
61 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 513
diff changeset
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
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
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
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
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
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
74 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0,
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
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
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
77 cl->buf->temporary, cl->buf->in_file,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
78 cl->buf->start, cl->buf->pos,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
79 cl->buf->last - cl->buf->pos,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
80 cl->buf->file_pos,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
81 cl->buf->file_last - cl->buf->file_pos);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
82
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
83 if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) {
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
84 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
85 "zero size buf in writer "
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
86 "t:%d r:%d f:%d %p %p-%p %p %O-%O",
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
87 cl->buf->temporary,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
88 cl->buf->recycled,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
89 cl->buf->in_file,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
90 cl->buf->start,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
91 cl->buf->pos,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
92 cl->buf->last,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
93 cl->buf->file,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
94 cl->buf->file_pos,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
95 cl->buf->file_last);
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
96
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
97 ngx_debug_point();
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
98 return NGX_ERROR;
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
99 }
7401
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
100
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
101 if (ngx_buf_size(cl->buf) < 0) {
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
102 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
103 "negative size buf in writer "
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
104 "t:%d r:%d f:%d %p %p-%p %p %O-%O",
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
105 cl->buf->temporary,
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
106 cl->buf->recycled,
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
107 cl->buf->in_file,
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
108 cl->buf->start,
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
109 cl->buf->pos,
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
110 cl->buf->last,
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
111 cl->buf->file,
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
112 cl->buf->file_pos,
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
113 cl->buf->file_last);
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
114
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
115 ngx_debug_point();
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
116 return NGX_ERROR;
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
117 }
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
118
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
119 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
120
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
121 if (cl->buf->flush || cl->buf->recycled) {
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
122 flush = 1;
41
59e7c7f30d49 nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
123 }
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124
5926
08bfc7188a41 Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5884
diff changeset
125 if (cl->buf->sync) {
08bfc7188a41 Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5884
diff changeset
126 sync = 1;
08bfc7188a41 Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5884
diff changeset
127 }
08bfc7188a41 Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5884
diff changeset
128
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
129 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
130 last = 1;
41
59e7c7f30d49 nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
131 }
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 }
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133
153
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
134 /* 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
135
332
159dd60d257a nginx-0.0.3-2004-05-10-23:53:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 319
diff changeset
136 for (ln = in; ln; ln = ln->next) {
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
137 cl = ngx_alloc_chain_link(r->pool);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
138 if (cl == NULL) {
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
139 return NGX_ERROR;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
140 }
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
141
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
142 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
143 *ll = cl;
46eb23d9471d nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 154
diff changeset
144 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
145
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
146 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0,
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
147 "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
148 "file: %O, size: %O",
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
149 cl->buf->temporary, cl->buf->in_file,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
150 cl->buf->start, cl->buf->pos,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
151 cl->buf->last - cl->buf->pos,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
152 cl->buf->file_pos,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
153 cl->buf->file_last - cl->buf->file_pos);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
154
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
155 if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) {
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
156 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
157 "zero size buf in writer "
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
158 "t:%d r:%d f:%d %p %p-%p %p %O-%O",
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
159 cl->buf->temporary,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
160 cl->buf->recycled,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
161 cl->buf->in_file,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
162 cl->buf->start,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
163 cl->buf->pos,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
164 cl->buf->last,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
165 cl->buf->file,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
166 cl->buf->file_pos,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
167 cl->buf->file_last);
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
168
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
169 ngx_debug_point();
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
170 return NGX_ERROR;
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
171 }
7401
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
172
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
173 if (ngx_buf_size(cl->buf) < 0) {
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
174 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
175 "negative size buf in writer "
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
176 "t:%d r:%d f:%d %p %p-%p %p %O-%O",
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
177 cl->buf->temporary,
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
178 cl->buf->recycled,
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
179 cl->buf->in_file,
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
180 cl->buf->start,
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
181 cl->buf->pos,
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
182 cl->buf->last,
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
183 cl->buf->file,
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
184 cl->buf->file_pos,
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
185 cl->buf->file_last);
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
186
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
187 ngx_debug_point();
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
188 return NGX_ERROR;
a7ff19afbb14 Negative size buffers detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
189 }
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
190
403
ea3113b181d1 nginx-0.0.9-2004-07-28-23:21:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 402
diff changeset
191 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
192
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
193 if (cl->buf->flush || cl->buf->recycled) {
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
194 flush = 1;
153
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
195 }
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
196
5926
08bfc7188a41 Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5884
diff changeset
197 if (cl->buf->sync) {
08bfc7188a41 Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5884
diff changeset
198 sync = 1;
08bfc7188a41 Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5884
diff changeset
199 }
08bfc7188a41 Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5884
diff changeset
200
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
201 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
202 last = 1;
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
203 }
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
204 }
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
205
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
206 *ll = NULL;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
207
396
6f3b20c1ac50 nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 395
diff changeset
208 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,
6480
f01ab2dbcfdc Fixed logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6044
diff changeset
209 "http write filter: l:%ui f:%ui 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
210
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
211 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
212
142
cb77c084acdb nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 119
diff changeset
213 /*
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
214 * 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
215 * 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
216 * 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
217 */
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
218
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
219 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
220 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
221 }
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222
396
6f3b20c1ac50 nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 395
diff changeset
223 if (c->write->delayed) {
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
224 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
225 return NGX_AGAIN;
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 75
diff changeset
226 }
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 75
diff changeset
227
5513
311803b21504 SPDY: body filter was replaced by c->send_chain() function.
Valentin Bartenev <vbart@nginx.com>
parents: 5201
diff changeset
228 if (size == 0
311803b21504 SPDY: body filter was replaced by c->send_chain() function.
Valentin Bartenev <vbart@nginx.com>
parents: 5201
diff changeset
229 && !(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
230 && !(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
231 {
5926
08bfc7188a41 Write filter: fixed handling of sync bufs (ticket #132).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5884
diff changeset
232 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
233 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
234 ln = cl;
3464d0b63300 Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
235 cl = cl->next;
3464d0b63300 Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
236 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
237 }
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
238
4833
3464d0b63300 Write filter: replaced unneeded loop with one to free chains.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
239 r->out = NULL;
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
240 c->buffered &= ~NGX_HTTP_WRITE_BUFFERED;
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
241
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
242 return NGX_OK;
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
243 }
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
244
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
245 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
246 "the http output chain is empty");
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
247
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
248 ngx_debug_point();
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
249
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
250 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
251 }
5526213be452 nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 142
diff changeset
252
7504
c19ca381b2e6 Variables support in limit_rate and limit_rate_after (ticket #293).
Ruslan Ermilov <ru@nginx.com>
parents: 7401
diff changeset
253 if (!r->limit_rate_set) {
c19ca381b2e6 Variables support in limit_rate and limit_rate_after (ticket #293).
Ruslan Ermilov <ru@nginx.com>
parents: 7401
diff changeset
254 r->limit_rate = ngx_http_complex_value_size(r, clcf->limit_rate, 0);
c19ca381b2e6 Variables support in limit_rate and limit_rate_after (ticket #293).
Ruslan Ermilov <ru@nginx.com>
parents: 7401
diff changeset
255 r->limit_rate_set = 1;
c19ca381b2e6 Variables support in limit_rate and limit_rate_after (ticket #293).
Ruslan Ermilov <ru@nginx.com>
parents: 7401
diff changeset
256 }
c19ca381b2e6 Variables support in limit_rate and limit_rate_after (ticket #293).
Ruslan Ermilov <ru@nginx.com>
parents: 7401
diff changeset
257
635
18268abd340c nginx-0.3.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
258 if (r->limit_rate) {
7504
c19ca381b2e6 Variables support in limit_rate and limit_rate_after (ticket #293).
Ruslan Ermilov <ru@nginx.com>
parents: 7401
diff changeset
259
c19ca381b2e6 Variables support in limit_rate and limit_rate_after (ticket #293).
Ruslan Ermilov <ru@nginx.com>
parents: 7401
diff changeset
260 if (!r->limit_rate_after_set) {
c19ca381b2e6 Variables support in limit_rate and limit_rate_after (ticket #293).
Ruslan Ermilov <ru@nginx.com>
parents: 7401
diff changeset
261 r->limit_rate_after = ngx_http_complex_value_size(r,
c19ca381b2e6 Variables support in limit_rate and limit_rate_after (ticket #293).
Ruslan Ermilov <ru@nginx.com>
parents: 7401
diff changeset
262 clcf->limit_rate_after, 0);
c19ca381b2e6 Variables support in limit_rate and limit_rate_after (ticket #293).
Ruslan Ermilov <ru@nginx.com>
parents: 7401
diff changeset
263 r->limit_rate_after_set = 1;
5201
06fbbde04098 Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4961
diff changeset
264 }
06fbbde04098 Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4961
diff changeset
265
4961
ed576bd1d9c0 Limit rate: fixed integer overflow in limit calculation (ticket #256).
Valentin Bartenev <vbart@nginx.com>
parents: 4833
diff changeset
266 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
267 - (c->sent - r->limit_rate_after);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
268
1194
8ea6caa62c89 style fix: change variable name
Igor Sysoev <igor@sysoev.ru>
parents: 1179
diff changeset
269 if (limit <= 0) {
635
18268abd340c nginx-0.3.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
270 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
271 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
272 ngx_add_timer(c->write, delay);
635
18268abd340c nginx-0.3.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
273
18268abd340c nginx-0.3.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
274 c->buffered |= NGX_HTTP_WRITE_BUFFERED;
18268abd340c nginx-0.3.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
275
18268abd340c nginx-0.3.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
276 return NGX_AGAIN;
18268abd340c nginx-0.3.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
277 }
18268abd340c nginx-0.3.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
278
4384
a8b6d5dee539 Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4383
diff changeset
279 if (clcf->sendfile_max_chunk
a8b6d5dee539 Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4383
diff changeset
280 && (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
281 {
a8b6d5dee539 Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4383
diff changeset
282 limit = clcf->sendfile_max_chunk;
a8b6d5dee539 Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4383
diff changeset
283 }
1197
493a227edfd5 sendfile_max_chunk
Igor Sysoev <igor@sysoev.ru>
parents: 1194
diff changeset
284
635
18268abd340c nginx-0.3.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
285 } else {
4384
a8b6d5dee539 Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4383
diff changeset
286 limit = clcf->sendfile_max_chunk;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
287 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
288
396
6f3b20c1ac50 nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 395
diff changeset
289 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
290
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
291 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
292 "http write filter limit %O", limit);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
293
1194
8ea6caa62c89 style fix: change variable name
Igor Sysoev <igor@sysoev.ru>
parents: 1179
diff changeset
294 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
295
396
6f3b20c1ac50 nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 395
diff changeset
296 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
297 "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
298
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
299 if (chain == NGX_CHAIN_ERROR) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
300 c->error = 1;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
301 return NGX_ERROR;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
302 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
303
1197
493a227edfd5 sendfile_max_chunk
Igor Sysoev <igor@sysoev.ru>
parents: 1194
diff changeset
304 if (r->limit_rate) {
2907
4f5753877376 limit_rate_after
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
305
4f5753877376 limit_rate_after
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
306 nsent = c->sent;
4f5753877376 limit_rate_after
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
307
5201
06fbbde04098 Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4961
diff changeset
308 if (r->limit_rate_after) {
2907
4f5753877376 limit_rate_after
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
309
5201
06fbbde04098 Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4961
diff changeset
310 sent -= r->limit_rate_after;
2907
4f5753877376 limit_rate_after
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
311 if (sent < 0) {
4f5753877376 limit_rate_after
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
312 sent = 0;
4f5753877376 limit_rate_after
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
313 }
4f5753877376 limit_rate_after
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
314
5201
06fbbde04098 Added r->limit_rate_after.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4961
diff changeset
315 nsent -= r->limit_rate_after;
2907
4f5753877376 limit_rate_after
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
316 if (nsent < 0) {
4f5753877376 limit_rate_after
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
317 nsent = 0;
4f5753877376 limit_rate_after
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
318 }
4f5753877376 limit_rate_after
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
319 }
4f5753877376 limit_rate_after
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
320
4383
5130c16a130e Fixed throughput problems with large limit_rate.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2907
diff changeset
321 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
322
6a8a066adc98 improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents: 1412
diff changeset
323 if (delay > 0) {
4384
a8b6d5dee539 Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4383
diff changeset
324 limit = 0;
1657
6a8a066adc98 improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents: 1412
diff changeset
325 c->write->delayed = 1;
6a8a066adc98 improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents: 1412
diff changeset
326 ngx_add_timer(c->write, delay);
6a8a066adc98 improve throughput with large limit_rate
Igor Sysoev <igor@sysoev.ru>
parents: 1412
diff changeset
327 }
4384
a8b6d5dee539 Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4383
diff changeset
328 }
1197
493a227edfd5 sendfile_max_chunk
Igor Sysoev <igor@sysoev.ru>
parents: 1194
diff changeset
329
4384
a8b6d5dee539 Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4383
diff changeset
330 if (limit
a8b6d5dee539 Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4383
diff changeset
331 && c->write->ready
a8b6d5dee539 Fixed interaction of limit_rate and sendfile_max_chunk.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4383
diff changeset
332 && 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
333 {
1197
493a227edfd5 sendfile_max_chunk
Igor Sysoev <igor@sysoev.ru>
parents: 1194
diff changeset
334 c->write->delayed = 1;
493a227edfd5 sendfile_max_chunk
Igor Sysoev <igor@sysoev.ru>
parents: 1194
diff changeset
335 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
336 }
361
446782c909b3 nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents: 356
diff changeset
337
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
338 for (cl = r->out; cl && cl != chain; /* void */) {
507
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
339 ln = cl;
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
340 cl = cl->next;
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
341 ngx_free_chain(r->pool, ln);
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
342 }
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
343
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
344 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
345
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
346 if (chain) {
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
347 c->buffered |= NGX_HTTP_WRITE_BUFFERED;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
348 return NGX_AGAIN;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
349 }
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
350
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
351 c->buffered &= ~NGX_HTTP_WRITE_BUFFERED;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
352
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
353 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
354 return NGX_AGAIN;
f8f0f1834266 nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents: 394
diff changeset
355 }
f8f0f1834266 nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents: 394
diff changeset
356
399
4e21d1291a14 nginx-0.0.7-2004-07-25-22:34:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
357 return NGX_OK;
1
d220029ac7f3 nginx-0.0.1-2002-08-15-21:20:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
358 }
9
6f58641241bb nginx-0.0.1-2002-09-07-14:14:25 import
Igor Sysoev <igor@sysoev.ru>
parents: 8
diff changeset
359
6f58641241bb nginx-0.0.1-2002-09-07-14:14:25 import
Igor Sysoev <igor@sysoev.ru>
parents: 8
diff changeset
360
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
361 static ngx_int_t
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
362 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
363 {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
364 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
365
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
366 return NGX_OK;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
367 }