nginx-0.0.1-2003-11-28-20:41:47 import
diff --git a/src/http/modules/ngx_http_static_handler.c b/src/http/modules/ngx_http_static_handler.c
index 651f6d7..1be2697 100644
--- a/src/http/modules/ngx_http_static_handler.c
+++ b/src/http/modules/ngx_http_static_handler.c
@@ -41,9 +41,10 @@
ngx_int_t ngx_http_static_translate_handler(ngx_http_request_t *r)
{
- ngx_int_t rc, level;
+ char *location, *last, *path;
uint32_t crc;
- char *location, *last;
+ ngx_int_t rc, level;
+ ngx_str_t name;
ngx_err_t err;
ngx_http_cache_t *cache;
ngx_http_cache_conf_t *ccf;
@@ -55,62 +56,67 @@
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
+
if (r->uri.data[r->uri.len - 1] == '/') {
- if (r->path.data == NULL) {
- ngx_test_null(r->path.data,
- ngx_palloc(r->pool,
- clcf->doc_root.len + r->uri.len),
- NGX_HTTP_INTERNAL_SERVER_ERROR);
- ngx_cpystrn(ngx_cpymem(r->path.data, clcf->doc_root.data,
- clcf->doc_root.len),
- r->uri.data, r->uri.len + 1);
+ /* there is no index handler */
- } else {
- r->path.data[r->path.len] = '\0';
+ if (!(path = ngx_palloc(r->pool, clcf->doc_root.len + r->uri.len))) {
+ return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
+ ngx_cpystrn(ngx_cpymem(path, clcf->doc_root.data, clcf->doc_root.len),
+ r->uri.data, r->uri.len + 1);
+
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
- "directory index of \"%s\" is forbidden", r->path.data);
+ "directory index of \"%s\" is forbidden", path);
return NGX_HTTP_FORBIDDEN;
}
- /* "+ 2" is for trailing '/' in possible redirect and '\0' */
- ngx_test_null(r->file.name.data,
+
+ /* "+ 2" is for a trailing '/' in a possible redirect and '\0' */
+ ngx_test_null(name.data,
ngx_palloc(r->pool, clcf->doc_root.len + r->uri.len + 2),
NGX_HTTP_INTERNAL_SERVER_ERROR);
- location = ngx_cpymem(r->file.name.data, clcf->doc_root.data,
- clcf->doc_root.len),
-
+ location = ngx_cpymem(name.data, clcf->doc_root.data, clcf->doc_root.len);
last = ngx_cpystrn(location, r->uri.data, r->uri.len + 1);
-ngx_log_debug(r->connection->log, "HTTP filename: '%s'" _ r->file.name.data);
+ ngx_log_debug(r->connection->log, "HTTP filename: '%s'" _ data);
- ccf = ngx_http_get_module_loc_conf(r, ngx_http_cache_module);
- if (ccf->open_files) {
- cache = ngx_http_cache_get(ccf->open_files, &r->file.name, &crc);
+ if (r->cache == NULL) {
-ngx_log_debug(r->connection->log, "cache get: %x" _ cache);
+ /* look up an open files cache */
- if (cache
- && ((ngx_event_flags & NGX_HAVE_KQUEUE_EVENT)
- || ccf->open_files->update >= ngx_cached_time - cache->updated))
- {
- cache->refs++;
- r->file.fd = cache->fd;
- r->file.name = cache->key;
- r->content_handler = ngx_http_static_handler;
+ ccf = ngx_http_get_module_loc_conf(r, ngx_http_cache_module);
- return NGX_OK;
+ if (ccf->open_files) {
+ cache = ngx_http_cache_get(ccf->open_files, &name, &crc);
+
+ ngx_log_debug(r->connection->log, "cache get: %x" _ cache);
+
+ if (cache
+ && ((ngx_event_flags & NGX_HAVE_KQUEUE_EVENT)
+ || ccf->open_files->update
+ >= ngx_cached_time - cache->updated))
+ {
+ r->cache = cache;
+ r->content_handler = ngx_http_static_handler;
+
+ return NGX_OK;
+ }
+
+ } else {
+ cache = NULL;
}
} else {
- cache = NULL;
+ cache = r->cache;
}
+
#if (WIN9X)
if (ngx_win32_version < NGX_WIN_NT) {
@@ -121,10 +127,10 @@
* so we need to check its type before the opening
*/
- if (ngx_file_info(r->file.name.data, &r->file.info) == NGX_FILE_ERROR) {
+ if (ngx_file_info(name.data, &r->file.info) == NGX_FILE_ERROR) {
err = ngx_errno;
ngx_log_error(NGX_LOG_ERR, r->connection->log, err,
- ngx_file_info_n " \"%s\" failed", r->file.name.data);
+ ngx_file_info_n " \"%s\" failed", name.data);
if (err == NGX_ENOENT || err == NGX_ENOTDIR) {
return NGX_HTTP_NOT_FOUND;
@@ -138,7 +144,7 @@
}
if (ngx_is_dir(&r->file.info)) {
-ngx_log_debug(r->connection->log, "HTTP DIR: '%s'" _ r->file.name.data);
+ ngx_log_debug(r->connection->log, "HTTP DIR: '%s'" _ name.data);
if (!(r->headers_out.location =
ngx_http_add_header(&r->headers_out, ngx_http_headers_out)))
@@ -159,6 +165,7 @@
#endif
+
if (r->file.fd == NGX_INVALID_FILE) {
r->file.fd = ngx_open_file(r->file.name.data,
NGX_FILE_RDONLY, NGX_FILE_OPEN);
@@ -282,6 +289,7 @@
ngx_hunk_t *h;
ngx_chain_t out;
ngx_http_type_t *type;
+ ngx_http_cleanup_t *cleanup;
ngx_http_log_ctx_t *ctx;
ngx_http_core_loc_conf_t *clcf;
@@ -294,6 +302,10 @@
ctx = r->connection->log->data;
ctx->action = "sending response to client";
+ if (!(cleanup = ngx_push_array(&r->cleanup))) {
+ return NGX_HTTP_INTERNAL_SERVER_ERROR;
+ }
+
if (r->file.fd == NGX_INVALID_FILE) {
r->file.fd = ngx_open_file(r->file.name.data,
NGX_FILE_RDONLY, NGX_FILE_OPEN);
@@ -316,6 +328,10 @@
}
}
+ cleanup->data.file.fd = r->file.fd;
+ cleanup->data.file.name = r->file.name.data;
+ cleanup->cache = 0;
+
if (!r->file.info_valid) {
if (ngx_fd_info(r->file.fd, &r->file.info) == NGX_FILE_ERROR) {
ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
@@ -379,7 +395,6 @@
ngx_test_null(h->file, ngx_pcalloc(r->pool, sizeof(ngx_file_t)),
NGX_HTTP_INTERNAL_SERVER_ERROR);
-
rc = ngx_http_send_header(r);
if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {