Mercurial > hg > nginx-quic
comparison src/http/modules/ngx_http_chunked_filter.c @ 155:46eb23d9471d
nginx-0.0.1-2003-10-22-20:38:26 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 22 Oct 2003 16:38:26 +0000 |
parents | c71aeb75c071 |
children | 4db54fdbcbe7 |
comparison
equal
deleted
inserted
replaced
154:eac26585476e | 155:46eb23d9471d |
---|---|
27 ngx_http_chunked_filter_init, /* init module */ | 27 ngx_http_chunked_filter_init, /* init module */ |
28 NULL /* init child */ | 28 NULL /* init child */ |
29 }; | 29 }; |
30 | 30 |
31 | 31 |
32 static int (*next_header_filter) (ngx_http_request_t *r); | 32 static ngx_http_output_header_filter_pt ngx_http_next_header_filter; |
33 static int (*next_body_filter) (ngx_http_request_t *r, ngx_chain_t *ch); | 33 static ngx_http_output_body_filter_pt ngx_http_next_body_filter; |
34 | 34 |
35 | 35 |
36 static int ngx_http_chunked_header_filter(ngx_http_request_t *r) | 36 static int ngx_http_chunked_header_filter(ngx_http_request_t *r) |
37 { | 37 { |
38 if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED) { | 38 if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED) { |
39 return next_header_filter(r); | 39 return ngx_http_next_header_filter(r); |
40 } | 40 } |
41 | 41 |
42 if (r->headers_out.content_length_n == -1) { | 42 if (r->headers_out.content_length_n == -1) { |
43 if (r->http_version < NGX_HTTP_VERSION_11) { | 43 if (r->http_version < NGX_HTTP_VERSION_11) { |
44 r->keepalive = 0; | 44 r->keepalive = 0; |
46 } else { | 46 } else { |
47 r->chunked = 1; | 47 r->chunked = 1; |
48 } | 48 } |
49 } | 49 } |
50 | 50 |
51 return next_header_filter(r); | 51 return ngx_http_next_header_filter(r); |
52 } | 52 } |
53 | 53 |
54 | 54 |
55 static int ngx_http_chunked_body_filter(ngx_http_request_t *r, ngx_chain_t *in) | 55 static int ngx_http_chunked_body_filter(ngx_http_request_t *r, ngx_chain_t *in) |
56 { | 56 { |
57 char *chunk; | 57 char *chunk; |
58 size_t size, len; | 58 size_t size, len; |
59 ngx_hunk_t *h; | 59 ngx_hunk_t *h; |
60 ngx_chain_t *out, *ce, *te, **le; | 60 ngx_chain_t *out, *cl, *tl, **ll; |
61 | 61 |
62 if (in == NULL || !r->chunked) { | 62 if (in == NULL || !r->chunked) { |
63 return next_body_filter(r, in); | 63 return ngx_http_next_body_filter(r, in); |
64 } | 64 } |
65 | 65 |
66 ngx_test_null(out, ngx_alloc_chain_entry(r->pool), NGX_ERROR); | 66 ngx_test_null(out, ngx_alloc_chain_link(r->pool), NGX_ERROR); |
67 le = &out->next; | 67 ll = &out->next; |
68 | 68 |
69 size = 0; | 69 size = 0; |
70 ce = in; | 70 cl = in; |
71 | 71 |
72 for ( ;; ) { | 72 for ( ;; ) { |
73 size += ngx_hunk_size(cl->hunk); | |
73 | 74 |
74 if (ce->hunk->type & NGX_HUNK_IN_MEMORY) { | 75 ngx_test_null(tl, ngx_alloc_chain_link(r->pool), NGX_ERROR); |
75 size += ce->hunk->last - ce->hunk->pos; | 76 tl->hunk = cl->hunk; |
76 } else { | 77 *ll = tl; |
77 size += (size_t) (ce->hunk->file_last - ce->hunk->file_pos); | 78 ll = &tl->next; |
78 } | |
79 | 79 |
80 ngx_test_null(te, ngx_alloc_chain_entry(r->pool), NGX_ERROR); | 80 if (cl->next == NULL) { |
81 te->hunk = ce->hunk; | |
82 *le = te; | |
83 le = &te->next; | |
84 | |
85 if (ce->next == NULL) { | |
86 break; | 81 break; |
87 } | 82 } |
88 | 83 |
89 ce = ce->next; | 84 cl = cl->next; |
90 } | 85 } |
91 | 86 |
92 ngx_test_null(chunk, ngx_palloc(r->pool, 11), NGX_ERROR); | 87 ngx_test_null(chunk, ngx_palloc(r->pool, 11), NGX_ERROR); |
93 len = ngx_snprintf(chunk, 11, SIZEX_FMT CRLF, size); | 88 len = ngx_snprintf(chunk, 11, SIZEX_FMT CRLF, size); |
94 | 89 |
99 | 94 |
100 out->hunk = h; | 95 out->hunk = h; |
101 | 96 |
102 ngx_test_null(h, ngx_calloc_hunk(r->pool), NGX_ERROR); | 97 ngx_test_null(h, ngx_calloc_hunk(r->pool), NGX_ERROR); |
103 | 98 |
104 if (ce->hunk->type & NGX_HUNK_LAST) { | 99 if (cl->hunk->type & NGX_HUNK_LAST) { |
105 ce->hunk->type &= ~NGX_HUNK_LAST; | 100 cl->hunk->type &= ~NGX_HUNK_LAST; |
106 h->type = NGX_HUNK_IN_MEMORY|NGX_HUNK_MEMORY|NGX_HUNK_LAST; | 101 h->type = NGX_HUNK_IN_MEMORY|NGX_HUNK_MEMORY|NGX_HUNK_LAST; |
107 h->pos = CRLF "0" CRLF CRLF; | 102 h->pos = CRLF "0" CRLF CRLF; |
108 h->last = h->pos + 7; | 103 h->last = h->pos + 7; |
109 | 104 |
110 } else { | 105 } else { |
111 h->type = NGX_HUNK_IN_MEMORY|NGX_HUNK_MEMORY; | 106 h->type = NGX_HUNK_IN_MEMORY|NGX_HUNK_MEMORY; |
112 h->pos = CRLF; | 107 h->pos = CRLF; |
113 h->last = h->pos + 2; | 108 h->last = h->pos + 2; |
114 } | 109 } |
115 | 110 |
116 ngx_test_null(te, ngx_alloc_chain_entry(r->pool), NGX_ERROR); | 111 ngx_alloc_link_and_set_hunk(tl, h, r->pool, NGX_ERROR); |
117 te->hunk = h; | 112 *ll = tl; |
118 te->next = NULL; | |
119 *le = te; | |
120 | 113 |
121 return next_body_filter(r, out); | 114 return ngx_http_next_body_filter(r, out); |
122 } | 115 } |
123 | 116 |
124 | 117 |
125 static int ngx_http_chunked_filter_init(ngx_cycle_t *cycle) | 118 static int ngx_http_chunked_filter_init(ngx_cycle_t *cycle) |
126 { | 119 { |
127 next_header_filter = ngx_http_top_header_filter; | 120 ngx_http_next_header_filter = ngx_http_top_header_filter; |
128 ngx_http_top_header_filter = ngx_http_chunked_header_filter; | 121 ngx_http_top_header_filter = ngx_http_chunked_header_filter; |
129 | 122 |
130 next_body_filter = ngx_http_top_body_filter; | 123 ngx_http_next_body_filter = ngx_http_top_body_filter; |
131 ngx_http_top_body_filter = ngx_http_chunked_body_filter; | 124 ngx_http_top_body_filter = ngx_http_chunked_body_filter; |
132 | 125 |
133 return NGX_OK; | 126 return NGX_OK; |
134 } | 127 } |