mirror of
https://github.com/nginx/nginx.git
synced 2025-06-12 21:52:41 +08:00
handle big responses for "size" and "test" image_filters
This commit is contained in:
parent
4318688cce
commit
fd4191845b
@ -7,7 +7,8 @@
|
|||||||
#include <ngx_config.h>
|
#include <ngx_config.h>
|
||||||
#include <ngx_core.h>
|
#include <ngx_core.h>
|
||||||
#include <ngx_http.h>
|
#include <ngx_http.h>
|
||||||
#include "gd.h"
|
|
||||||
|
#include <gd.h>
|
||||||
|
|
||||||
|
|
||||||
#define NGX_HTTP_IMAGE_OFF 0
|
#define NGX_HTTP_IMAGE_OFF 0
|
||||||
@ -20,7 +21,8 @@
|
|||||||
#define NGX_HTTP_IMAGE_START 0
|
#define NGX_HTTP_IMAGE_START 0
|
||||||
#define NGX_HTTP_IMAGE_READ 1
|
#define NGX_HTTP_IMAGE_READ 1
|
||||||
#define NGX_HTTP_IMAGE_PROCESS 2
|
#define NGX_HTTP_IMAGE_PROCESS 2
|
||||||
#define NGX_HTTP_IMAGE_DONE 3
|
#define NGX_HTTP_IMAGE_PASS 3
|
||||||
|
#define NGX_HTTP_IMAGE_DONE 4
|
||||||
|
|
||||||
|
|
||||||
#define NGX_HTTP_IMAGE_NONE 0
|
#define NGX_HTTP_IMAGE_NONE 0
|
||||||
@ -55,6 +57,8 @@ typedef struct {
|
|||||||
} ngx_http_image_filter_ctx_t;
|
} ngx_http_image_filter_ctx_t;
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t ngx_http_image_send(ngx_http_request_t *r,
|
||||||
|
ngx_http_image_filter_ctx_t *ctx, ngx_chain_t *in);
|
||||||
static ngx_uint_t ngx_http_image_test(ngx_http_request_t *r, ngx_chain_t *in);
|
static ngx_uint_t ngx_http_image_test(ngx_http_request_t *r, ngx_chain_t *in);
|
||||||
static ngx_int_t ngx_http_image_read(ngx_http_request_t *r, ngx_chain_t *in);
|
static ngx_int_t ngx_http_image_read(ngx_http_request_t *r, ngx_chain_t *in);
|
||||||
static ngx_buf_t *ngx_http_image_process(ngx_http_request_t *r);
|
static ngx_buf_t *ngx_http_image_process(ngx_http_request_t *r);
|
||||||
@ -247,9 +251,9 @@ ngx_http_image_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
|
|||||||
|
|
||||||
if (out.buf) {
|
if (out.buf) {
|
||||||
out.next = NULL;
|
out.next = NULL;
|
||||||
in = &out;
|
ctx->phase = NGX_HTTP_IMAGE_DONE;
|
||||||
|
|
||||||
break;
|
return ngx_http_image_send(r, ctx, &out);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -264,7 +268,9 @@ ngx_http_image_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
|
|||||||
r->headers_out.content_type = *ct;
|
r->headers_out.content_type = *ct;
|
||||||
|
|
||||||
if (conf->filter == NGX_HTTP_IMAGE_TEST) {
|
if (conf->filter == NGX_HTTP_IMAGE_TEST) {
|
||||||
break;
|
ctx->phase = NGX_HTTP_IMAGE_PASS;
|
||||||
|
|
||||||
|
return ngx_http_image_send(r, ctx, in);
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->phase = NGX_HTTP_IMAGE_READ;
|
ctx->phase = NGX_HTTP_IMAGE_READ;
|
||||||
@ -296,24 +302,44 @@ ngx_http_image_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
|
|||||||
}
|
}
|
||||||
|
|
||||||
out.next = NULL;
|
out.next = NULL;
|
||||||
in = &out;
|
ctx->phase = NGX_HTTP_IMAGE_PASS;
|
||||||
|
|
||||||
break;
|
return ngx_http_image_send(r, ctx, &out);
|
||||||
|
|
||||||
|
case NGX_HTTP_IMAGE_PASS:
|
||||||
|
|
||||||
|
return ngx_http_next_body_filter(r, in);
|
||||||
|
|
||||||
default: /* NGX_HTTP_IMAGE_DONE */
|
default: /* NGX_HTTP_IMAGE_DONE */
|
||||||
|
|
||||||
return ngx_http_next_body_filter(r, in);
|
rc = ngx_http_next_body_filter(r, NULL);
|
||||||
}
|
|
||||||
|
|
||||||
ctx->phase = NGX_HTTP_IMAGE_DONE;
|
/* NGX_ERROR resets any pending data */
|
||||||
|
return (rc == NGX_OK) ? NGX_ERROR : rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_image_send(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx,
|
||||||
|
ngx_chain_t *in)
|
||||||
|
{
|
||||||
|
ngx_int_t rc;
|
||||||
|
|
||||||
rc = ngx_http_next_header_filter(r);
|
rc = ngx_http_next_header_filter(r);
|
||||||
|
|
||||||
if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
|
if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
|
||||||
return rc;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ngx_http_next_body_filter(r, in);
|
rc = ngx_http_next_body_filter(r, in);
|
||||||
|
|
||||||
|
if (ctx->phase == NGX_HTTP_IMAGE_DONE) {
|
||||||
|
/* NGX_ERROR resets any pending data */
|
||||||
|
return (rc == NGX_OK) ? NGX_ERROR : rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1815,6 +1815,11 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
|
|||||||
"http finalize request: %d, \"%V?%V\" %d",
|
"http finalize request: %d, \"%V?%V\" %d",
|
||||||
rc, &r->uri, &r->args, r == c->data);
|
rc, &r->uri, &r->args, r == c->data);
|
||||||
|
|
||||||
|
if (rc == NGX_OK && r->filter_finalize) {
|
||||||
|
c->error = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (rc == NGX_DECLINED) {
|
if (rc == NGX_DECLINED) {
|
||||||
r->content_handler = NULL;
|
r->content_handler = NULL;
|
||||||
r->write_event_handler = ngx_http_core_run_phases;
|
r->write_event_handler = ngx_http_core_run_phases;
|
||||||
|
@ -478,6 +478,7 @@ struct ngx_http_request_s {
|
|||||||
unsigned discard_body:1;
|
unsigned discard_body:1;
|
||||||
unsigned internal:1;
|
unsigned internal:1;
|
||||||
unsigned error_page:1;
|
unsigned error_page:1;
|
||||||
|
unsigned filter_finalize:1;
|
||||||
unsigned post_action:1;
|
unsigned post_action:1;
|
||||||
unsigned request_complete:1;
|
unsigned request_complete:1;
|
||||||
unsigned request_output:1;
|
unsigned request_output:1;
|
||||||
|
@ -455,11 +455,21 @@ ngx_http_filter_finalize_request(ngx_http_request_t *r, ngx_int_t error)
|
|||||||
/* clear the modules contexts */
|
/* clear the modules contexts */
|
||||||
ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);
|
ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);
|
||||||
|
|
||||||
|
r->filter_finalize = 1;
|
||||||
|
|
||||||
rc = ngx_http_special_response_handler(r, error);
|
rc = ngx_http_special_response_handler(r, error);
|
||||||
|
|
||||||
/* NGX_ERROR resets any pending data */
|
/* NGX_ERROR resets any pending data */
|
||||||
|
|
||||||
return (rc == NGX_OK) ? NGX_ERROR : rc;
|
switch (rc) {
|
||||||
|
|
||||||
|
case NGX_OK:
|
||||||
|
case NGX_DONE:
|
||||||
|
return NGX_ERROR;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user