Mercurial > hg > nginx
comparison src/http/modules/ngx_http_range_filter.c @ 153:c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 21 Oct 2003 16:49:56 +0000 |
parents | da00cde00e8a |
children | 46eb23d9471d |
comparison
equal
deleted
inserted
replaced
152:fb48bf4fea1c | 153:c71aeb75c071 |
---|---|
47 ngx_http_range_filter_ctx_t *ctx; | 47 ngx_http_range_filter_ctx_t *ctx; |
48 | 48 |
49 if (r->main | 49 if (r->main |
50 || r->http_version < NGX_HTTP_VERSION_10 | 50 || r->http_version < NGX_HTTP_VERSION_10 |
51 || r->headers_out.status != NGX_HTTP_OK | 51 || r->headers_out.status != NGX_HTTP_OK |
52 || r->headers_out.content_length == -1 | 52 || r->headers_out.content_length_n == -1 |
53 /* STUB: we currently support ranges for file hunks only */ | 53 /* STUB: we currently support ranges for file hunks only */ |
54 || r->filter & NGX_HTTP_FILTER_NEED_IN_MEMORY) | 54 || r->filter & NGX_HTTP_FILTER_NEED_IN_MEMORY) |
55 { | 55 { |
56 return next_header_filter(r); | 56 return next_header_filter(r); |
57 } | 57 } |
101 if (*p++ != '-') { | 101 if (*p++ != '-') { |
102 rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; | 102 rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; |
103 break; | 103 break; |
104 } | 104 } |
105 | 105 |
106 if (start >= r->headers_out.content_length) { | 106 if (start >= r->headers_out.content_length_n) { |
107 rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; | 107 rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; |
108 break; | 108 break; |
109 } | 109 } |
110 | 110 |
111 while (*p == ' ') { p++; } | 111 while (*p == ' ') { p++; } |
112 | 112 |
113 if (*p == ',' || *p == '\0') { | 113 if (*p == ',' || *p == '\0') { |
114 ngx_test_null(range, ngx_push_array(&r->headers_out.ranges), | 114 ngx_test_null(range, ngx_push_array(&r->headers_out.ranges), |
115 NGX_ERROR); | 115 NGX_ERROR); |
116 range->start = start; | 116 range->start = start; |
117 range->end = r->headers_out.content_length; | 117 range->end = r->headers_out.content_length_n; |
118 | 118 |
119 if (*p++ == ',') { | 119 if (*p++ == ',') { |
120 continue; | 120 continue; |
121 } | 121 } |
122 | 122 |
137 if (*p != ',' && *p != '\0') { | 137 if (*p != ',' && *p != '\0') { |
138 rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; | 138 rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; |
139 break; | 139 break; |
140 } | 140 } |
141 | 141 |
142 if (end >= r->headers_out.content_length || start >= end) { | 142 if (end >= r->headers_out.content_length_n || start >= end) { |
143 rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; | 143 rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; |
144 break; | 144 break; |
145 } | 145 } |
146 | 146 |
147 ngx_test_null(range, ngx_push_array(&r->headers_out.ranges), NGX_ERROR); | 147 ngx_test_null(range, ngx_push_array(&r->headers_out.ranges), NGX_ERROR); |
168 NGX_ERROR); | 168 NGX_ERROR); |
169 | 169 |
170 r->headers_out.content_range->value.len = | 170 r->headers_out.content_range->value.len = |
171 ngx_snprintf(r->headers_out.content_range->value.data, | 171 ngx_snprintf(r->headers_out.content_range->value.data, |
172 8 + 20 + 1, "bytes */" OFF_FMT, | 172 8 + 20 + 1, "bytes */" OFF_FMT, |
173 r->headers_out.content_length); | 173 r->headers_out.content_length_n); |
174 | 174 |
175 r->headers_out.content_length = -1; | 175 r->headers_out.content_length_n = -1; |
176 r->headers_out.content_length = NULL; | |
176 | 177 |
177 return rc; | 178 return rc; |
178 | 179 |
179 } else { | 180 } else { |
180 r->headers_out.status = NGX_HTTP_PARTIAL_CONTENT; | 181 r->headers_out.status = NGX_HTTP_PARTIAL_CONTENT; |
191 r->headers_out.content_range->value.len = | 192 r->headers_out.content_range->value.len = |
192 ngx_snprintf(r->headers_out.content_range->value.data, | 193 ngx_snprintf(r->headers_out.content_range->value.data, |
193 6 + 20 + 1 + 20 + 1 + 20 + 1, | 194 6 + 20 + 1 + 20 + 1 + 20 + 1, |
194 "bytes " OFF_FMT "-" OFF_FMT "/" OFF_FMT, | 195 "bytes " OFF_FMT "-" OFF_FMT "/" OFF_FMT, |
195 range->start, range->end - 1, | 196 range->start, range->end - 1, |
196 r->headers_out.content_length); | 197 r->headers_out.content_length_n); |
197 | 198 |
198 r->headers_out.content_length = range->end - range->start; | 199 r->headers_out.content_length_n = range->end - range->start; |
199 | 200 |
200 } else { | 201 } else { |
201 | 202 |
202 #if 0 | 203 #if 0 |
203 /* TODO: what if no content_type ?? */ | 204 /* TODO: what if no content_type ?? */ |
265 range[i].content_range.len = | 266 range[i].content_range.len = |
266 ngx_snprintf(range[i].content_range.data, | 267 ngx_snprintf(range[i].content_range.data, |
267 20 + 1 + 20 + 1 + 20 + 5, | 268 20 + 1 + 20 + 1 + 20 + 5, |
268 OFF_FMT "-" OFF_FMT "/" OFF_FMT CRLF CRLF, | 269 OFF_FMT "-" OFF_FMT "/" OFF_FMT CRLF CRLF, |
269 range[i].start, range[i].end - 1, | 270 range[i].start, range[i].end - 1, |
270 r->headers_out.content_length); | 271 r->headers_out.content_length_n); |
271 | 272 |
272 len += ctx->boundary_header.len + range[i].content_range.len | 273 len += ctx->boundary_header.len + range[i].content_range.len |
273 + (size_t) (range[i].end - range[i].start); | 274 + (size_t) (range[i].end - range[i].start); |
274 } | 275 } |
275 | 276 |
276 r->headers_out.content_length = len; | 277 r->headers_out.content_length_n = len; |
278 r->headers_out.content_length = NULL; | |
277 } | 279 } |
278 } | 280 } |
279 | 281 |
280 return next_header_filter(r); | 282 return next_header_filter(r); |
281 } | 283 } |