force image filter conversion if JPEG application data consume more than 5%

This commit is contained in:
Igor Sysoev 2009-12-22 13:03:49 +00:00
parent ec0655c0ce
commit 9cf418ea92

View File

@ -63,6 +63,7 @@ typedef struct {
ngx_uint_t phase; ngx_uint_t phase;
ngx_uint_t type; ngx_uint_t type;
ngx_uint_t force;
} ngx_http_image_filter_ctx_t; } ngx_http_image_filter_ctx_t;
@ -501,7 +502,8 @@ ngx_http_image_process(ngx_http_request_t *r)
if (rc == NGX_OK if (rc == NGX_OK
&& ctx->width <= ctx->max_width && ctx->width <= ctx->max_width
&& ctx->height <= ctx->max_height) && ctx->height <= ctx->max_height
&& !ctx->force)
{ {
return ngx_http_image_asis(r, ctx); return ngx_http_image_asis(r, ctx);
} }
@ -601,6 +603,7 @@ static ngx_int_t
ngx_http_image_size(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx) ngx_http_image_size(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx)
{ {
u_char *p, *last; u_char *p, *last;
size_t len, app;
ngx_uint_t width, height; ngx_uint_t width, height;
p = ctx->image; p = ctx->image;
@ -611,6 +614,9 @@ ngx_http_image_size(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx)
p += 2; p += 2;
last = ctx->image + ctx->length - 10; last = ctx->image + ctx->length - 10;
width = 0;
height = 0;
app = 0;
while (p < last) { while (p < last) {
@ -621,16 +627,25 @@ ngx_http_image_size(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx)
p++; p++;
if (*p == 0xc0 || *p == 0xc1 || *p == 0xc2 || *p == 0xc3 if ((*p == 0xc0 || *p == 0xc1 || *p == 0xc2 || *p == 0xc3
|| *p == 0xc9 || *p == 0xca || *p == 0xcb) || *p == 0xc9 || *p == 0xca || *p == 0xcb)
&& (width == 0 || height == 0))
{ {
goto found; width = p[6] * 256 + p[7];
height = p[4] * 256 + p[5];
} }
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"JPEG: %02xd %02xd", p[1], p[2]); "JPEG: %02xd %02xd", p[1], p[2]);
p += p[1] * 256 + p[2]; len = p[1] * 256 + p[2];
if (*p >= 0xe1 && *p <= 0xef) {
/* application data, e.g., EXIF, Adobe XMP, etc. */
app += len;
}
p += len;
continue; continue;
} }
@ -638,12 +653,16 @@ ngx_http_image_size(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx)
p++; p++;
} }
if (width == 0 || height == 0) {
return NGX_DECLINED; return NGX_DECLINED;
}
found: if (ctx->length / 20 < app) {
/* force conversion if application data consume more than 5% */
width = p[6] * 256 + p[7]; ctx->force = 1;
height = p[4] * 256 + p[5]; ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"app data size: %uz", app);
}
break; break;
@ -708,7 +727,8 @@ ngx_http_image_resize(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx)
conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module); conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module);
if ((ngx_uint_t) sx <= ctx->max_width if (!ctx->force
&& (ngx_uint_t) sx <= ctx->max_width
&& (ngx_uint_t) sy <= ctx->max_height) && (ngx_uint_t) sy <= ctx->max_height)
{ {
gdImageDestroy(src); gdImageDestroy(src);