diff options
author | Igor Sysoev <igor@sysoev.ru> | 2004-01-16 21:29:15 +0300 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2004-01-16 21:29:15 +0300 |
commit | f20c05fd26bcbac28c63faf75f738cbc1ddf5861 (patch) | |
tree | c1920d49f25fac738aec8c34da494b55ba8587e2 | |
parent | c599198d83f3572592ff8657948c8c4b272e8e79 (diff) |
nginx-0.0.1-2004-01-16-21:29:15 import
-rw-r--r-- | src/core/nginx.c | 57 | ||||
-rw-r--r-- | src/http/modules/ngx_http_range_filter.c | 83 |
2 files changed, 85 insertions, 55 deletions
diff --git a/src/core/nginx.c b/src/core/nginx.c index e9cae283e..851a0a2e6 100644 --- 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_cycle_t *cycle, ngx_master_ctx_t *ctx) 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_cycle_t *cycle, ngx_master_ctx_t *ctx) 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,31 +417,14 @@ static void ngx_master_process_cycle(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx) } if (!live) { - if (ngx_terminate || ngx_quit) { - - 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); - - } else { - sent = 0; - } + sent = 0; } } + if (!live && (ngx_terminate || ngx_quit)) { + ngx_master_exit(cycle, ctx); + } + if (ngx_terminate) { if (delay > 10000) { signo = SIGKILL; @@ -530,7 +516,6 @@ static void ngx_master_process_cycle(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx) /* STUB */ if (ngx_reopen) { - ngx_reopen = 0; break; } @@ -539,7 +524,10 @@ static void ngx_master_process_cycle(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx) } } - 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_cycle_t *cycle, ngx_master_ctx_t *ctx) } +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; diff --git a/src/http/modules/ngx_http_range_filter.c b/src/http/modules/ngx_http_range_filter.c index bf28fe123..676a9780f 100644 --- 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 ngx_http_next_body_filter; 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(ngx_http_request_t *r) p = r->headers_in.range->value.data + 6; for ( ;; ) { - start = end = 0; + start = 0; + end = 0; + suffix = 0; while (*p == ' ') { p++; } - if (*p < '0' || *p > '9') { - rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; - break; - } + if (*p != '-') { + if (*p < '0' || *p > '9') { + rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; + break; + } - while (*p >= '0' && *p <= '9') { - start = start * 10 + *p++ - '0'; - } + while (*p >= '0' && *p <= '9') { + start = start * 10 + *p++ - '0'; + } - while (*p == ' ') { p++; } + while (*p == ' ') { p++; } - if (*p++ != '-') { - rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; - break; - } + if (*p++ != '-') { + rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; + break; + } - if (start >= r->headers_out.content_length_n) { - rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; - break; - } + if (start >= r->headers_out.content_length_n) { + rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; + break; + } - while (*p == ' ') { p++; } + 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++ != ',') { + break; + } - if (*p++ == ',') { continue; } - break; + } else { + suffix = 1; + p++; } if (*p < '0' || *p > '9') { @@ -177,20 +185,33 @@ static int ngx_http_range_header_filter(ngx_http_request_t *r) 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) { |