diff options
author | Maxim Dounin <mdounin@mdounin.ru> | 2014-05-19 22:45:34 +0400 |
---|---|---|
committer | Maxim Dounin <mdounin@mdounin.ru> | 2014-05-19 22:45:34 +0400 |
commit | 4884cd611e805ada82ad2735d4598cd41922ca0a (patch) | |
tree | 9978596d4f69b24e33f225afb4819ae6dc39add9 /src | |
parent | ffba0eeefbdbc36d8bb826523355fd31d8929a27 (diff) | |
download | nginx-4884cd611e805ada82ad2735d4598cd41922ca0a.tar.gz nginx-4884cd611e805ada82ad2735d4598cd41922ca0a.zip |
Charset filter: fixed charset setting on encoded replies.
If response is gzipped we can't recode response, but in case it's not
needed we still can add charset to Content-Type.
The r->ignore_content_encoding is dropped accordingly, charset with gzip_static
now properly works without any special flags.
Diffstat (limited to 'src')
-rw-r--r-- | src/http/modules/ngx_http_charset_filter_module.c | 34 | ||||
-rw-r--r-- | src/http/modules/ngx_http_gzip_static_module.c | 2 | ||||
-rw-r--r-- | src/http/ngx_http_request.h | 1 |
3 files changed, 19 insertions, 18 deletions
diff --git a/src/http/modules/ngx_http_charset_filter_module.c b/src/http/modules/ngx_http_charset_filter_module.c index c9b7e9e89..4ea98184b 100644 --- a/src/http/modules/ngx_http_charset_filter_module.c +++ b/src/http/modules/ngx_http_charset_filter_module.c @@ -272,12 +272,27 @@ ngx_http_charset_header_filter(ngx_http_request_t *r) return ngx_http_next_header_filter(r); } + if (source_charset == charset) { + r->headers_out.content_type.len = r->headers_out.content_type_len; + + ngx_http_set_charset(r, &dst); + + return ngx_http_next_header_filter(r); + } + + /* source_charset != charset */ + + if (r->headers_out.content_encoding + && r->headers_out.content_encoding->value.len) + { + return ngx_http_next_header_filter(r); + } + mcf = ngx_http_get_module_main_conf(r, ngx_http_charset_filter_module); charsets = mcf->charsets.elts; - if (source_charset != charset - && (charsets[source_charset].tables == NULL - || charsets[source_charset].tables[charset] == NULL)) + if (charsets[source_charset].tables == NULL + || charsets[source_charset].tables[charset] == NULL) { goto no_charset_map; } @@ -286,11 +301,7 @@ ngx_http_charset_header_filter(ngx_http_request_t *r) ngx_http_set_charset(r, &dst); - if (source_charset != charset) { - return ngx_http_charset_ctx(r, charsets, charset, source_charset); - } - - return ngx_http_next_header_filter(r); + return ngx_http_charset_ctx(r, charsets, charset, source_charset); no_charset_map: @@ -311,13 +322,6 @@ ngx_http_destination_charset(ngx_http_request_t *r, ngx_str_t *name) ngx_http_charset_loc_conf_t *mlcf; ngx_http_charset_main_conf_t *mcf; - if (!r->ignore_content_encoding - && r->headers_out.content_encoding - && r->headers_out.content_encoding->value.len) - { - return NGX_DECLINED; - } - if (r->headers_out.content_type.len == 0) { return NGX_DECLINED; } diff --git a/src/http/modules/ngx_http_gzip_static_module.c b/src/http/modules/ngx_http_gzip_static_module.c index 1746e5504..4d5409077 100644 --- a/src/http/modules/ngx_http_gzip_static_module.c +++ b/src/http/modules/ngx_http_gzip_static_module.c @@ -246,8 +246,6 @@ ngx_http_gzip_static_handler(ngx_http_request_t *r) ngx_str_set(&h->value, "gzip"); r->headers_out.content_encoding = h; - r->ignore_content_encoding = 1; - /* we need to allocate all before the header would be sent */ b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t)); diff --git a/src/http/ngx_http_request.h b/src/http/ngx_http_request.h index 705c4e904..c89ef6d14 100644 --- a/src/http/ngx_http_request.h +++ b/src/http/ngx_http_request.h @@ -511,7 +511,6 @@ struct ngx_http_request_s { unsigned discard_body:1; unsigned internal:1; unsigned error_page:1; - unsigned ignore_content_encoding:1; unsigned filter_finalize:1; unsigned post_action:1; unsigned request_complete:1; |