changeset 231:92db0aa1e83f

nginx-0.0.1-2004-01-16-21:29:15 import
author Igor Sysoev <igor@sysoev.ru>
date Fri, 16 Jan 2004 18:29:15 +0000
parents 1119faf4635a
children 03c54b6d7a6f
files src/core/nginx.c src/http/modules/ngx_http_range_filter.c
diffstat 2 files changed, 88 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -22,6 +22,7 @@ typedef struct {
 
 
 static void ngx_master_process_cycle(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx);
+static void ngx_master_exit(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx);
 static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data);
 static ngx_int_t ngx_add_inherited_sockets(ngx_cycle_t *cycle, char **envp);
 static ngx_pid_t ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv);
@@ -266,6 +267,7 @@ static void ngx_master_process_cycle(ngx
     ngx_new_binary = 0;
     signo = 0;
     sent = 0;
+    live = 0;
 
     for ( ;; ) {
         ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "new cycle");
@@ -273,6 +275,7 @@ static void ngx_master_process_cycle(ngx
         if (ngx_process == NGX_PROCESS_MASTER) {
             ngx_spawn_process(cycle, ngx_worker_process_cycle, NULL,
                               "worker process", NGX_PROCESS_RESPAWN);
+            live = 1;
 
         } else {
             ngx_init_temp_number();
@@ -414,29 +417,12 @@ static void ngx_master_process_cycle(ngx
                     }
 
                     if (!live) {
-                        if (ngx_terminate || ngx_quit) {
-
-                            if (ngx_inherited && getppid() > 1) {
-                                name = ctx->pid.name.data;
-
-                            } else {
-                                name = ctx->name;
-                            }
+                        sent = 0;
+                    }
+                }
 
-                            if (ngx_delete_file(name) == NGX_FILE_ERROR) {
-                                ngx_log_error(NGX_LOG_ALERT, cycle->log,
-                                              ngx_errno,
-                                              ngx_delete_file_n
-                                              " \"%s\" failed", name);
-                            }
-
-                            ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exit");
-                            exit(0);
-
-                        } else {
-                            sent = 0;
-                        }
-                    }
+                if (!live && (ngx_terminate || ngx_quit)) {
+                    ngx_master_exit(cycle, ctx);
                 }
 
                 if (ngx_terminate) {
@@ -530,7 +516,6 @@ static void ngx_master_process_cycle(ngx
 
                 /* STUB */
                 if (ngx_reopen) {
-                    ngx_reopen = 0;
                     break;
                 }
 
@@ -539,7 +524,10 @@ static void ngx_master_process_cycle(ngx
                 }
             }
 
-            if (ngx_noaccept) {
+            if (ngx_reopen) {
+                ngx_reopen = 0;
+
+            } else if (ngx_noaccept) {
                 ngx_noaccept = 0;
 
             } else {
@@ -559,6 +547,27 @@ static void ngx_master_process_cycle(ngx
 }
 
 
+static void ngx_master_exit(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx)
+{
+    char  *name;
+
+    if (ngx_inherited && getppid() > 1) {
+        name = ctx->pid.name.data;
+
+    } else {
+        name = ctx->name;
+    }
+
+    if (ngx_delete_file(name) == NGX_FILE_ERROR) {
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+                      ngx_delete_file_n " \"%s\" failed", name);
+    }
+
+    ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exit");
+    exit(0);
+}
+
+
 static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
 {
     sigset_t          set;
--- a/src/http/modules/ngx_http_range_filter.c
+++ b/src/http/modules/ngx_http_range_filter.c
@@ -77,7 +77,7 @@ static ngx_http_output_body_filter_pt   
 
 static int ngx_http_range_header_filter(ngx_http_request_t *r)
 {
-    int                           rc, boundary, len, i;
+    ngx_int_t                     rc, boundary, suffix, len, i;
     char                         *p;
     off_t                         start, end;
     ngx_http_range_t             *range;
@@ -121,44 +121,52 @@ static int ngx_http_range_header_filter(
     p = r->headers_in.range->value.data + 6;
 
     for ( ;; ) {
-        start = end = 0;
-
-        while (*p == ' ') { p++; }
-
-        if (*p < '0' || *p > '9') {
-            rc = NGX_HTTP_RANGE_NOT_SATISFIABLE;
-            break;
-        }
-
-        while (*p >= '0' && *p <= '9') {
-            start = start * 10 + *p++ - '0';
-        }
+        start = 0;
+        end = 0;
+        suffix = 0;
 
         while (*p == ' ') { p++; }
 
-        if (*p++ != '-') {
-            rc = NGX_HTTP_RANGE_NOT_SATISFIABLE;
-            break;
-        }
+        if (*p != '-') {
+            if (*p < '0' || *p > '9') {
+                rc = NGX_HTTP_RANGE_NOT_SATISFIABLE;
+                break;
+            }
 
-        if (start >= r->headers_out.content_length_n) {
-            rc = NGX_HTTP_RANGE_NOT_SATISFIABLE;
-            break;
-        }
+            while (*p >= '0' && *p <= '9') {
+                start = start * 10 + *p++ - '0';
+            }
+
+            while (*p == ' ') { p++; }
+
+            if (*p++ != '-') {
+                rc = NGX_HTTP_RANGE_NOT_SATISFIABLE;
+                break;
+            }
 
-        while (*p == ' ') { p++; }
+            if (start >= r->headers_out.content_length_n) {
+                rc = NGX_HTTP_RANGE_NOT_SATISFIABLE;
+                break;
+            }
+
+            while (*p == ' ') { p++; }
 
-        if (*p == ',' || *p == '\0') {
-            ngx_test_null(range, ngx_push_array(&r->headers_out.ranges),
-                          NGX_ERROR);
-            range->start = start;
-            range->end = r->headers_out.content_length_n;
+            if (*p == ',' || *p == '\0') {
+                ngx_test_null(range, ngx_push_array(&r->headers_out.ranges),
+                              NGX_ERROR);
+                range->start = start;
+                range->end = r->headers_out.content_length_n;
 
-            if (*p++ == ',') {
+                if (*p++ != ',') {
+                    break;
+                }
+
                 continue;
             }
 
-            break;
+        } else {
+            suffix = 1;
+            p++;
         }
 
         if (*p < '0' || *p > '9') {
@@ -177,20 +185,33 @@ static int ngx_http_range_header_filter(
             break;
         }
 
-        if (end >= r->headers_out.content_length_n || start >= end) {
+        if (suffix) {
+           start = r->headers_out.content_length_n - end;
+           end = r->headers_out.content_length_n - 1;
+        }
+
+        if (start > end) {
             rc = NGX_HTTP_RANGE_NOT_SATISFIABLE;
             break;
         }
 
         ngx_test_null(range, ngx_push_array(&r->headers_out.ranges), NGX_ERROR);
         range->start = start;
-        range->end = end + 1;
 
-        if (*p++ == ',') {
-            continue;
+        if (end >= r->headers_out.content_length_n) {
+            /*
+             * Download Accelerator sends the last byte position
+             * that equals to the file length
+             */
+            range->end = r->headers_out.content_length_n;
+
+        } else {
+            range->end = end + 1;
         }
 
-        break;
+        if (*p++ != ',') {
+            break;
+        }
     }
 
     if (rc) {