# HG changeset patch # User Igor Sysoev # Date 1241794370 0 # Node ID 26e06e009ced6472f7c4a436eb60b93b71108f74 # Parent 5eb4e2d2e9fa4651c804f3dc7b90bbae10b60d7c allow to pass image filter errors via the same location where the filter is set diff --git a/src/http/modules/ngx_http_image_filter_module.c b/src/http/modules/ngx_http_image_filter_module.c --- a/src/http/modules/ngx_http_image_filter_module.c +++ b/src/http/modules/ngx_http_image_filter_module.c @@ -181,6 +181,13 @@ ngx_http_image_header_filter(ngx_http_re return NGX_ERROR; } + ctx = ngx_http_get_module_ctx(r, ngx_http_image_filter_module); + + if (ctx) { + ngx_http_set_ctx(r, NULL, ngx_http_image_filter_module); + return ngx_http_next_header_filter(r); + } + ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_image_filter_ctx_t)); if (ctx == NULL) { return NGX_ERROR; @@ -258,6 +265,7 @@ ngx_http_image_body_filter(ngx_http_requ } return ngx_http_filter_finalize_request(r, + &ngx_http_image_filter_module, NGX_HTTP_UNSUPPORTED_MEDIA_TYPE); } @@ -287,6 +295,7 @@ ngx_http_image_body_filter(ngx_http_requ if (rc == NGX_ERROR) { return ngx_http_filter_finalize_request(r, + &ngx_http_image_filter_module, NGX_HTTP_UNSUPPORTED_MEDIA_TYPE); } @@ -298,6 +307,7 @@ ngx_http_image_body_filter(ngx_http_requ if (out.buf == NULL) { return ngx_http_filter_finalize_request(r, + &ngx_http_image_filter_module, NGX_HTTP_UNSUPPORTED_MEDIA_TYPE); } diff --git a/src/http/modules/ngx_http_xslt_filter_module.c b/src/http/modules/ngx_http_xslt_filter_module.c --- a/src/http/modules/ngx_http_xslt_filter_module.c +++ b/src/http/modules/ngx_http_xslt_filter_module.c @@ -319,7 +319,7 @@ ngx_http_xslt_send(ngx_http_request_t *r ctx->done = 1; if (b == NULL) { - return ngx_http_filter_finalize_request(r, + return ngx_http_filter_finalize_request(r, NULL, NGX_HTTP_INTERNAL_SERVER_ERROR); } @@ -327,7 +327,7 @@ ngx_http_xslt_send(ngx_http_request_t *r if (cln == NULL) { ngx_free(b->pos); - return ngx_http_filter_finalize_request(r, + return ngx_http_filter_finalize_request(r, NULL, NGX_HTTP_INTERNAL_SERVER_ERROR); } diff --git a/src/http/ngx_http.h b/src/http/ngx_http.h --- a/src/http/ngx_http.h +++ b/src/http/ngx_http.h @@ -104,7 +104,7 @@ ngx_int_t ngx_http_send_header(ngx_http_ ngx_int_t ngx_http_special_response_handler(ngx_http_request_t *r, ngx_int_t error); ngx_int_t ngx_http_filter_finalize_request(ngx_http_request_t *r, - ngx_int_t error); + ngx_module_t *m, ngx_int_t error); void ngx_http_clean_header(ngx_http_request_t *r); diff --git a/src/http/ngx_http_special_response.c b/src/http/ngx_http_special_response.c --- a/src/http/ngx_http_special_response.c +++ b/src/http/ngx_http_special_response.c @@ -446,15 +446,25 @@ ngx_http_special_response_handler(ngx_ht ngx_int_t -ngx_http_filter_finalize_request(ngx_http_request_t *r, ngx_int_t error) +ngx_http_filter_finalize_request(ngx_http_request_t *r, ngx_module_t *m, + ngx_int_t error) { - ngx_int_t rc; + void *ctx; + ngx_int_t rc; ngx_http_clean_header(r); + if (m) { + ctx = r->ctx[m->ctx_index]; + } + /* clear the modules contexts */ ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module); + if (m) { + r->ctx[m->ctx_index] = ctx; + } + r->filter_finalize = 1; rc = ngx_http_special_response_handler(r, error);