annotate src/http/modules/ngx_http_charset_filter_module.c @ 196:8759b346e431 NGINX_0_3_45

nginx 0.3.45 *) Feature: the "ssl_verify_client", "ssl_verify_depth", and "ssl_client_certificate" directives. *) Change: the $request_method variable now returns the main request method. *) Change: the ° symbol codes were changed in koi-win conversion table. *) Feature: the euro и N symbols were added to koi-win conversion table. *) Bugfix: if nginx distributed the requests among several backends and some backend failed, then requests intended for this backend was directed to one live backend only instead of being distributed among the rest.
author Igor Sysoev <http://sysoev.ru>
date Sat, 06 May 2006 00:00:00 +0400
parents 71ff1e2b484a
children ca5f86d94316
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
12 #define NGX_HTTP_NO_CHARSET -2
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
13
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
14
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15 typedef struct {
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
16 u_char **tables;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
17 ngx_str_t name;
72
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
18
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
19 ngx_uint_t utf8; /* unsigned utf8:1; */
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
20 } ngx_http_charset_t;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
21
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
22
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23 typedef struct {
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
24 ngx_int_t src;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
25 ngx_int_t dst;
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
26 } ngx_http_charset_recode_t;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
27
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
28
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
29 typedef struct {
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
30 ngx_int_t src;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
31 ngx_int_t dst;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
32 u_char *src2dst;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
33 u_char *dst2src;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
34 } ngx_http_charset_tables_t;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
36
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37 typedef struct {
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
38 ngx_array_t charsets; /* ngx_http_charset_t */
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
39 ngx_array_t tables; /* ngx_http_charset_tables_t */
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
40 ngx_array_t recodes; /* ngx_http_charset_recode_t */
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
41 } ngx_http_charset_main_conf_t;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
42
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
44 typedef struct {
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
45 ngx_int_t charset;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
46 ngx_int_t source_charset;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
47 ngx_flag_t override_charset;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
48 } ngx_http_charset_loc_conf_t;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
49
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
51 typedef struct {
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
52 u_char *table;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
53 ngx_int_t charset;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
54 } ngx_http_charset_ctx_t;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
55
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
57 static ngx_uint_t ngx_http_charset_recode(ngx_buf_t *b, u_char *table);
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59 static char *ngx_charset_map_block(ngx_conf_t *cf, ngx_command_t *cmd,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60 void *conf);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
61 static char *ngx_charset_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
62
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
63 static char *ngx_http_set_charset_slot(ngx_conf_t *cf, ngx_command_t *cmd,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64 void *conf);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
65 static ngx_int_t ngx_http_add_charset(ngx_array_t *charsets, ngx_str_t *name);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
66
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
67 static ngx_int_t ngx_http_charset_filter_init(ngx_cycle_t *cycle);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
68
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
69 static void *ngx_http_charset_create_main_conf(ngx_conf_t *cf);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
70 static void *ngx_http_charset_create_loc_conf(ngx_conf_t *cf);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71 static char *ngx_http_charset_merge_loc_conf(ngx_conf_t *cf,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
72 void *parent, void *child);
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
73 static ngx_int_t ngx_http_charset_postconfiguration(ngx_conf_t *cf);
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
76 static ngx_command_t ngx_http_charset_filter_commands[] = {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
77
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
78 { ngx_string("charset"),
108
cf3d6edb3ad6 nginx 0.3.1
Igor Sysoev <http://sysoev.ru>
parents: 104
diff changeset
79 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF
cf3d6edb3ad6 nginx 0.3.1
Igor Sysoev <http://sysoev.ru>
parents: 104
diff changeset
80 |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
81 ngx_http_set_charset_slot,
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
82 NGX_HTTP_LOC_CONF_OFFSET,
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
83 offsetof(ngx_http_charset_loc_conf_t, charset),
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
84 NULL },
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
85
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
86 { ngx_string("source_charset"),
108
cf3d6edb3ad6 nginx 0.3.1
Igor Sysoev <http://sysoev.ru>
parents: 104
diff changeset
87 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF
cf3d6edb3ad6 nginx 0.3.1
Igor Sysoev <http://sysoev.ru>
parents: 104
diff changeset
88 |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
89 ngx_http_set_charset_slot,
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
90 NGX_HTTP_LOC_CONF_OFFSET,
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
91 offsetof(ngx_http_charset_loc_conf_t, source_charset),
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
92 NULL },
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
93
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
94 { ngx_string("override_charset"),
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
95 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
96 |NGX_HTTP_LIF_CONF|NGX_CONF_FLAG,
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
97 ngx_conf_set_flag_slot,
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
98 NGX_HTTP_LOC_CONF_OFFSET,
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
99 offsetof(ngx_http_charset_loc_conf_t, override_charset),
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
100 NULL },
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
101
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
102 { ngx_string("charset_map"),
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
103 NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE2,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
104 ngx_charset_map_block,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
105 NGX_HTTP_MAIN_CONF_OFFSET,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106 0,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
107 NULL },
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
108
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
109 ngx_null_command
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110 };
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
111
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
113 static ngx_http_module_t ngx_http_charset_filter_module_ctx = {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
114 NULL, /* preconfiguration */
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
115 ngx_http_charset_postconfiguration, /* postconfiguration */
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
117 ngx_http_charset_create_main_conf, /* create main configuration */
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
118 NULL, /* init main configuration */
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
119
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
120 NULL, /* create server configuration */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
121 NULL, /* merge server configuration */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
122
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
123 ngx_http_charset_create_loc_conf, /* create location configuration */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
124 ngx_http_charset_merge_loc_conf /* merge location configuration */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
125 };
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
126
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
127
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
128 ngx_module_t ngx_http_charset_filter_module = {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
129 NGX_MODULE_V1,
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
130 &ngx_http_charset_filter_module_ctx, /* module context */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
131 ngx_http_charset_filter_commands, /* module directives */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
132 NGX_HTTP_MODULE, /* module type */
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
133 NULL, /* init master */
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
134 ngx_http_charset_filter_init, /* init module */
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
135 NULL, /* init process */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
136 NULL, /* init thread */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
137 NULL, /* exit thread */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
138 NULL, /* exit process */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
139 NULL, /* exit master */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
140 NGX_MODULE_V1_PADDING
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
141 };
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
142
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
143
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
144 static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
145 static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
146
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
147
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
148 static ngx_int_t
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
149 ngx_http_charset_header_filter(ngx_http_request_t *r)
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
150 {
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
151 size_t len;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
152 u_char *p;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
153 ngx_int_t charset, source_charset;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
154 ngx_uint_t i;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
155 ngx_http_charset_t *charsets;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
156 ngx_http_charset_ctx_t *ctx;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
157 ngx_http_charset_loc_conf_t *lcf;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
158 ngx_http_charset_main_conf_t *mcf;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
159
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
160 mcf = ngx_http_get_module_main_conf(r, ngx_http_charset_filter_module);
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
161
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
162 ctx = ngx_http_get_module_ctx(r->main, ngx_http_charset_filter_module);
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
163
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
164 if (ctx == NULL) {
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
165 lcf = ngx_http_get_module_loc_conf(r->main,
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
166 ngx_http_charset_filter_module);
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
167 charset = lcf->charset;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
168
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
169 if (charset == NGX_HTTP_NO_CHARSET) {
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
170 return ngx_http_next_header_filter(r);
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
171 }
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
172
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
173 } else {
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
174 charset = ctx->charset;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
175 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
176
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
177 if (r->headers_out.content_type.len == 0) {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
178 return ngx_http_next_header_filter(r);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
179 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
180
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
181 if (ngx_strncasecmp(r->headers_out.content_type.data, "text/", 5) != 0
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
182 && ngx_strncasecmp(r->headers_out.content_type.data,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
183 "application/x-javascript", 24) != 0)
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
184 {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
185 return ngx_http_next_header_filter(r);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
186 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
187
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
188 charsets = mcf->charsets.elts;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
189
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
190 lcf = ngx_http_get_module_loc_conf(r, ngx_http_charset_filter_module);
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
191
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
192 len = 0;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
193
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
194 for (p = r->headers_out.content_type.data; *p; p++) {
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
195 if (*p == ';') {
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
196 len = p - r->headers_out.content_type.data;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
197 }
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
198
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
199 if (ngx_strncasecmp(p, "charset=", 8) != 0) {
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
200 continue;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
201 }
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
202
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
203 p += 8;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
204
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
205 for (i = 0; i < mcf->charsets.nelts; i++) {
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
206
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
207 if (ngx_strcasecmp(p, charsets[i].name.data) == 0) {
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
208
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
209 if (r == r->main && lcf->override_charset == 0) {
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
210 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_charset_ctx_t));
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
211 if (ctx == NULL) {
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
212 return NGX_ERROR;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
213 }
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
214
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
215 ngx_http_set_ctx(r, ctx, ngx_http_charset_filter_module);
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
216
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
217 ctx->charset = i;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
218
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
219 return ngx_http_next_header_filter(r);
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
220 }
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
221
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
222 if (i != (ngx_uint_t) charset
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
223 && (charsets[i].tables == NULL
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
224 || charsets[i].tables[charset] == NULL))
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
225 {
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
226 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
227 "no \"charset_map\" between the charsets "
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
228 "\"%V\" and \"%V\"",
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
229 &charsets[i].name, &charsets[charset].name);
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
230
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
231 return ngx_http_next_header_filter(r);
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
232 }
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
233
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
234 r->headers_out.content_type.len = len;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
235
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
236 if (r->headers_out.status == NGX_HTTP_MOVED_PERMANENTLY
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
237 || r->headers_out.status == NGX_HTTP_MOVED_TEMPORARILY)
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
238 {
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
239 /*
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
240 * do not set charset for the redirect because NN 4.x
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
241 * uses this charset instead of the next page charset
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
242 */
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
243
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
244 r->headers_out.charset.len = 0;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
245 return ngx_http_next_header_filter(r);
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
246 }
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
247
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
248 source_charset = i;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
249
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
250 goto found;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
251 }
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
252 }
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
253
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
254 return ngx_http_next_header_filter(r);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
255 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
256
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
257 if (r->headers_out.status == NGX_HTTP_MOVED_PERMANENTLY
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
258 || r->headers_out.status == NGX_HTTP_MOVED_TEMPORARILY)
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
259 {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
260 /*
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
261 * do not set charset for the redirect because NN 4.x
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
262 * use this charset instead of the next page charset
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
263 */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
264
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
265 r->headers_out.charset.len = 0;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
266 return ngx_http_next_header_filter(r);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
267 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
268
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
269 if (r->headers_out.charset.len) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
270 return ngx_http_next_header_filter(r);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
271 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
272
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
273 source_charset = lcf->source_charset;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
274
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
275 found:
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
276
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
277 r->headers_out.charset = charsets[charset].name;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
278 r->utf8 = charsets[charset].utf8;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
279
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
280 if (source_charset == NGX_CONF_UNSET || source_charset == charset) {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
281 return ngx_http_next_header_filter(r);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
282 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
283
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
284 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_charset_ctx_t));
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
285 if (ctx == NULL) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
286 return NGX_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
287 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
288
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
289 ngx_http_set_ctx(r, ctx, ngx_http_charset_filter_module);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
290
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
291 ctx->table = charsets[source_charset].tables[charset];
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
292 ctx->charset = charset;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
293
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
294 r->filter_need_in_memory = 1;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
295
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
296 return ngx_http_next_header_filter(r);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
297 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
298
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
299
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
300 static ngx_int_t
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
301 ngx_http_charset_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
302 {
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
303 ngx_chain_t *cl;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
304 ngx_http_charset_ctx_t *ctx;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
305
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
306 ctx = ngx_http_get_module_ctx(r, ngx_http_charset_filter_module);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
307
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
308 if (ctx == NULL || ctx->table == NULL) {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
309 return ngx_http_next_body_filter(r, in);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
310 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
311
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
312 for (cl = in; cl; cl = cl->next) {
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
313 (void) ngx_http_charset_recode(cl->buf, ctx->table);
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
314 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
315
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
316 return ngx_http_next_body_filter(r, in);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
317 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
318
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
319
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
320 static ngx_uint_t
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
321 ngx_http_charset_recode(ngx_buf_t *b, u_char *table)
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
322 {
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
323 u_char *p;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
324
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
325 for (p = b->pos; p < b->last; p++) {
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
326
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
327 if (*p == table[*p]) {
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
328 continue;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
329 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
330
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
331 while (p < b->last) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
332 *p = table[*p];
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
333 p++;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
334 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
335
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
336 b->in_file = 0;
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
337
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
338 return 1;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
339 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
340
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
341 return 0;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
342 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
343
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
344
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
345 static char *
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
346 ngx_charset_map_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
347 {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
348 ngx_http_charset_main_conf_t *mcf = conf;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
349
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
350 char *rv;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
351 ngx_int_t src, dst;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
352 ngx_uint_t i;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
353 ngx_str_t *value;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
354 ngx_conf_t pvcf;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
355 ngx_http_charset_tables_t *table;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
356
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
357 value = cf->args->elts;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
358
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
359 src = ngx_http_add_charset(&mcf->charsets, &value[1]);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
360 if (src == NGX_ERROR) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
361 return NGX_CONF_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
362 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
363
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
364 dst = ngx_http_add_charset(&mcf->charsets, &value[2]);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
365 if (dst == NGX_ERROR) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
366 return NGX_CONF_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
367 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
368
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
369 if (src == dst) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
370 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
371 "\"charset_map\" between the same charsets "
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
372 "\"%V\" and \"%V\"", &value[1], &value[2]);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
373 return NGX_CONF_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
374 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
375
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
376 table = mcf->tables.elts;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
377 for (i = 0; i < mcf->tables.nelts; i++) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
378 if ((src == table->src && dst == table->dst)
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
379 || (src == table->dst && dst == table->src))
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
380 {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
381 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
382 "duplicate \"charset_map\" between "
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
383 "\"%V\" and \"%V\"", &value[1], &value[2]);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
384 return NGX_CONF_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
385 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
386 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
387
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
388 table = ngx_array_push(&mcf->tables);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
389 if (table == NULL) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
390 return NGX_CONF_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
391 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
392
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
393 table->src = src;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
394 table->dst = dst;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
395
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
396 table->src2dst = ngx_palloc(cf->pool, 256);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
397 if (table->src2dst == NULL) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
398 return NGX_CONF_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
399 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
400
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
401 table->dst2src = ngx_palloc(cf->pool, 256);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
402 if (table->dst2src == NULL) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
403 return NGX_CONF_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
404 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
405
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
406 for (i = 0; i < 128; i++) {
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
407 table->src2dst[i] = (u_char) i;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
408 table->dst2src[i] = (u_char) i;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
409 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
410
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
411 for (/* void */; i < 256; i++) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
412 table->src2dst[i] = '?';
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
413 table->dst2src[i] = '?';
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
414 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
415
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
416 pvcf = *cf;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
417 cf->ctx = table;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
418 cf->handler = ngx_charset_map;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
419 cf->handler_conf = conf;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
420
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
421 rv = ngx_conf_parse(cf, NULL);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
422
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
423 *cf = pvcf;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
424
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
425 return rv;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
426 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
427
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
428
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
429 static char *
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
430 ngx_charset_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
431 {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
432 ngx_int_t src, dst;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
433 ngx_str_t *value;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
434 ngx_http_charset_tables_t *table;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
435
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
436 if (cf->args->nelts != 2) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
437 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid parameters number");
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
438 return NGX_CONF_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
439 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
440
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
441 value = cf->args->elts;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
442
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
443 src = ngx_hextoi(value[0].data, value[0].len);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
444 if (src == NGX_ERROR || src > 255) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
445 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
446 "invalid value \"%V\"", &value[0]);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
447 return NGX_CONF_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
448 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
449
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
450 dst = ngx_hextoi(value[1].data, value[1].len);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
451 if (dst == NGX_ERROR || dst > 255) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
452 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
453 "invalid value \"%V\"", &value[1]);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
454 return NGX_CONF_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
455 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
456
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
457 table = cf->ctx;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
458
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
459 table->src2dst[src] = (u_char) dst;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
460 table->dst2src[dst] = (u_char) src;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
461
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
462 return NGX_CONF_OK;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
463 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
464
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
465
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
466 static char *
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
467 ngx_http_set_charset_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
468 {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
469 char *p = conf;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
470
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
471 ngx_int_t *cp;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
472 ngx_str_t *value;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
473 ngx_http_charset_main_conf_t *mcf;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
474
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
475 cp = (ngx_int_t *) (p + cmd->offset);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
476
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
477 if (*cp != NGX_CONF_UNSET) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
478 return "is duplicate";
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
479 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
480
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
481 value = cf->args->elts;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
482
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
483 if (cmd->offset == offsetof(ngx_http_charset_loc_conf_t, charset)
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
484 && ngx_strcmp(value[1].data, "off") == 0)
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
485 {
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
486 *cp = NGX_HTTP_NO_CHARSET;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
487 return NGX_CONF_OK;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
488 }
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
489
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
490 mcf = ngx_http_conf_get_module_main_conf(cf,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
491 ngx_http_charset_filter_module);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
492
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
493 *cp = ngx_http_add_charset(&mcf->charsets, &value[1]);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
494 if (*cp == NGX_ERROR) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
495 return NGX_CONF_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
496 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
497
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
498 return NGX_CONF_OK;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
499 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
500
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
501
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
502 static ngx_int_t
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
503 ngx_http_add_charset(ngx_array_t *charsets, ngx_str_t *name)
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
504 {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
505 ngx_uint_t i;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
506 ngx_http_charset_t *c;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
507
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
508 c = charsets->elts;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
509 for (i = 0; i < charsets->nelts; i++) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
510 if (name->len != c[i].name.len) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
511 continue;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
512 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
513
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
514 if (ngx_strcasecmp(name->data, c[i].name.data) == 0) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
515 break;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
516 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
517 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
518
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
519 if (i < charsets->nelts) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
520 return i;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
521 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
522
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
523 c = ngx_array_push(charsets);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
524 if (c == NULL) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
525 return NGX_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
526 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
527
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
528 c->tables = NULL;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
529 c->name = *name;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
530
72
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
531 if (ngx_strcasecmp(name->data, "utf-8") == 0) {
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
532 c->utf8 = 1;
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
533 }
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
534
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
535 return i;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
536 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
537
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
538
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
539 static ngx_int_t
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
540 ngx_http_charset_filter_init(ngx_cycle_t *cycle)
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
541 {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
542 ngx_http_next_header_filter = ngx_http_top_header_filter;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
543 ngx_http_top_header_filter = ngx_http_charset_header_filter;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
544
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
545 ngx_http_next_body_filter = ngx_http_top_body_filter;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
546 ngx_http_top_body_filter = ngx_http_charset_body_filter;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
547
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
548 return NGX_OK;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
549 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
550
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
551
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
552 static void *
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
553 ngx_http_charset_create_main_conf(ngx_conf_t *cf)
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
554 {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
555 ngx_http_charset_main_conf_t *mcf;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
556
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
557 mcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_charset_main_conf_t));
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
558 if (mcf == NULL) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
559 return NGX_CONF_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
560 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
561
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
562 if (ngx_array_init(&mcf->charsets, cf->pool, 2, sizeof(ngx_http_charset_t))
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
563 == NGX_ERROR)
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
564 {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
565 return NGX_CONF_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
566 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
567
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
568 if (ngx_array_init(&mcf->tables, cf->pool, 1,
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
569 sizeof(ngx_http_charset_tables_t)) == NGX_ERROR)
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
570 {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
571 return NGX_CONF_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
572 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
573
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
574 if (ngx_array_init(&mcf->recodes, cf->pool, 2,
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
575 sizeof(ngx_http_charset_recode_t)) == NGX_ERROR)
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
576 {
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
577 return NGX_CONF_ERROR;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
578 }
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
579
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
580 return mcf;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
581 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
582
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
583
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
584 static void *
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
585 ngx_http_charset_create_loc_conf(ngx_conf_t *cf)
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
586 {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
587 ngx_http_charset_loc_conf_t *lcf;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
588
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
589 lcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_charset_loc_conf_t));
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
590 if (lcf == NULL) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
591 return NGX_CONF_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
592 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
593
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
594 lcf->charset = NGX_CONF_UNSET;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
595 lcf->source_charset = NGX_CONF_UNSET;
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
596 lcf->override_charset = NGX_CONF_UNSET;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
597
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
598 return lcf;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
599 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
600
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
601
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
602 static char *
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
603 ngx_http_charset_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
604 {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
605 ngx_http_charset_loc_conf_t *prev = parent;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
606 ngx_http_charset_loc_conf_t *conf = child;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
607
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
608 ngx_uint_t i;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
609 ngx_http_charset_recode_t *recode;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
610 ngx_http_charset_main_conf_t *mcf;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
611
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
612 ngx_conf_merge_value(conf->override_charset, prev->override_charset, 0);
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
613 ngx_conf_merge_value(conf->charset, prev->charset, NGX_HTTP_NO_CHARSET);
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
614
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
615 if (conf->source_charset == NGX_CONF_UNSET) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
616 conf->source_charset = prev->source_charset;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
617 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
618
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
619 if (conf->charset == NGX_HTTP_NO_CHARSET
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
620 || conf->source_charset == NGX_CONF_UNSET
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
621 || conf->charset == conf->source_charset)
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
622 {
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
623 return NGX_CONF_OK;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
624 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
625
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
626 mcf = ngx_http_conf_get_module_main_conf(cf,
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
627 ngx_http_charset_filter_module);
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
628 recode = mcf->recodes.elts;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
629 for (i = 0; i < mcf->recodes.nelts; i++) {
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
630 if (conf->source_charset == recode[i].src
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
631 && conf->charset == recode[i].dst)
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
632 {
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
633 return NGX_CONF_OK;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
634 }
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
635 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
636
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
637 recode = ngx_array_push(&mcf->recodes);
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
638 if (recode == NULL) {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
639 return NGX_CONF_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
640 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
641
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
642 recode->src = conf->source_charset;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
643 recode->dst = conf->charset;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
644
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
645 return NGX_CONF_OK;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
646 }
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
647
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
648
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
649 static ngx_int_t
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
650 ngx_http_charset_postconfiguration(ngx_conf_t *cf)
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
651 {
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
652 u_char **src, **dst;
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
653 ngx_int_t c;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
654 ngx_uint_t i, t;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
655 ngx_http_charset_t *charset;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
656 ngx_http_charset_recode_t *recode;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
657 ngx_http_charset_tables_t *tables;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
658 ngx_http_charset_main_conf_t *mcf;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
659
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
660 mcf = ngx_http_conf_get_module_main_conf(cf,
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
661 ngx_http_charset_filter_module);
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
662
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
663 recode = mcf->recodes.elts;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
664 tables = mcf->tables.elts;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
665 charset = mcf->charsets.elts;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
666
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
667 for (i = 0; i < mcf->recodes.nelts; i++) {
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
668
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
669 c = recode[i].src;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
670
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
671 for (t = 0; t < mcf->tables.nelts; t++) {
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
672
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
673 if (c == tables[t].src && recode[i].dst == tables[t].dst) {
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
674 goto next;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
675 }
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
676
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
677 if (c == tables[t].dst && recode[i].dst == tables[t].src) {
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
678 goto next;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
679 }
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
680 }
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
681
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
682 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
683 " no \"charset_map\" between the charsets "
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
684 "\"%V\" and \"%V\"",
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
685 &charset[c].name, &charset[recode[i].dst].name);
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
686 return NGX_ERROR;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
687
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
688 next:
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
689 continue;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
690 }
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
691
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
692
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
693 for (t = 0; t < mcf->tables.nelts; t++) {
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
694
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
695 src = charset[tables[t].src].tables;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
696
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
697 if (src == NULL) {
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
698 src = ngx_pcalloc(cf->pool, sizeof(u_char *) * mcf->charsets.nelts);
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
699 if (src == NULL) {
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
700 return NGX_ERROR;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
701 }
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
702
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
703 charset[tables[t].src].tables = src;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
704 }
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
705
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
706 dst = charset[tables[t].dst].tables;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
707
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
708 if (dst == NULL) {
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
709 dst = ngx_pcalloc(cf->pool, sizeof(u_char *) * mcf->charsets.nelts);
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
710 if (dst == NULL) {
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
711 return NGX_ERROR;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
712 }
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
713
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
714 charset[tables[t].dst].tables = dst;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
715 }
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
716
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
717 src[tables[t].dst] = tables[t].src2dst;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
718 dst[tables[t].src] = tables[t].dst2src;
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
719 }
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
720
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
721 return NGX_OK;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
722 }