diff src/http/ngx_http_cache.c @ 190:02a715e85df1

nginx-0.0.1-2003-11-19-00:34:08 import
author Igor Sysoev <igor@sysoev.ru>
date Tue, 18 Nov 2003 21:34:08 +0000
parents c966c09be66b
children 71ce40b3c37b
line wrap: on
line diff
--- a/src/http/ngx_http_cache.c
+++ b/src/http/ngx_http_cache.c
@@ -3,6 +3,7 @@
 #include <ngx_core.h>
 #include <ngx_http.h>
 
+
 #include <md5.h>
 
 #if (HAVE_OPENSSL_MD5)
@@ -41,14 +42,13 @@ ngx_log_debug(r->connection->log, "FILE:
 
     /* TODO: look open files cache */
 
-    return ngx_http_cache_open_file(r, ctx, 0);
+    return ngx_http_cache_open_file(ctx, 0);
 }
 
 
 /* TODO: Win32 inode analogy */
 
-int ngx_http_cache_open_file(ngx_http_request_t *r, ngx_http_cache_ctx_t *ctx,
-                             ngx_file_uniq_t uniq)
+int ngx_http_cache_open_file(ngx_http_cache_ctx_t *ctx, ngx_file_uniq_t uniq)
 {
     ssize_t                   n;
     ngx_err_t                 err;
@@ -64,14 +64,14 @@ int ngx_http_cache_open_file(ngx_http_re
             return NGX_DECLINED;
         }
 
-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
+        ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,
                       ngx_open_file_n " \"%s\" failed", ctx->file.name.data);
         return NGX_ERROR;
     }
 
     if (uniq) {
         if (ngx_fd_info(ctx->file.fd, &ctx->file.info) == NGX_FILE_ERROR) {
-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
+            ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,
                           ngx_fd_info_n " \"%s\" failed", ctx->file.name.data);
 
             return NGX_ERROR;
@@ -79,7 +79,7 @@ int ngx_http_cache_open_file(ngx_http_re
 
         if (ngx_file_uniq(&ctx->file.info) == uniq) {
             if (ngx_close_file(ctx->file.fd) == NGX_FILE_ERROR) {
-                ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
+                ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,
                               ngx_close_file_n " \"%s\" failed",
                               ctx->file.name.data);
             }
@@ -96,7 +96,7 @@ int ngx_http_cache_open_file(ngx_http_re
     }
 
     if (n <= ctx->header_size) {
-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
+        ngx_log_error(NGX_LOG_CRIT, ctx->log, 0,
                       "cache file \"%s\" is too small", ctx->file.name.data);
         return NGX_ERROR;
     }
@@ -108,17 +108,18 @@ int ngx_http_cache_open_file(ngx_http_re
     ctx->length = h->length;
 
     if (h->key_len > (size_t) (ctx->buf->last - ctx->buf->pos)) {
-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
+        ngx_log_error(NGX_LOG_ALERT, ctx->log, 0,
                       "cache file \"%s\" is probably invalid",
                       ctx->file.name.data);
         return NGX_DECLINED;
     }
 
-    if (h->key_len != ctx->key.len
-        || ngx_strncmp(h->key, ctx->key.data, h->key_len) != 0)
+    if (ctx->key.len
+        && (h->key_len != ctx->key.len
+            || ngx_strncmp(h->key, ctx->key.data, h->key_len) != 0))
     {
         h->key[h->key_len] = '\0';
-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
+        ngx_log_error(NGX_LOG_ALERT, ctx->log, 0,
                           "md5 collision: \"%s\" and \"%s\"",
                           h->key, ctx->key.data);
         return NGX_DECLINED;
@@ -127,7 +128,7 @@ int ngx_http_cache_open_file(ngx_http_re
     ctx->buf->last += n;
 
     if (ctx->expires < ngx_time()) {
-ngx_log_debug(r->connection->log, "EXPIRED");
+ngx_log_debug(ctx->log, "EXPIRED");
         return NGX_HTTP_CACHE_STALE;
     }
 
@@ -137,6 +138,50 @@ ngx_log_debug(r->connection->log, "EXPIR
 }
 
 
+int ngx_garbage_collector_http_cache_handler(ngx_gc_t *gc, ngx_str_t *name,
+                                             ngx_dir_t *dir)
+{
+    int                   rc;
+    char                  data[sizeof(ngx_http_cache_header_t)];
+    ngx_hunk_t            buf;
+    ngx_http_cache_ctx_t  ctx;
+
+    ctx.file.fd = NGX_INVALID_FILE;
+    ctx.file.name = *name;
+    ctx.file.log = gc->log;
+
+    ctx.header_size = sizeof(ngx_http_cache_header_t);
+    ctx.buf = &buf;
+    ctx.log = gc->log;
+    ctx.key.len = 0;
+
+    buf.type = NGX_HUNK_IN_MEMORY|NGX_HUNK_TEMP;
+    buf.pos = data;
+    buf.last = data;
+    buf.start = data;
+    buf.end = data + sizeof(ngx_http_cache_header_t);
+
+    rc = ngx_http_cache_open_file(&ctx, 0);
+
+    /* TODO: NGX_AGAIN */
+
+    if (rc != NGX_ERROR && rc != NGX_DECLINED && rc != NGX_HTTP_CACHE_STALE) {
+        return NGX_OK;
+    }
+
+    if (ngx_delete_file(name->data) == NGX_FILE_ERROR) {
+        ngx_log_error(NGX_LOG_CRIT, gc->log, ngx_errno,
+                      ngx_delete_file_n " \"%s\" failed", name->data);
+        return NGX_ERROR;
+    }
+
+    gc->deleted++;
+    gc->freed += ngx_de_size(dir);
+
+    return NGX_OK;
+}
+
+
 int ngx_http_cache_update_file(ngx_http_request_t *r, ngx_http_cache_ctx_t *ctx,
                                ngx_str_t *temp_file)
 {