support HEAD in proxy cache
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c index ca1fbea..26f24b3 100644 --- a/src/http/ngx_http_core_module.c +++ b/src/http/ngx_http_core_module.c
@@ -691,7 +691,7 @@ }; -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
diff --git a/src/http/ngx_http_core_module.h b/src/http/ngx_http_core_module.h index 8b1db54..546ebbb 100644 --- a/src/http/ngx_http_core_module.h +++ b/src/http/ngx_http_core_module.h
@@ -468,6 +468,8 @@ extern ngx_uint_t ngx_http_max_module; +extern ngx_str_t ngx_http_core_get_method; + #define ngx_http_clear_content_length(r) \ \
diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c index 82f1102..e7e8091 100644 --- a/src/http/ngx_http_upstream.c +++ b/src/http/ngx_http_upstream.c
@@ -532,10 +532,14 @@ 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 @@ 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) {