]> git.kaiwu.me - nginx.git/commitdiff
Charset filter: fixed charset setting on encoded replies.
authorMaxim Dounin <mdounin@mdounin.ru>
Mon, 19 May 2014 18:45:34 +0000 (22:45 +0400)
committerMaxim Dounin <mdounin@mdounin.ru>
Mon, 19 May 2014 18:45:34 +0000 (22:45 +0400)
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.

src/http/modules/ngx_http_charset_filter_module.c
src/http/modules/ngx_http_gzip_static_module.c
src/http/ngx_http_request.h

index c9b7e9e8968db0095203189cc30aad30f293a18c..4ea98184b269070ba9b4061e9bd045527c62923e 100644 (file)
@@ -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;
     }
index 1746e550423e5a6f3a33e7e4d4bdc0bb39fd906d..4d54090772b89450e4e75c64c9694c59e5b1619c 100644 (file)
@@ -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));
index 705c4e904568ce4041ba572eb530300a979415a5..c89ef6d143e9344baa2df7f3409112ff2d6d6e83 100644 (file)
@@ -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;