typedef struct {
- ngx_str_t before_body;
- ngx_str_t after_body;
+ ngx_str_t before_body;
+ ngx_str_t after_body;
+
+ ngx_hash_t types;
+ ngx_array_t *types_keys;
} ngx_http_addition_conf_t;
typedef struct {
- ngx_uint_t before_body_sent;
+ ngx_uint_t before_body_sent;
} ngx_http_addition_ctx_t;
offsetof(ngx_http_addition_conf_t, after_body),
NULL },
+ { ngx_string("addtion_types"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
+ ngx_http_types_slot,
+ NGX_HTTP_LOC_CONF_OFFSET,
+ offsetof(ngx_http_addition_conf_t, types_keys),
+ &ngx_http_html_default_types[0] },
+
ngx_null_command
};
ngx_http_addition_ctx_t *ctx;
ngx_http_addition_conf_t *conf;
- if (r->headers_out.status != NGX_HTTP_OK
- || r != r->main
- || r->headers_out.content_type.data == NULL)
- {
+ if (r->headers_out.status != NGX_HTTP_OK || r != r->main) {
return ngx_http_next_header_filter(r);
}
return ngx_http_next_header_filter(r);
}
- if (ngx_strncasecmp(r->headers_out.content_type.data,
- (u_char *) "text/html", sizeof("text/html") - 1)
- != 0)
- {
+ if (ngx_http_test_content_type(r, &conf->types) == NULL) {
return ngx_http_next_header_filter(r);
}
/*
* set by ngx_pcalloc():
*
- * conf->before_body.len = 0;
- * conf->before_body.date = NULL;
- * conf->after_body.len = 0;
- * conf->after_body.date = NULL;
+ * conf->before_body = { 0, NULL };
+ * conf->after_body = { 0, NULL };
+ * conf->types = { NULL };
+ * conf->types_keys = NULL;
*/
return conf;
ngx_conf_merge_str_value(conf->before_body, prev->before_body, "");
ngx_conf_merge_str_value(conf->after_body, prev->after_body, "");
+ if (ngx_http_merge_types(cf, conf->types_keys, &conf->types,
+ prev->types_keys, &prev->types,
+ ngx_http_html_default_types)
+ != NGX_OK)
+ {
+ return NGX_CONF_ERROR;
+ }
+
return NGX_CONF_OK;
}
ngx_int_t charset;
ngx_int_t source_charset;
ngx_flag_t override_charset;
+
+ ngx_hash_t types;
+ ngx_array_t *types_keys;
} ngx_http_charset_loc_conf_t;
static ngx_int_t ngx_http_charset_postconfiguration(ngx_conf_t *cf);
+ngx_str_t ngx_http_charset_default_types[] = {
+ ngx_string("text/html"),
+ ngx_string("text/css"),
+ ngx_string("text/xml"),
+ ngx_string("text/plain"),
+ ngx_string("text/vnd.wap.wml"),
+ ngx_string("application/x-javascript"),
+ ngx_string("application/rss+xml"),
+ ngx_null_string
+};
+
+
static ngx_command_t ngx_http_charset_filter_commands[] = {
{ ngx_string("charset"),
offsetof(ngx_http_charset_loc_conf_t, override_charset),
NULL },
+ { ngx_string("charset_types"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
+ ngx_http_types_slot,
+ NGX_HTTP_LOC_CONF_OFFSET,
+ offsetof(ngx_http_charset_loc_conf_t, types_keys),
+ &ngx_http_charset_default_types[0] },
+
{ ngx_string("charset_map"),
NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE2,
ngx_http_charset_map_block,
static ngx_int_t
ngx_http_charset_header_filter(ngx_http_request_t *r)
{
- u_char *ct;
ngx_int_t charset, source_charset;
ngx_str_t *mc, *from, *to, s;
ngx_uint_t n;
}
} else {
- ct = r->headers_out.content_type.data;
-
- if (ngx_strncasecmp(ct, (u_char *) "text/", 5) != 0
- && ngx_strncasecmp(ct,
- (u_char *) "application/x-javascript", 24)
- != 0)
- {
+ if (ngx_http_test_content_type(r, &mlcf->types) == NULL) {
return ngx_http_next_header_filter(r);
}
}
return NGX_CONF_ERROR;
}
+ /*
+ * set by ngx_pcalloc():
+ *
+ * lcf->types = { NULL };
+ * lcf->types_keys = NULL;
+ */
+
lcf->charset = NGX_CONF_UNSET;
lcf->source_charset = NGX_CONF_UNSET;
lcf->override_charset = NGX_CONF_UNSET;
recode->src = conf->source_charset;
recode->dst = conf->charset;
+ if (ngx_http_merge_types(cf, conf->types_keys, &conf->types,
+ prev->types_keys, &prev->types,
+ ngx_http_charset_default_types)
+ != NGX_OK)
+ {
+ return NGX_CONF_ERROR;
+ }
+
return NGX_CONF_OK;
}