annotate src/http/ngx_http_file_cache.c @ 34:aab2ea7c0458 NGINX_0_1_17

nginx 0.1.17 *) Change: the ngx_http_rewrite_module was rewritten from the scratch. Now it is possible to redirect, to return the error codes, to check the variables and referrers. The directives can be used inside locations. The redirect directive was canceled. *) Feature: the ngx_http_geo_module. *) Feature: the proxy_set_x_var and fastcgi_set_var directives. *) Bugfix: the location configuration with "=" modifier may be used in another location. *) Bugfix: the correct content type was set only for requests that use small caps letters in extension. *) Bugfix: if the proxy_pass or fastcgi_pass directives were set in the location, and access was denied, and the error was redirected to a static page, then the segmentation fault occurred. *) Bugfix: if in a proxied "Location" header was a relative URL, then a host name and a slash were added to them; bug appeared in 0.1.14. *) Bugfix: the system error message was not logged on Linux.
author Igor Sysoev <http://sysoev.ru>
date Thu, 03 Feb 2005 00:00:00 +0300
parents 45fe5b98a9de
children 13710a1813ad
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11
18
6f8b0dc0f8dd nginx 0.1.9
Igor Sysoev <http://sysoev.ru>
parents: 10
diff changeset
12 #if (NGX_HAVE_OPENSSL_MD5_H)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
13 #include <openssl/md5.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
14 #else
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15 #include <md5.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
16 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
17
18
6f8b0dc0f8dd nginx 0.1.9
Igor Sysoev <http://sysoev.ru>
parents: 10
diff changeset
18 #if (NGX_OPENSSL_MD5)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
19 #define MD5Init MD5_Init
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
20 #define MD5Update MD5_Update
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
21 #define MD5Final MD5_Final
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
22 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
25 ngx_int_t ngx_http_file_cache_get(ngx_http_request_t *r,
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
26 ngx_http_cache_ctx_t *ctx)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
27 {
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
28 ngx_uint_t i;
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
29 ngx_str_t *key;
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
30 ngx_http_cache_t *c;
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
31 MD5_CTX md5;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
32
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
33 c = r->cache;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
34
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
35 c->file.name.len = ctx->path->name.len + 1 + ctx->path->len + 32;
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
36 if (!(c->file.name.data = ngx_palloc(r->pool, c->file.name.len + 1))) {
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
37 return NGX_ABORT;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
40 MD5Init(&md5);
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
41
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
42 key = c->key.elts;
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
43 for (i = 0; i < c->key.nelts; i++) {
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
44 MD5Update(&md5, key[i].data, key[i].len);
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
45 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
46
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
47 MD5Update(&md5, ctx->key.data, ctx->key.len);
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
48
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
49 MD5Final(c->md5, &md5);
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
50
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
51 ngx_memcpy(c->file.name.data, ctx->path->name.data, ctx->path->name.len);
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
52
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
53 ngx_md5_text(c->file.name.data + ctx->path->name.len + 1 + ctx->path->len,
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
54 c->md5);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
55
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
57 "file cache key: %V, md5: %s", &ctx->key,
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
58 c->file.name.data + ctx->path->name.len + 1 + ctx->path->len);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
60 ngx_create_hashed_filename(&c->file, ctx->path);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
61
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
62 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
63 "file cache name: %s", c->file.name.data);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
65 return ngx_http_file_cache_open(r->cache);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
66 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
67
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
68
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
69 ngx_int_t ngx_http_file_cache_open(ngx_http_cache_t *c)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
70 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71 ssize_t n;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
72 ngx_err_t err;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
73 ngx_http_cache_header_t *h;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
75 c->file.fd = ngx_open_file(c->file.name.data,
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
76 NGX_FILE_RDONLY, NGX_FILE_OPEN);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
77
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
78 if (c->file.fd == NGX_INVALID_FILE) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
79 err = ngx_errno;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
80
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
81 if (err == NGX_ENOENT || err == NGX_ENOTDIR) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
82 return NGX_DECLINED;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
83 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
84
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
85 ngx_log_error(NGX_LOG_CRIT, c->log, ngx_errno,
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
86 ngx_open_file_n " \"%s\" failed", c->file.name.data);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
87 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
88 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
89
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
90 if (c->uniq) {
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
91 if (ngx_fd_info(c->file.fd, &c->file.info) == NGX_FILE_ERROR) {
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
92 ngx_log_error(NGX_LOG_CRIT, c->log, ngx_errno,
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
93 ngx_fd_info_n " \"%s\" failed", c->file.name.data);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
94
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
95 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
96 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
97
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
98 if (ngx_file_uniq(&c->file.info) == c->uniq) {
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
99 if (ngx_close_file(c->file.fd) == NGX_FILE_ERROR) {
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
100 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
101 ngx_close_file_n " \"%s\" failed",
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
102 c->file.name.data);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
103 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
104
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
105 return NGX_HTTP_CACHE_THE_SAME;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
107 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
108
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
109 n = ngx_read_file(&c->file, c->buf->pos, c->buf->end - c->buf->last, 0);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
111 if (n == NGX_ERROR || n == NGX_AGAIN) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112 return n;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
113 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
115 if (n <= c->header_size) {
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
116 ngx_log_error(NGX_LOG_CRIT, c->log, 0,
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
117 "cache file \"%s\" is too small", c->file.name.data);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
118 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
119 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
120
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
121 h = (ngx_http_cache_header_t *) c->buf->pos;
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
122 c->expires = h->expires;
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
123 c->last_modified= h->last_modified;
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
124 c->date = h->date;
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
125 c->length = h->length;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
126
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
127 if (h->key_len > (size_t) (c->buf->end - c->buf->pos)) {
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
128 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
129 "cache file \"%s\" is probably invalid",
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
130 c->file.name.data);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
131 return NGX_DECLINED;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
132 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
133
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
134 #if 0
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
135
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
136 /* TODO */
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
137
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
138 if (c->key_len && h->key_len != c->key_len) {
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
139
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
140 ngx_strncmp(h->key, c->key_data, h->key_len) != 0))
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
141
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
142 h->key[h->key_len] = '\0';
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
143 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
144 "md5 collision: \"%s\" and \"%s\"",
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
145 h->key, c->key.data);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
146 return NGX_DECLINED;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
147 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
148
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
149 #endif
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
150
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
151 c->buf->last += n;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
152
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
153 if (c->expires < ngx_time()) {
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
154 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
155 "http file cache expired");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
156 return NGX_HTTP_CACHE_STALE;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
157 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
158
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
159 /* TODO: NGX_HTTP_CACHE_AGED */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
160
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
161 /* STUB */ return NGX_DECLINED;
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
162
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
163 return NGX_OK;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
164 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
165
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
166
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
167 #if 0
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
168
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
169
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
170 int ngx_http_cache_update_file(ngx_http_request_t *r, ngx_http_cache_ctx_t *ctx,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
171 ngx_str_t *temp_file)
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
172 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
173 int retry;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
174 ngx_err_t err;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
175
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
176 retry = 0;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
177
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
178 for ( ;; ) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
179 if (ngx_rename_file(temp_file->data, ctx->file.name.data) == NGX_OK) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
180 return NGX_OK;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
181 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
182
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
183 err = ngx_errno;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
184
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
185 #if (NGX_WIN32)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
186 if (err == NGX_EEXIST) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
187 if (ngx_win32_rename_file(temp_file, &ctx->file.name, r->pool)
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
188 == NGX_ERROR)
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
189 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
190 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
191 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
192 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
193 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
194
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
195 if (retry || (err != NGX_ENOENT && err != NGX_ENOTDIR)) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
196 ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
197 ngx_rename_file_n "(\"%s\", \"%s\") failed",
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
198 temp_file->data, ctx->file.name.data);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
199
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
200 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
201 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
202
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
203 if (ngx_create_path(&ctx->file, ctx->path) == NGX_ERROR) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
204 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
205 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
206
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
207 retry = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
208 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
209 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
210
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
211
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
212 #endif
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
213
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
214
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
215 ngx_int_t ngx_http_cache_cleaner_handler(ngx_gc_t *gc, ngx_str_t *name,
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
216 ngx_dir_t *dir)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
217 {
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
218 int rc;
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
219 ngx_buf_t buf;
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
220 ngx_http_cache_t c;
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
221 u_char data[sizeof(ngx_http_cache_header_t)];
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
222
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
223 ngx_memzero(&c, sizeof(ngx_http_cache_t));
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
224
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
225 c.file.fd = NGX_INVALID_FILE;
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
226 c.file.name = *name;
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
227 c.file.log = gc->log;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
228
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
229 c.header_size = sizeof(ngx_http_cache_header_t);
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
230 c.buf = &buf;
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
231 c.log = gc->log;
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
232 c.key_len = 0;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
233
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
234 buf.memory = 1;
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
235 buf.temporary = 1;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
236 buf.pos = data;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
237 buf.last = data;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
238 buf.start = data;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
239 buf.end = data + sizeof(ngx_http_cache_header_t);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
240
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
241 rc = ngx_http_file_cache_open(&c);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
242
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
243 /* TODO: NGX_AGAIN */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
244
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
245 if (rc != NGX_ERROR&& rc != NGX_DECLINED && rc != NGX_HTTP_CACHE_STALE) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
246 return NGX_OK;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
248
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
249 if (ngx_delete_file(name->data) == NGX_FILE_ERROR) {
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
250 ngx_log_error(NGX_LOG_CRIT, c.log, ngx_errno,
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
251 ngx_delete_file_n " \"%s\" failed", name->data);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
254
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
255 gc->deleted++;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
256 gc->freed += ngx_de_size(dir);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
257
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
258 return NGX_OK;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
259 }