From 4e6974403b5a7f25e932b40cddabf17011fc4468 Mon Sep 17 00:00:00 2001 From: Mikhail Zaytsev Date: Mon, 14 Feb 2022 21:47:22 +0300 Subject: [PATCH] srcache_store_max_size as complex value type --- src/ngx_http_srcache_filter_module.c | 9 ++++++--- src/ngx_http_srcache_filter_module.h | 3 ++- src/ngx_http_srcache_store.c | 14 ++++++++------ 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/ngx_http_srcache_filter_module.c b/src/ngx_http_srcache_filter_module.c index 7bbad4e..aac1f83 100644 --- a/src/ngx_http_srcache_filter_module.c +++ b/src/ngx_http_srcache_filter_module.c @@ -86,7 +86,7 @@ static ngx_command_t ngx_http_srcache_commands[] = { { ngx_string("srcache_store_max_size"), NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF |NGX_CONF_TAKE1, - ngx_conf_set_size_slot, + ngx_http_set_complex_value_size_slot, NGX_HTTP_LOC_CONF_OFFSET, offsetof(ngx_http_srcache_loc_conf_t, store_max_size), NULL }, @@ -269,7 +269,6 @@ ngx_http_srcache_create_loc_conf(ngx_conf_t *cf) conf->store = NGX_CONF_UNSET_PTR; conf->buf_size = NGX_CONF_UNSET_SIZE; - conf->store_max_size = NGX_CONF_UNSET_SIZE; conf->header_buf_size = NGX_CONF_UNSET_SIZE; conf->req_cache_control = NGX_CONF_UNSET; @@ -305,7 +304,7 @@ ngx_http_srcache_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) ngx_conf_merge_size_value(conf->buf_size, prev->buf_size, (size_t) ngx_pagesize); - ngx_conf_merge_size_value(conf->store_max_size, prev->store_max_size, 0); + ngx_conf_merge_ptr_value(conf->store_max_size, prev->store_max_size, 0); ngx_conf_merge_size_value(conf->header_buf_size, prev->header_buf_size, (size_t) ngx_pagesize); @@ -322,6 +321,10 @@ ngx_http_srcache_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) conf->store_statuses = prev->store_statuses; } + if (conf->store_max_size == NULL) { + conf->store_max_size = prev->store_max_size; + } + if (conf->cache_methods == 0) { conf->cache_methods = prev->cache_methods; } diff --git a/src/ngx_http_srcache_filter_module.h b/src/ngx_http_srcache_filter_module.h index 50c4b87..db94c9b 100644 --- a/src/ngx_http_srcache_filter_module.h +++ b/src/ngx_http_srcache_filter_module.h @@ -53,7 +53,7 @@ typedef struct { ngx_http_srcache_request_t *fetch; ngx_http_srcache_request_t *store; size_t buf_size; - size_t store_max_size; + ngx_http_complex_value_t *store_max_size; size_t header_buf_size; ngx_http_complex_value_t *fetch_skip; @@ -105,6 +105,7 @@ struct ngx_http_srcache_ctx_s { ngx_chain_t *body_to_cache; size_t response_length; size_t response_body_length; + size_t store_max_size; void *store_wev_handler_ctx; ngx_int_t (*process_header)(ngx_http_request_t *r, diff --git a/src/ngx_http_srcache_store.c b/src/ngx_http_srcache_store.c index d3f4fa5..993b497 100644 --- a/src/ngx_http_srcache_store.c +++ b/src/ngx_http_srcache_store.c @@ -224,16 +224,18 @@ ngx_http_srcache_header_filter(ngx_http_request_t *r) } } - if (slcf->store_max_size != 0 + ctx->store_max_size = ngx_http_complex_value_size(r, slcf->store_max_size, 0); + + if (ctx->store_max_size != 0 && r->headers_out.content_length_n > 0 && r->headers_out.content_length_n + 15 /* just an approxiation for the response header size */ - > (off_t) slcf->store_max_size) + > (off_t) ctx->store_max_size) { ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "srcache_store bypassed because of too large " "Content-Length response header: %O (limit is: %z)", - r->headers_out.content_length_n, slcf->store_max_size); + r->headers_out.content_length_n, ctx->store_max_size); return ngx_http_srcache_next_header_filter(r); } @@ -429,13 +431,13 @@ ngx_http_srcache_body_filter(ngx_http_request_t *r, ngx_chain_t *in) } } - if (slcf->store_max_size != 0 - && ctx->response_length > slcf->store_max_size) + if (ctx->store_max_size != 0 + && ctx->response_length > ctx->store_max_size) { ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "srcache_store bypassed because response body " "exceeded maximum size: %z (limit is: %z)", - ctx->response_length, slcf->store_max_size); + ctx->response_length, ctx->store_max_size); ctx->store_response = 0;