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 }