changeset 963:78e70dae89f0

move ranges array to ngx_http_range_filter_ctx_t
author Igor Sysoev <igor@sysoev.ru>
date Fri, 29 Dec 2006 08:02:31 +0000
parents 69754fb59ba1
children b608d553e1e7
files src/http/modules/ngx_http_range_filter_module.c src/http/ngx_http_request.h
diffstat 2 files changed, 32 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/src/http/modules/ngx_http_range_filter_module.c
+++ b/src/http/modules/ngx_http_range_filter_module.c
@@ -45,8 +45,16 @@
 
 
 typedef struct {
-    off_t      offset;
-    ngx_str_t  boundary_header;
+    off_t        start;
+    off_t        end;
+    ngx_str_t    content_range;
+} ngx_http_range_t;
+
+
+typedef struct {
+    off_t        offset;
+    ngx_str_t    boundary_header;
+    ngx_array_t  ranges;
 } ngx_http_range_filter_ctx_t;
 
 
@@ -160,8 +168,12 @@ ngx_http_range_header_filter(ngx_http_re
         return ngx_http_next_header_filter(r);
     }
 
-    if (ngx_array_init(&r->headers_out.ranges, r->pool, 2,
-                       sizeof(ngx_http_range_t))
+    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_range_filter_ctx_t));
+    if (ctx == NULL) {
+        return NGX_ERROR;
+    }
+
+    if (ngx_array_init(&ctx->ranges, r->pool, 1, sizeof(ngx_http_range_t))
         == NGX_ERROR)
     {
         return NGX_ERROR;
@@ -203,7 +215,7 @@ ngx_http_range_header_filter(ngx_http_re
             while (*p == ' ') { p++; }
 
             if (*p == ',' || *p == '\0') {
-                range = ngx_array_push(&r->headers_out.ranges);
+                range = ngx_array_push(&ctx->ranges);
                 if (range == NULL) {
                     return NGX_ERROR;
                 }
@@ -249,7 +261,7 @@ ngx_http_range_header_filter(ngx_http_re
             break;
         }
 
-        range = ngx_array_push(&r->headers_out.ranges);
+        range = ngx_array_push(&ctx->ranges);
         if (range == NULL) {
             return NGX_ERROR;
         }
@@ -277,7 +289,6 @@ ngx_http_range_header_filter(ngx_http_re
         /* rc == NGX_HTTP_RANGE_NOT_SATISFIABLE */
 
         r->headers_out.status = rc;
-        r->headers_out.ranges.nelts = 0;
 
         content_range = ngx_list_push(&r->headers_out.headers);
         if (content_range == NULL) {
@@ -306,18 +317,11 @@ ngx_http_range_header_filter(ngx_http_re
         return rc;
     }
 
-
-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_range_filter_ctx_t));
-    if (ctx == NULL) {
-        return NGX_ERROR;
-    }
-
     ngx_http_set_ctx(r, ctx, ngx_http_range_body_filter_module);
 
-
     r->headers_out.status = NGX_HTTP_PARTIAL_CONTENT;
 
-    if (r->headers_out.ranges.nelts == 1) {
+    if (ctx->ranges.nelts == 1) {
 
         content_range = ngx_list_push(&r->headers_out.headers);
         if (content_range == NULL) {
@@ -425,8 +429,8 @@ ngx_http_range_header_filter(ngx_http_re
 
     len = sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN + sizeof("--" CRLF) - 1;
 
-    range = r->headers_out.ranges.elts;
-    for (i = 0; i < r->headers_out.ranges.nelts; i++) {
+    range = ctx->ranges.elts;
+    for (i = 0; i < ctx->ranges.nelts; i++) {
 
         /* the size of the range: "SSSS-EEEE/TTTT" CRLF CRLF */
 
@@ -468,7 +472,13 @@ ngx_http_range_body_filter(ngx_http_requ
     ngx_http_range_t             *range;
     ngx_http_range_filter_ctx_t  *ctx;
 
-    if (in == NULL || r->headers_out.ranges.nelts == 0) {
+    if (in == NULL) {
+        return ngx_http_next_body_filter(r, in);
+    }
+
+    ctx = ngx_http_get_module_ctx(r, ngx_http_range_body_filter_module);
+
+    if (ctx == NULL) {
         return ngx_http_next_body_filter(r, in);
     }
 
@@ -478,12 +488,11 @@ ngx_http_range_body_filter(ngx_http_requ
         return ngx_http_next_body_filter(r, in);
     }
 
-    ctx = ngx_http_get_module_ctx(r, ngx_http_range_body_filter_module);
     if (ctx->offset) {
         goto overlapped;
     }
 
-    range = r->headers_out.ranges.elts;
+    range = ctx->ranges.elts;
 
     if (!buf->last_buf) {
 
@@ -496,7 +505,7 @@ ngx_http_range_body_filter(ngx_http_requ
             last = buf->last - buf->start + ctx->offset;
         }
 
-        for (i = 0; i < r->headers_out.ranges.nelts; i++) {
+        for (i = 0; i < ctx->ranges.nelts; i++) {
             if (start > range[i].start || last < range[i].end) {
                  goto overlapped;
             }
@@ -510,7 +519,7 @@ ngx_http_range_body_filter(ngx_http_requ
 
     ctx->offset = ngx_buf_size(buf);
 
-    if (r->headers_out.ranges.nelts == 1) {
+    if (ctx->ranges.nelts == 1) {
 
         if (buf->in_file) {
             buf->file_pos = range->start;
@@ -527,7 +536,7 @@ ngx_http_range_body_filter(ngx_http_requ
 
     ll = &out;
 
-    for (i = 0; i < r->headers_out.ranges.nelts; i++) {
+    for (i = 0; i < ctx->ranges.nelts; i++) {
 
         /*
          * The boundary header of the range:
--- a/src/http/ngx_http_request.h
+++ b/src/http/ngx_http_request.h
@@ -215,13 +215,6 @@ typedef struct {
 
 
 typedef struct {
-    off_t                             start;
-    off_t                             end;
-    ngx_str_t                         content_range;
-} ngx_http_range_t;
-
-
-typedef struct {
     ngx_list_t                        headers;
 
     ngx_uint_t                        status;
@@ -245,7 +238,6 @@ typedef struct {
     ngx_str_t                         content_type;
     ngx_str_t                         charset;
 
-    ngx_array_t                       ranges;
     ngx_array_t                       cache_control;
 
     off_t                             content_length_n;