Mercurial > hg > nginx-vendor-0-8
view src/core/ngx_garbage_collector.c @ 58:b55cbf18157e NGINX_0_1_29
nginx 0.1.29
*) Feature: the ngx_http_ssi_module supports "include virtual" command.
*) Feature: the ngx_http_ssi_module supports the condition command like
'if expr="$NAME"' and "else" and "endif" commands. Only one nested
level is supported.
*) Feature: the ngx_http_ssi_module supports the DATE_LOCAL and
DATE_GMT variables and "config timefmt" command.
*) Feature: the "ssi_ignore_recycled_buffers" directive.
*) Bugfix: the "echo" command did not show the default value for the
empty QUERY_STRING variable.
*) Change: the ngx_http_proxy_module was rewritten.
*) Feature: the "proxy_redirect", "proxy_pass_request_headers",
"proxy_pass_request_body", and "proxy_method" directives.
*) Feature: the "proxy_set_header" directive. The "proxy_x_var" was
canceled and must be replaced with the proxy_set_header directive.
*) Change: the "proxy_preserve_host" is canceled and must be replaced
with the "proxy_set_header Host $host" and the "proxy_redirect off"
directives, the "proxy_set_header Host $host:$proxy_port" directive
and the appropriate proxy_redirect directives.
*) Change: the "proxy_set_x_real_ip" is canceled and must be replaced
with the "proxy_set_header X-Real-IP $remote_addr" directive.
*) Change: the "proxy_add_x_forwarded_for" is canceled and must be
replaced with
the "proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for"
directive.
*) Change: the "proxy_set_x_url" is canceled and must be replaced with
the "proxy_set_header X-URL http://$host:$server_port$request_uri"
directive.
*) Feature: the "fastcgi_param" directive.
*) Change: the "fastcgi_root", "fastcgi_set_var" and "fastcgi_params"
directive are canceled and must be replaced with the fastcgi_param
directives.
*) Feature: the "index" directive can use the variables.
*) Feature: the "index" directive can be used at http and server levels.
*) Change: the last index only in the "index" directive can be absolute.
*) Feature: the "rewrite" directive can use the variables.
*) Feature: the "internal" directive.
*) Feature: the CONTENT_LENGTH, CONTENT_TYPE, REMOTE_PORT, SERVER_ADDR,
SERVER_PORT, SERVER_PROTOCOL, DOCUMENT_ROOT, SERVER_NAME,
REQUEST_METHOD, REQUEST_URI, and REMOTE_USER variables.
*) Change: nginx now passes the invalid lines in a client request
headers or a backend response header.
*) Bugfix: if the backend did not transfer response for a long time and
the "send_timeout" was less than "proxy_read_timeout", then nginx
returned the 408 response.
*) Bugfix: the segmentation fault was occurred if the backend sent an
invalid line in response header; bug appeared in 0.1.26.
*) Bugfix: the segmentation fault may occurred in FastCGI fault
tolerance configuration.
*) Bugfix: the "expires" directive did not remove the previous
"Expires" and "Cache-Control" headers.
*) Bugfix: nginx did not take into account trailing dot in "Host"
header line.
*) Bugfix: the ngx_http_auth_module did not work under Linux.
*) Bugfix: the rewrite directive worked incorrectly, if the arguments
were in a request.
*) Bugfix: nginx could not be built on MacOS X.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Thu, 12 May 2005 00:00:00 +0400 |
parents | 72eb30262aac |
children | 818201e5a553 |
line wrap: on
line source
/* * Copyright (C) Igor Sysoev */ #include <ngx_config.h> #include <ngx_core.h> #include <ngx_garbage_collector.h> ngx_int_t ngx_collect_garbage(ngx_gc_t *ctx, ngx_str_t *dname, ngx_int_t level) { int rc; u_char *last; size_t len; ngx_err_t err; ngx_str_t fname, buf; ngx_dir_t dir; buf.len = 0; #if (NGX_SUPPRESS_WARN) buf.data = NULL; fname.data = NULL; #endif ngx_log_debug2(NGX_LOG_DEBUG_CORE, ctx->log, 0, "gc dir \"%s\":%d", dname->data, dname->len); if (ngx_open_dir(dname, &dir) == NGX_ERROR) { ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno, ngx_open_dir_n " \"%s\" failed", dname->data); return NGX_ERROR; } for ( ;; ) { ngx_set_errno(0); if (ngx_read_dir(&dir) == NGX_ERROR) { err = ngx_errno; if (err != NGX_ENOMOREFILES) { ngx_log_error(NGX_LOG_CRIT, ctx->log, err, ngx_read_dir_n " \"%s\" failed", dname->data); rc = NGX_ERROR; } else { rc = NGX_OK; } break; } len = ngx_de_namelen(&dir); ngx_log_debug2(NGX_LOG_DEBUG_CORE, ctx->log, 0, "gc name \"%s\":%d", ngx_de_name(&dir), len); if (len == 1 && ngx_de_name(&dir)[0] == '.') { continue; } if (len == 2 && ngx_de_name(&dir)[0] == '.' && ngx_de_name(&dir)[1] == '.') { continue; } fname.len = dname->len + 1+ len; if (fname.len + NGX_DIR_MASK_LEN > buf.len) { if (buf.len) { ngx_free(buf.data); } buf.len = dname->len + 1 + len + NGX_DIR_MASK_LEN; buf.data = ngx_alloc(buf.len + 1, ctx->log); if (buf.data == NULL) { return NGX_ABORT; } } last = ngx_cpymem(buf.data, dname->data, dname->len); *last++ = '/'; ngx_memcpy(last, ngx_de_name(&dir), len + 1); fname.data = buf.data; ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0, "gc path: \"%s\"", fname.data); if (!dir.valid_info) { if (ngx_de_info(fname.data, &dir) == NGX_FILE_ERROR) { ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno, ngx_de_info_n " \"%s\" failed", fname.data); continue; } } if (ngx_de_is_dir(&dir)) { ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0, "gc enter dir \"%s\"", fname.data); if (level == -1 /* there can not be directory on the last level */ || level == NGX_MAX_PATH_LEVEL /* an directory from the old path hierarchy */ || len != ctx->path->level[level]) { if (ngx_collect_garbage(ctx, &fname, -1) == NGX_ABORT) { return NGX_ABORT; } fname.data[fname.len] = '\0'; ngx_log_error(NGX_LOG_NOTICE, ctx->log, 0, "delete old hierachy directory \"%s\"", fname.data); if (ngx_delete_dir(fname.data) == NGX_FILE_ERROR) { ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno, ngx_delete_dir_n " \"%s\" failed", fname.data); } else { ctx->deleted++; ctx->freed += ngx_de_size(&dir); } continue; } if (ngx_collect_garbage(ctx, &fname, level + 1) == NGX_ABORT) { return NGX_ABORT; } } else if (ngx_de_is_file(&dir)) { ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0, "gc file \"%s\"", fname.data); if (level == -1 || (level < NGX_MAX_PATH_LEVEL && ctx->path->level[level] != 0)) { if (ngx_delete_file(fname.data) == NGX_FILE_ERROR) { ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno, ngx_delete_file_n " \"%s\" failed", fname.data); } else { ctx->deleted++; ctx->freed += ngx_de_size(&dir); } continue; } if (ctx->handler(ctx, &fname, &dir) == NGX_ABORT) { return NGX_ABORT; } } else { ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno, "the file \"%s\" has unknown type, deleting", fname.data); if (ngx_delete_file(fname.data) == NGX_FILE_ERROR) { ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno, ngx_delete_file_n " \"%s\" failed", fname.data); } else { ctx->deleted++; ctx->freed += ngx_de_size(&dir); } } } if (buf.len) { ngx_free(buf.data); } if (ngx_close_dir(&dir) == NGX_ERROR) { ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno, ngx_close_dir_n " \"%s\" failed", fname.data); } return rc; } ngx_int_t ngx_garbage_collector_temp_handler(ngx_gc_t *ctx, ngx_str_t *name, ngx_dir_t *dir) { /* * We use mtime only and do not use atime because: * on NTFS access time has a resolution of 1 hour, * on NT FAT access time has a resolution of 1 day, * Unices have the mount option "noatime". */ if (ngx_time() - ngx_de_mtime(dir) < 3600) { return NGX_OK; } ngx_log_error(NGX_LOG_NOTICE, ctx->log, 0, "delete the stale temporary file \"%s\"", name->data); if (ngx_delete_file(name->data) == NGX_FILE_ERROR) { ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno, ngx_delete_file_n " \"%s\" failed", name->data); return NGX_ERROR; } ctx->deleted++; ctx->freed += ngx_de_size(dir); return NGX_OK; }