]> git.kaiwu.me - nginx.git/commitdiff
support HEAD in proxy cache
authorIgor Sysoev <igor@sysoev.ru>
Wed, 15 Apr 2009 09:53:22 +0000 (09:53 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Wed, 15 Apr 2009 09:53:22 +0000 (09:53 +0000)
src/http/ngx_http_core_module.c
src/http/ngx_http_core_module.h
src/http/ngx_http_upstream.c

index ca1fbead0ff0afbed3c4737a935df656b41166ef..26f24b360eb4e07ca410dd09c6a4ed8250560c7a 100644 (file)
@@ -691,7 +691,7 @@ ngx_module_t  ngx_http_core_module = {
 };
 
 
-static ngx_str_t  ngx_http_core_get_method = { 3, (u_char *) "GET " };
+ngx_str_t  ngx_http_core_get_method = { 3, (u_char *) "GET " };
 
 
 void
index 8b1db54a25ee820db089c0d9a553cddfc8e15c79..546ebbb563ce8a4c6b53835708767740aecce416 100644 (file)
@@ -468,6 +468,8 @@ extern ngx_module_t  ngx_http_core_module;
 
 extern ngx_uint_t ngx_http_max_module;
 
+extern ngx_str_t  ngx_http_core_get_method;
+
 
 #define ngx_http_clear_content_length(r)                                      \
                                                                               \
index 82f11024610a55c274f02ebdd960b51809a51676..e7e809103f4e2932acc7567a834d9d8986219ccf 100644 (file)
@@ -532,10 +532,14 @@ ngx_http_upstream_cache(ngx_http_request_t *r, ngx_http_upstream_t *u)
     ngx_int_t          rc;
     ngx_http_cache_t  *c;
 
-    if (!(r->method & NGX_HTTP_GET)) {
+    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {
         return NGX_DECLINED;
     }
 
+    if (r->method & NGX_HTTP_HEAD) {
+        u->method = ngx_http_core_get_method;
+    }
+
     c = ngx_pcalloc(r->pool, sizeof(ngx_http_cache_t));
     if (c == NULL) {
         return NGX_ERROR;
@@ -1821,11 +1825,23 @@ ngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u)
 
     rc = ngx_http_send_header(r);
 
-    if (rc == NGX_ERROR || rc > NGX_OK || r->post_action || r->header_only) {
+    if (rc == NGX_ERROR || rc > NGX_OK || r->post_action) {
         ngx_http_upstream_finalize_request(r, u, rc);
         return;
     }
 
+    if (r->header_only) {
+        if (u->cacheable || u->store) {
+            r->read_event_handler = ngx_http_request_empty_handler;
+            r->write_event_handler = ngx_http_request_empty_handler;
+            r->connection->error = 1;
+
+        } else {
+            ngx_http_upstream_finalize_request(r, u, rc);
+            return;
+        }
+    }
+
     u->header_sent = 1;
 
     if (r->request_body && r->request_body->temp_file) {