annotate src/http/modules/ngx_http_chunked_filter_module.c @ 4727:1c7616100797 stable-1.2

Merge of r4688, r4689, r4706: *) Mp4: fixed non-keyframe seeks in some cases (ticket #175). Number of entries in stsc atom was wrong if we've added an entry to split a chunk. Additionally, there is no need to add an entry if we are going to split last chunk in an entry, it's enough to update the entry we already have. Previously new entry was added and old one was left as is, resulting in incorrect entry with zero chunks which might confuse some software. *) Mp4: fixed streaming if moov atom is at buffer edge.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 02 Jul 2012 16:56:53 +0000
parents d620f497c50f
children 7fa7e60a7f66
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: 356
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: 356
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: 4128
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: 356
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: 356
diff changeset
6
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
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:
diff changeset
10 #include <ngx_http.h>
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
13 typedef struct {
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
14 ngx_chain_t *free;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
15 ngx_chain_t *busy;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
16 } ngx_http_chunked_filter_ctx_t;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
17
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
18
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
19 static ngx_int_t ngx_http_chunked_filter_init(ngx_conf_t *cf);
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22 static ngx_http_module_t ngx_http_chunked_filter_module_ctx = {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
23 NULL, /* preconfiguration */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
24 ngx_http_chunked_filter_init, /* postconfiguration */
177
4db54fdbcbe7 nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 155
diff changeset
25
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26 NULL, /* create main configuration */
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27 NULL, /* init main configuration */
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29 NULL, /* create server configuration */
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30 NULL, /* merge server configuration */
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 NULL, /* create location configuration */
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 615
diff changeset
33 NULL /* merge location configuration */
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 };
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37 ngx_module_t ngx_http_chunked_filter_module = {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
38 NGX_MODULE_V1,
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39 &ngx_http_chunked_filter_module_ctx, /* module context */
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40 NULL, /* module directives */
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41 NGX_HTTP_MODULE, /* module type */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
42 NULL, /* init master */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
43 NULL, /* init module */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
44 NULL, /* init process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
45 NULL, /* init thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
46 NULL, /* exit thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
47 NULL, /* exit process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
48 NULL, /* exit master */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
49 NGX_MODULE_V1_PADDING
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50 };
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52
155
46eb23d9471d nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 153
diff changeset
53 static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
46eb23d9471d nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 153
diff changeset
54 static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
57 static ngx_int_t
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
58 ngx_http_chunked_header_filter(ngx_http_request_t *r)
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 {
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
60 ngx_http_core_loc_conf_t *clcf;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
61 ngx_http_chunked_filter_ctx_t *ctx;
3484
81457372d938 chunked_transfer_encoding
Igor Sysoev <igor@sysoev.ru>
parents: 3411
diff changeset
62
615
5ef026a2ac74 nginx-0.3.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
63 if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED
5ef026a2ac74 nginx-0.3.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
64 || r->headers_out.status == NGX_HTTP_NO_CONTENT
3331
e0bc43a52382 backout r3325: postpone filter is a body only filter
Igor Sysoev <igor@sysoev.ru>
parents: 3324
diff changeset
65 || r != r->main
2270
e274c8e5d49c do not set "Transfer-Encoding: chunked" for HEAD requests
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
66 || (r->method & NGX_HTTP_HEAD))
615
5ef026a2ac74 nginx-0.3.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
67 {
155
46eb23d9471d nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 153
diff changeset
68 return ngx_http_next_header_filter(r);
135
e29909bd9b8a nginx-0.0.1-2003-09-28-23:29:06 import
Igor Sysoev <igor@sysoev.ru>
parents: 113
diff changeset
69 }
e29909bd9b8a nginx-0.0.1-2003-09-28-23:29:06 import
Igor Sysoev <igor@sysoev.ru>
parents: 113
diff changeset
70
153
c71aeb75c071 nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 135
diff changeset
71 if (r->headers_out.content_length_n == -1) {
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 if (r->http_version < NGX_HTTP_VERSION_11) {
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 r->keepalive = 0;
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 } else {
3484
81457372d938 chunked_transfer_encoding
Igor Sysoev <igor@sysoev.ru>
parents: 3411
diff changeset
76 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
81457372d938 chunked_transfer_encoding
Igor Sysoev <igor@sysoev.ru>
parents: 3411
diff changeset
77
81457372d938 chunked_transfer_encoding
Igor Sysoev <igor@sysoev.ru>
parents: 3411
diff changeset
78 if (clcf->chunked_transfer_encoding) {
81457372d938 chunked_transfer_encoding
Igor Sysoev <igor@sysoev.ru>
parents: 3411
diff changeset
79 r->chunked = 1;
81457372d938 chunked_transfer_encoding
Igor Sysoev <igor@sysoev.ru>
parents: 3411
diff changeset
80
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
81 ctx = ngx_pcalloc(r->pool,
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
82 sizeof(ngx_http_chunked_filter_ctx_t));
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
83 if (ctx == NULL) {
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
84 return NGX_ERROR;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
85 }
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
86
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
87 ngx_http_set_ctx(r, ctx, ngx_http_chunked_filter_module);
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
88
3484
81457372d938 chunked_transfer_encoding
Igor Sysoev <igor@sysoev.ru>
parents: 3411
diff changeset
89 } else {
81457372d938 chunked_transfer_encoding
Igor Sysoev <igor@sysoev.ru>
parents: 3411
diff changeset
90 r->keepalive = 0;
81457372d938 chunked_transfer_encoding
Igor Sysoev <igor@sysoev.ru>
parents: 3411
diff changeset
91 }
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 }
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93 }
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94
155
46eb23d9471d nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 153
diff changeset
95 return ngx_http_next_header_filter(r);
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 }
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
99 static ngx_int_t
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
100 ngx_http_chunked_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101 {
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
102 u_char *chunk;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
103 off_t size;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
104 ngx_int_t rc;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
105 ngx_buf_t *b;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
106 ngx_chain_t *out, *cl, *tl, **ll;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
107 ngx_http_chunked_filter_ctx_t *ctx;
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
109 if (in == NULL || !r->chunked || r->header_only) {
155
46eb23d9471d nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 153
diff changeset
110 return ngx_http_next_body_filter(r, in);
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 }
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
113 ctx = ngx_http_get_module_ctx(r, ngx_http_chunked_filter_module);
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
114
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
115 out = NULL;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
116 ll = &out;
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 size = 0;
155
46eb23d9471d nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 153
diff changeset
119 cl = in;
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121 for ( ;; ) {
336
ca9a7f8c86da nginx-0.0.3-2004-05-18-19:29:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
122 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
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: 337
diff changeset
123 "http chunk: %d", ngx_buf_size(cl->buf));
336
ca9a7f8c86da nginx-0.0.3-2004-05-18-19:29:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
124
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: 337
diff changeset
125 size += ngx_buf_size(cl->buf);
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
127 if (cl->buf->flush
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
128 || cl->buf->sync
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
129 || ngx_buf_in_memory(cl->buf)
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
130 || cl->buf->in_file)
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
131 {
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
132 tl = ngx_alloc_chain_link(r->pool);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
133 if (tl == NULL) {
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
134 return NGX_ERROR;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
135 }
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
136
452
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
137 tl->buf = cl->buf;
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
138 *ll = tl;
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
139 ll = &tl->next;
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
140 }
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141
155
46eb23d9471d nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 153
diff changeset
142 if (cl->next == NULL) {
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143 break;
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 }
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145
155
46eb23d9471d nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 153
diff changeset
146 cl = cl->next;
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147 }
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148
336
ca9a7f8c86da nginx-0.0.3-2004-05-18-19:29:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
149 if (size) {
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
150 tl = ngx_chain_get_free_buf(r->pool, &ctx->free);
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
151 if (tl == NULL) {
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
152 return NGX_ERROR;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
153 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
154
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
155 b = tl->buf;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
156 chunk = b->start;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
157
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
158 if (chunk == NULL) {
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
159 /* the "0000000000000000" is 64-bit hexadecimal string */
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
160
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
161 chunk = ngx_palloc(r->pool, sizeof("0000000000000000" CRLF) - 1);
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
162 if (chunk == NULL) {
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
163 return NGX_ERROR;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
164 }
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
165
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
166 b->start = chunk;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
167 b->end = chunk + sizeof("0000000000000000" CRLF) - 1;
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
168 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
169
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
170 b->tag = (ngx_buf_tag_t) &ngx_http_chunked_filter_module;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
171 b->memory = 0;
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
172 b->temporary = 1;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
173 b->pos = chunk;
473
8e8f3af115b5 nginx-0.1.11-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
174 b->last = ngx_sprintf(chunk, "%xO" CRLF, size);
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
175
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
176 tl->next = out;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
177 out = tl;
336
ca9a7f8c86da nginx-0.0.3-2004-05-18-19:29:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
178 }
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179
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: 337
diff changeset
180 if (cl->buf->last_buf) {
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
181 tl = ngx_chain_get_free_buf(r->pool, &ctx->free);
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
182 if (tl == NULL) {
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
183 return NGX_ERROR;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
184 }
4128
4b0b0e77dc3d Trailing space fix.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4114
diff changeset
185
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
186 b = tl->buf;
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
187
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
188 b->tag = (ngx_buf_tag_t) &ngx_http_chunked_filter_module;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
189 b->temporary = 0;
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: 337
diff changeset
190 b->memory = 1;
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: 337
diff changeset
191 b->last_buf = 1;
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: 337
diff changeset
192 b->pos = (u_char *) CRLF "0" CRLF CRLF;
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: 337
diff changeset
193 b->last = b->pos + 7;
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194
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: 337
diff changeset
195 cl->buf->last_buf = 0;
336
ca9a7f8c86da nginx-0.0.3-2004-05-18-19:29:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
196
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
197 *ll = tl;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
198
336
ca9a7f8c86da nginx-0.0.3-2004-05-18-19:29:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
199 if (size == 0) {
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: 337
diff changeset
200 b->pos += 2;
336
ca9a7f8c86da nginx-0.0.3-2004-05-18-19:29:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
201 }
ca9a7f8c86da nginx-0.0.3-2004-05-18-19:29:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
202
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
203 } else if (size > 0) {
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
204 tl = ngx_chain_get_free_buf(r->pool, &ctx->free);
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
205 if (tl == NULL) {
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
206 return NGX_ERROR;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
207 }
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 455
diff changeset
208
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
209 b = tl->buf;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
210
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
211 b->tag = (ngx_buf_tag_t) &ngx_http_chunked_filter_module;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
212 b->temporary = 0;
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: 337
diff changeset
213 b->memory = 1;
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: 337
diff changeset
214 b->pos = (u_char *) CRLF;
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: 337
diff changeset
215 b->last = b->pos + 2;
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
216
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
217 *ll = tl;
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
218
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
219 } else {
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
220 *ll = NULL;
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221 }
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
223 rc = ngx_http_next_body_filter(r, out);
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224
4114
5db098f97e0e API change: ngx_chain_update_chains() now requires pool.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4113
diff changeset
225 ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &out,
4113
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
226 (ngx_buf_tag_t) &ngx_http_chunked_filter_module);
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
227
a28ba1cdec27 Buffers reuse in chunked filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3484
diff changeset
228 return rc;
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229 }
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
232 static ngx_int_t
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
233 ngx_http_chunked_filter_init(ngx_conf_t *cf)
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234 {
155
46eb23d9471d nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 153
diff changeset
235 ngx_http_next_header_filter = ngx_http_top_header_filter;
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236 ngx_http_top_header_filter = ngx_http_chunked_header_filter;
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237
155
46eb23d9471d nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents: 153
diff changeset
238 ngx_http_next_body_filter = ngx_http_top_body_filter;
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239 ngx_http_top_body_filter = ngx_http_chunked_body_filter;
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241 return NGX_OK;
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242 }