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 }