changeset 752:907361d07f25

ngx_http_charset_module supports the variables
author Igor Sysoev <igor@sysoev.ru>
date Mon, 09 Oct 2006 14:16:36 +0000
parents bae59a740c40
children af72ac9c3dbf
files src/http/modules/ngx_http_charset_filter_module.c
diffstat 1 files changed, 53 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/http/modules/ngx_http_charset_filter_module.c
+++ b/src/http/modules/ngx_http_charset_filter_module.c
@@ -10,6 +10,7 @@
 
 
 #define NGX_HTTP_NO_CHARSET    -2
+#define NGX_HTTP_CHARSET_VAR   0x10000
 
 /* 1 byte length and up to 3 bytes for the UTF-8 encoding of the UCS-2 */
 #define NGX_UTF_LEN             4
@@ -79,7 +80,7 @@ typedef struct {
 
 
 static ngx_int_t ngx_http_charset_get_charset(ngx_http_charset_t *charsets,
-    ngx_uint_t n, u_char *charset);
+    ngx_uint_t n, ngx_str_t *charset);
 static ngx_int_t ngx_http_charset_set_charset(ngx_http_request_t *r,
     ngx_http_charset_t *charsets, ngx_int_t charset, ngx_int_t source_charset);
 static ngx_uint_t ngx_http_charset_recode(ngx_buf_t *b, u_char *table);
@@ -190,6 +191,7 @@ ngx_http_charset_header_filter(ngx_http_
     ngx_uint_t                     n;
     ngx_http_charset_t            *charsets;
     ngx_http_charset_ctx_t        *ctx;
+    ngx_http_variable_value_t     *vv;
     ngx_http_charset_loc_conf_t   *lcf, *mlcf;
     ngx_http_charset_main_conf_t  *mcf;
 
@@ -210,7 +212,7 @@ ngx_http_charset_header_filter(ngx_http_
             && r->headers_out.override_charset->len)
         {
             charset = ngx_http_charset_get_charset(charsets, n,
-                                        r->headers_out.override_charset->data);
+                                              r->headers_out.override_charset);
 
             if (charset == NGX_HTTP_NO_CHARSET) {
                 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
@@ -243,6 +245,14 @@ ngx_http_charset_header_filter(ngx_http_
                     return ngx_http_next_header_filter(r);
                 }
             }
+
+            if (charset >= NGX_HTTP_CHARSET_VAR) {
+                vv = ngx_http_get_indexed_variable(r,
+                                               charset - NGX_HTTP_CHARSET_VAR);
+
+                charset = ngx_http_charset_get_charset(charsets, n,
+                                                       (ngx_str_t *) vv);
+            }
         }
 
     } else {
@@ -263,7 +273,7 @@ ngx_http_charset_header_filter(ngx_http_
 
             ngx_http_set_ctx(r->main, ctx, ngx_http_charset_filter_module);
 
-            charset = ngx_http_charset_get_charset(charsets, n, mc->data);
+            charset = ngx_http_charset_get_charset(charsets, n, mc);
 
             ctx->charset = charset;
 
@@ -277,23 +287,33 @@ ngx_http_charset_header_filter(ngx_http_
     if (r->headers_out.charset.len == 0) {
         lcf = ngx_http_get_module_loc_conf(r, ngx_http_charset_filter_module);
 
+        source_charset = lcf->source_charset;
+
+        if (source_charset >= NGX_HTTP_CHARSET_VAR) {
+            vv = ngx_http_get_indexed_variable(r,
+                                        source_charset - NGX_HTTP_CHARSET_VAR);
+
+            source_charset = ngx_http_charset_get_charset(charsets, n,
+                                                          (ngx_str_t *) vv);
+        }
+
         if (charset != NGX_HTTP_NO_CHARSET) {
             return ngx_http_charset_set_charset(r, mcf->charsets.elts, charset,
-                                                lcf->source_charset);
+                                                source_charset);
         }
 
-        if (lcf->source_charset == NGX_CONF_UNSET) {
+        if (source_charset == NGX_CONF_UNSET) {
             return ngx_http_next_header_filter(r);
         }
 
-        from = &charsets[lcf->source_charset].name;
+        from = &charsets[source_charset].name;
         to = &r->main->headers_out.charset;
 
         goto no_charset_map;
     }
 
     source_charset = ngx_http_charset_get_charset(charsets, n,
-                                                  r->headers_out.charset.data);
+                                                  &r->headers_out.charset);
 
     if (charset == NGX_HTTP_NO_CHARSET
         || source_charset == NGX_HTTP_NO_CHARSET)
@@ -341,12 +361,19 @@ no_charset_map:
 
 static ngx_int_t
 ngx_http_charset_get_charset(ngx_http_charset_t *charsets, ngx_uint_t n,
-    u_char *charset)
+    ngx_str_t *charset)
 {
+    size_t      len;
     ngx_uint_t  i;
 
+    len = charset->len & 0xffff;
+
     for (i = 0; i < n; i++) {
-        if (ngx_strcasecmp(charsets[i].name.data, charset) == 0) {
+        if (charsets[i].name.len != len) {
+            continue;
+        }
+
+        if (ngx_strncasecmp(charsets[i].name.data, charset->data, len) == 0) {
             return i;
         }
     }
@@ -1261,7 +1288,7 @@ ngx_http_set_charset_slot(ngx_conf_t *cf
     char  *p = conf;
 
     ngx_int_t                     *cp;
-    ngx_str_t                     *value;
+    ngx_str_t                     *value, var;
     ngx_http_charset_main_conf_t  *mcf;
 
     cp = (ngx_int_t *) (p + cmd->offset);
@@ -1279,6 +1306,22 @@ ngx_http_set_charset_slot(ngx_conf_t *cf
         return NGX_CONF_OK;
     }
 
+
+    if (value[1].data[0] == '$') {
+        var.len = value[1].len - 1;
+        var.data = value[1].data + 1;
+
+        *cp = ngx_http_get_variable_index(cf, &var);
+
+        if (*cp == NGX_ERROR) {
+            return NGX_CONF_ERROR;
+        }
+
+        *cp += NGX_HTTP_CHARSET_VAR;
+
+        return NGX_CONF_OK;
+    }
+
     mcf = ngx_http_conf_get_module_main_conf(cf,
                                              ngx_http_charset_filter_module);