Mercurial > hg > nginx-quic
annotate src/http/modules/ngx_http_xslt_filter_module.c @ 4622:0dfdc3f732cb
Upstream: fixed ip_hash rebalancing with the "down" flag.
Due to weight being set to 0 for down peers, order of peers after sorting
wasn't the same as without the "down" flag (with down peers at the end),
resulting in client rebalancing for clients on other servers. The only
rebalancing which should happen after adding "down" to a server is one
for clients on the server.
The problem was introduced in r1377 (which fixed endless loop by setting
weight to 0 for down servers). The loop is no longer possible with new
smooth algorithm, so preserving original weight is safe.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 14 May 2012 09:58:07 +0000 |
parents | 1a11e4a8877a |
children | 959371df1806 |
rev | line source |
---|---|
2139 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4412 | 4 * Copyright (C) Nginx, Inc. |
2139 | 5 */ |
6 | |
7 | |
8 #include <ngx_config.h> | |
9 #include <ngx_core.h> | |
10 #include <ngx_http.h> | |
11 | |
12 #include <libxml/parser.h> | |
13 #include <libxml/tree.h> | |
14 #include <libxslt/xslt.h> | |
15 #include <libxslt/xsltInternals.h> | |
16 #include <libxslt/transform.h> | |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
17 #include <libxslt/variables.h> |
2139 | 18 #include <libxslt/xsltutils.h> |
19 | |
2299 | 20 #if (NGX_HAVE_EXSLT) |
21 #include <libexslt/exslt.h> | |
22 #endif | |
23 | |
2139 | 24 |
25 #ifndef NGX_HTTP_XSLT_REUSE_DTD | |
26 #define NGX_HTTP_XSLT_REUSE_DTD 1 | |
27 #endif | |
28 | |
29 | |
30 typedef struct { | |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
31 u_char *name; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
32 void *data; |
2156
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
33 } ngx_http_xslt_file_t; |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
34 |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
35 |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
36 typedef struct { |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
37 ngx_array_t dtd_files; /* ngx_http_xslt_file_t */ |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
38 ngx_array_t sheet_files; /* ngx_http_xslt_file_t */ |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
39 } ngx_http_xslt_filter_main_conf_t; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
40 |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
41 |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
42 typedef struct { |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
43 u_char *name; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
44 ngx_http_complex_value_t value; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
45 ngx_uint_t quote; /* unsigned quote:1; */ |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
46 } ngx_http_xslt_param_t; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
47 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
48 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
49 typedef struct { |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
50 xsltStylesheetPtr stylesheet; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
51 ngx_array_t params; /* ngx_http_xslt_param_t */ |
2139 | 52 } ngx_http_xslt_sheet_t; |
53 | |
54 | |
55 typedef struct { | |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
56 xmlDtdPtr dtd; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
57 ngx_array_t sheets; /* ngx_http_xslt_sheet_t */ |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
58 ngx_hash_t types; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
59 ngx_array_t *types_keys; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
60 ngx_array_t *params; /* ngx_http_xslt_param_t */ |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
61 } ngx_http_xslt_filter_loc_conf_t; |
2139 | 62 |
63 | |
64 typedef struct { | |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
65 xmlDocPtr doc; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
66 xmlParserCtxtPtr ctxt; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
67 xsltTransformContextPtr transform; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
68 ngx_http_request_t *request; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
69 ngx_array_t params; |
2153
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
70 |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
71 ngx_uint_t done; /* unsigned done:1; */ |
2139 | 72 } ngx_http_xslt_filter_ctx_t; |
73 | |
74 | |
75 static ngx_int_t ngx_http_xslt_send(ngx_http_request_t *r, | |
76 ngx_http_xslt_filter_ctx_t *ctx, ngx_buf_t *b); | |
77 static ngx_int_t ngx_http_xslt_add_chunk(ngx_http_request_t *r, | |
78 ngx_http_xslt_filter_ctx_t *ctx, ngx_buf_t *b); | |
79 | |
80 | |
81 static void ngx_http_xslt_sax_external_subset(void *data, const xmlChar *name, | |
82 const xmlChar *externalId, const xmlChar *systemId); | |
83 static void ngx_cdecl ngx_http_xslt_sax_error(void *data, const char *msg, ...); | |
84 | |
85 | |
86 static ngx_buf_t *ngx_http_xslt_apply_stylesheet(ngx_http_request_t *r, | |
87 ngx_http_xslt_filter_ctx_t *ctx); | |
88 static ngx_int_t ngx_http_xslt_params(ngx_http_request_t *r, | |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
89 ngx_http_xslt_filter_ctx_t *ctx, ngx_array_t *params, ngx_uint_t final); |
2153
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
90 static u_char *ngx_http_xslt_content_type(xsltStylesheetPtr s); |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
91 static u_char *ngx_http_xslt_encoding(xsltStylesheetPtr s); |
2139 | 92 static void ngx_http_xslt_cleanup(void *data); |
93 | |
94 static char *ngx_http_xslt_entities(ngx_conf_t *cf, ngx_command_t *cmd, | |
95 void *conf); | |
96 static char *ngx_http_xslt_stylesheet(ngx_conf_t *cf, ngx_command_t *cmd, | |
97 void *conf); | |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
98 static char *ngx_http_xslt_param(ngx_conf_t *cf, ngx_command_t *cmd, |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
99 void *conf); |
2156
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
100 static void ngx_http_xslt_cleanup_dtd(void *data); |
2139 | 101 static void ngx_http_xslt_cleanup_stylesheet(void *data); |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
102 static void *ngx_http_xslt_filter_create_main_conf(ngx_conf_t *cf); |
2139 | 103 static void *ngx_http_xslt_filter_create_conf(ngx_conf_t *cf); |
104 static char *ngx_http_xslt_filter_merge_conf(ngx_conf_t *cf, void *parent, | |
105 void *child); | |
106 static ngx_int_t ngx_http_xslt_filter_init(ngx_conf_t *cf); | |
2196
fab3fa7339ff
call ngx_http_xslt_filter_exit()
Igor Sysoev <igor@sysoev.ru>
parents:
2159
diff
changeset
|
107 static void ngx_http_xslt_filter_exit(ngx_cycle_t *cycle); |
2139 | 108 |
109 | |
110 ngx_str_t ngx_http_xslt_default_types[] = { | |
111 ngx_string("text/xml"), | |
112 ngx_null_string | |
113 }; | |
114 | |
115 | |
116 static ngx_command_t ngx_http_xslt_filter_commands[] = { | |
117 | |
118 { ngx_string("xml_entities"), | |
2150
50cede290146
fix xslt module context levels
Igor Sysoev <igor@sysoev.ru>
parents:
2148
diff
changeset
|
119 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
2139 | 120 ngx_http_xslt_entities, |
121 NGX_HTTP_LOC_CONF_OFFSET, | |
122 0, | |
123 NULL }, | |
124 | |
125 { ngx_string("xslt_stylesheet"), | |
2151
c8331f70d799
xslt_stylesheet should be valid for location only
Igor Sysoev <igor@sysoev.ru>
parents:
2150
diff
changeset
|
126 NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, |
2139 | 127 ngx_http_xslt_stylesheet, |
128 NGX_HTTP_LOC_CONF_OFFSET, | |
129 0, | |
130 NULL }, | |
131 | |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
132 { ngx_string("xslt_param"), |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
133 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
134 ngx_http_xslt_param, |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
135 NGX_HTTP_LOC_CONF_OFFSET, |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
136 0, |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
137 NULL }, |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
138 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
139 { ngx_string("xslt_string_param"), |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
140 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
141 ngx_http_xslt_param, |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
142 NGX_HTTP_LOC_CONF_OFFSET, |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
143 0, |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
144 (void *) 1 }, |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
145 |
2139 | 146 { ngx_string("xslt_types"), |
2150
50cede290146
fix xslt module context levels
Igor Sysoev <igor@sysoev.ru>
parents:
2148
diff
changeset
|
147 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, |
2139 | 148 ngx_http_types_slot, |
149 NGX_HTTP_LOC_CONF_OFFSET, | |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
150 offsetof(ngx_http_xslt_filter_loc_conf_t, types_keys), |
2139 | 151 &ngx_http_xslt_default_types[0] }, |
152 | |
153 ngx_null_command | |
154 }; | |
155 | |
156 | |
157 static ngx_http_module_t ngx_http_xslt_filter_module_ctx = { | |
158 NULL, /* preconfiguration */ | |
159 ngx_http_xslt_filter_init, /* postconfiguration */ | |
160 | |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
161 ngx_http_xslt_filter_create_main_conf, /* create main configuration */ |
2139 | 162 NULL, /* init main configuration */ |
163 | |
164 NULL, /* create server configuration */ | |
165 NULL, /* merge server configuration */ | |
166 | |
167 ngx_http_xslt_filter_create_conf, /* create location configuration */ | |
168 ngx_http_xslt_filter_merge_conf /* merge location configuration */ | |
169 }; | |
170 | |
171 | |
172 ngx_module_t ngx_http_xslt_filter_module = { | |
173 NGX_MODULE_V1, | |
174 &ngx_http_xslt_filter_module_ctx, /* module context */ | |
175 ngx_http_xslt_filter_commands, /* module directives */ | |
176 NGX_HTTP_MODULE, /* module type */ | |
177 NULL, /* init master */ | |
178 NULL, /* init module */ | |
179 NULL, /* init process */ | |
180 NULL, /* init thread */ | |
181 NULL, /* exit thread */ | |
2983 | 182 ngx_http_xslt_filter_exit, /* exit process */ |
2196
fab3fa7339ff
call ngx_http_xslt_filter_exit()
Igor Sysoev <igor@sysoev.ru>
parents:
2159
diff
changeset
|
183 ngx_http_xslt_filter_exit, /* exit master */ |
2139 | 184 NGX_MODULE_V1_PADDING |
185 }; | |
186 | |
187 | |
188 static ngx_http_output_header_filter_pt ngx_http_next_header_filter; | |
189 static ngx_http_output_body_filter_pt ngx_http_next_body_filter; | |
190 | |
191 | |
192 static ngx_int_t | |
193 ngx_http_xslt_header_filter(ngx_http_request_t *r) | |
194 { | |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
195 ngx_http_xslt_filter_ctx_t *ctx; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
196 ngx_http_xslt_filter_loc_conf_t *conf; |
2139 | 197 |
198 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
199 "xslt filter header"); | |
200 | |
201 if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED) { | |
202 return ngx_http_next_header_filter(r); | |
203 } | |
204 | |
205 conf = ngx_http_get_module_loc_conf(r, ngx_http_xslt_filter_module); | |
206 | |
207 if (conf->sheets.nelts == 0 | |
2148 | 208 || ngx_http_test_content_type(r, &conf->types) == NULL) |
2139 | 209 { |
210 return ngx_http_next_header_filter(r); | |
211 } | |
212 | |
213 ctx = ngx_http_get_module_ctx(r, ngx_http_xslt_filter_module); | |
214 | |
215 if (ctx) { | |
216 return ngx_http_next_header_filter(r); | |
217 } | |
218 | |
219 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_xslt_filter_ctx_t)); | |
220 if (ctx == NULL) { | |
221 return NGX_ERROR; | |
222 } | |
223 | |
224 ngx_http_set_ctx(r, ctx, ngx_http_xslt_filter_module); | |
225 | |
226 r->main_filter_need_in_memory = 1; | |
227 | |
228 return NGX_OK; | |
229 } | |
230 | |
231 | |
232 static ngx_int_t | |
233 ngx_http_xslt_body_filter(ngx_http_request_t *r, ngx_chain_t *in) | |
234 { | |
2984
097c1242995b
preserve XML wellFormed field before freeing memory
Igor Sysoev <igor@sysoev.ru>
parents:
2983
diff
changeset
|
235 int wellFormed; |
2139 | 236 ngx_chain_t *cl; |
237 ngx_http_xslt_filter_ctx_t *ctx; | |
238 | |
239 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
240 "xslt filter body"); | |
241 | |
242 if (in == NULL) { | |
243 return ngx_http_next_body_filter(r, in); | |
244 } | |
245 | |
246 ctx = ngx_http_get_module_ctx(r, ngx_http_xslt_filter_module); | |
247 | |
248 if (ctx == NULL || ctx->done) { | |
249 return ngx_http_next_body_filter(r, in); | |
250 } | |
251 | |
252 for (cl = in; cl; cl = cl->next) { | |
253 | |
254 if (ngx_http_xslt_add_chunk(r, ctx, cl->buf) != NGX_OK) { | |
255 | |
3642 | 256 if (ctx->ctxt->myDoc) { |
2139 | 257 |
258 #if (NGX_HTTP_XSLT_REUSE_DTD) | |
259 ctx->ctxt->myDoc->extSubset = NULL; | |
260 #endif | |
261 xmlFreeDoc(ctx->ctxt->myDoc); | |
262 } | |
263 | |
264 xmlFreeParserCtxt(ctx->ctxt); | |
265 | |
266 return ngx_http_xslt_send(r, ctx, NULL); | |
267 } | |
268 | |
2899
61d5b945730a
fix XSLT filter in SSI subrequests
Igor Sysoev <igor@sysoev.ru>
parents:
2882
diff
changeset
|
269 if (cl->buf->last_buf || cl->buf->last_in_chain) { |
2139 | 270 |
271 ctx->doc = ctx->ctxt->myDoc; | |
272 | |
273 #if (NGX_HTTP_XSLT_REUSE_DTD) | |
274 ctx->doc->extSubset = NULL; | |
275 #endif | |
276 | |
2984
097c1242995b
preserve XML wellFormed field before freeing memory
Igor Sysoev <igor@sysoev.ru>
parents:
2983
diff
changeset
|
277 wellFormed = ctx->ctxt->wellFormed; |
097c1242995b
preserve XML wellFormed field before freeing memory
Igor Sysoev <igor@sysoev.ru>
parents:
2983
diff
changeset
|
278 |
2139 | 279 xmlFreeParserCtxt(ctx->ctxt); |
280 | |
2984
097c1242995b
preserve XML wellFormed field before freeing memory
Igor Sysoev <igor@sysoev.ru>
parents:
2983
diff
changeset
|
281 if (wellFormed) { |
2139 | 282 return ngx_http_xslt_send(r, ctx, |
283 ngx_http_xslt_apply_stylesheet(r, ctx)); | |
284 } | |
285 | |
286 xmlFreeDoc(ctx->doc); | |
287 | |
288 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
289 "not well formed XML document"); | |
290 | |
291 return ngx_http_xslt_send(r, ctx, NULL); | |
292 } | |
293 } | |
294 | |
295 return NGX_OK; | |
296 } | |
297 | |
298 | |
299 static ngx_int_t | |
300 ngx_http_xslt_send(ngx_http_request_t *r, ngx_http_xslt_filter_ctx_t *ctx, | |
301 ngx_buf_t *b) | |
302 { | |
303 ngx_int_t rc; | |
304 ngx_chain_t out; | |
305 ngx_pool_cleanup_t *cln; | |
306 | |
307 ctx->done = 1; | |
308 | |
309 if (b == NULL) { | |
2821
26e06e009ced
allow to pass image filter errors via the same location where the filter is set
Igor Sysoev <igor@sysoev.ru>
parents:
2787
diff
changeset
|
310 return ngx_http_filter_finalize_request(r, NULL, |
2787
3daf68f2efe3
ngx_http_filter_finalize_request() and ngx_http_clean_header()
Igor Sysoev <igor@sysoev.ru>
parents:
2588
diff
changeset
|
311 NGX_HTTP_INTERNAL_SERVER_ERROR); |
2139 | 312 } |
313 | |
314 cln = ngx_pool_cleanup_add(r->pool, 0); | |
315 | |
316 if (cln == NULL) { | |
317 ngx_free(b->pos); | |
2821
26e06e009ced
allow to pass image filter errors via the same location where the filter is set
Igor Sysoev <igor@sysoev.ru>
parents:
2787
diff
changeset
|
318 return ngx_http_filter_finalize_request(r, NULL, |
2139 | 319 NGX_HTTP_INTERNAL_SERVER_ERROR); |
320 } | |
321 | |
2159
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
322 if (r == r->main) { |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
323 r->headers_out.content_length_n = b->last - b->pos; |
2139 | 324 |
2159
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
325 if (r->headers_out.content_length) { |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
326 r->headers_out.content_length->hash = 0; |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
327 r->headers_out.content_length = NULL; |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
328 } |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
329 |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
330 ngx_http_clear_last_modified(r); |
2139 | 331 } |
332 | |
333 rc = ngx_http_next_header_filter(r); | |
334 | |
335 if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { | |
336 ngx_free(b->pos); | |
337 return rc; | |
338 } | |
339 | |
340 cln->handler = ngx_http_xslt_cleanup; | |
341 cln->data = b->pos; | |
342 | |
343 out.buf = b; | |
344 out.next = NULL; | |
345 | |
346 return ngx_http_next_body_filter(r, &out); | |
347 } | |
348 | |
349 | |
350 static ngx_int_t | |
351 ngx_http_xslt_add_chunk(ngx_http_request_t *r, ngx_http_xslt_filter_ctx_t *ctx, | |
352 ngx_buf_t *b) | |
353 { | |
3686
47c1a9bff989
use xmlSAXHandler._private field to store xslt filter context
Igor Sysoev <igor@sysoev.ru>
parents:
3642
diff
changeset
|
354 int err; |
47c1a9bff989
use xmlSAXHandler._private field to store xslt filter context
Igor Sysoev <igor@sysoev.ru>
parents:
3642
diff
changeset
|
355 xmlParserCtxtPtr ctxt; |
2139 | 356 |
357 if (ctx->ctxt == NULL) { | |
358 | |
359 ctxt = xmlCreatePushParserCtxt(NULL, NULL, NULL, 0, NULL); | |
360 if (ctxt == NULL) { | |
361 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
362 "xmlCreatePushParserCtxt() failed"); | |
363 return NGX_ERROR; | |
364 } | |
4560
1a11e4a8877a
Xslt: parser options now set with xmlCtxtUseOptions().
Maxim Dounin <mdounin@mdounin.ru>
parents:
4554
diff
changeset
|
365 xmlCtxtUseOptions(ctxt, XML_PARSE_NOENT|XML_PARSE_DTDLOAD |
1a11e4a8877a
Xslt: parser options now set with xmlCtxtUseOptions().
Maxim Dounin <mdounin@mdounin.ru>
parents:
4554
diff
changeset
|
366 |XML_PARSE_NOWARNING); |
2139 | 367 |
3686
47c1a9bff989
use xmlSAXHandler._private field to store xslt filter context
Igor Sysoev <igor@sysoev.ru>
parents:
3642
diff
changeset
|
368 ctxt->sax->externalSubset = ngx_http_xslt_sax_external_subset; |
47c1a9bff989
use xmlSAXHandler._private field to store xslt filter context
Igor Sysoev <igor@sysoev.ru>
parents:
3642
diff
changeset
|
369 ctxt->sax->setDocumentLocator = NULL; |
47c1a9bff989
use xmlSAXHandler._private field to store xslt filter context
Igor Sysoev <igor@sysoev.ru>
parents:
3642
diff
changeset
|
370 ctxt->sax->error = ngx_http_xslt_sax_error; |
47c1a9bff989
use xmlSAXHandler._private field to store xslt filter context
Igor Sysoev <igor@sysoev.ru>
parents:
3642
diff
changeset
|
371 ctxt->sax->fatalError = ngx_http_xslt_sax_error; |
47c1a9bff989
use xmlSAXHandler._private field to store xslt filter context
Igor Sysoev <igor@sysoev.ru>
parents:
3642
diff
changeset
|
372 ctxt->sax->_private = ctx; |
2139 | 373 |
374 ctx->ctxt = ctxt; | |
375 ctx->request = r; | |
376 } | |
377 | |
2899
61d5b945730a
fix XSLT filter in SSI subrequests
Igor Sysoev <igor@sysoev.ru>
parents:
2882
diff
changeset
|
378 err = xmlParseChunk(ctx->ctxt, (char *) b->pos, (int) (b->last - b->pos), |
61d5b945730a
fix XSLT filter in SSI subrequests
Igor Sysoev <igor@sysoev.ru>
parents:
2882
diff
changeset
|
379 (b->last_buf) || (b->last_in_chain)); |
2139 | 380 |
381 if (err == 0) { | |
382 b->pos = b->last; | |
383 return NGX_OK; | |
384 } | |
385 | |
386 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
387 "xmlParseChunk() failed, error:%d", err); | |
388 | |
389 return NGX_ERROR; | |
390 } | |
391 | |
392 | |
393 static void | |
394 ngx_http_xslt_sax_external_subset(void *data, const xmlChar *name, | |
395 const xmlChar *externalId, const xmlChar *systemId) | |
396 { | |
3686
47c1a9bff989
use xmlSAXHandler._private field to store xslt filter context
Igor Sysoev <igor@sysoev.ru>
parents:
3642
diff
changeset
|
397 xmlParserCtxtPtr ctxt = data; |
2139 | 398 |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
399 xmlDocPtr doc; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
400 xmlDtdPtr dtd; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
401 ngx_http_request_t *r; |
3686
47c1a9bff989
use xmlSAXHandler._private field to store xslt filter context
Igor Sysoev <igor@sysoev.ru>
parents:
3642
diff
changeset
|
402 ngx_http_xslt_filter_ctx_t *ctx; |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
403 ngx_http_xslt_filter_loc_conf_t *conf; |
2139 | 404 |
3686
47c1a9bff989
use xmlSAXHandler._private field to store xslt filter context
Igor Sysoev <igor@sysoev.ru>
parents:
3642
diff
changeset
|
405 ctx = ctxt->sax->_private; |
2139 | 406 r = ctx->request; |
407 | |
408 conf = ngx_http_get_module_loc_conf(r, ngx_http_xslt_filter_module); | |
409 | |
410 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
411 "xslt filter extSubset: \"%s\" \"%s\" \"%s\"", | |
412 name ? name : (xmlChar *) "", | |
413 externalId ? externalId : (xmlChar *) "", | |
414 systemId ? systemId : (xmlChar *) ""); | |
415 | |
3686
47c1a9bff989
use xmlSAXHandler._private field to store xslt filter context
Igor Sysoev <igor@sysoev.ru>
parents:
3642
diff
changeset
|
416 doc = ctxt->myDoc; |
2139 | 417 |
418 #if (NGX_HTTP_XSLT_REUSE_DTD) | |
419 | |
420 dtd = conf->dtd; | |
421 | |
422 #else | |
423 | |
424 dtd = xmlCopyDtd(conf->dtd); | |
425 if (dtd == NULL) { | |
426 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
427 "xmlCopyDtd() failed"); | |
428 return; | |
429 } | |
430 | |
431 if (doc->children == NULL) { | |
432 xmlAddChild((xmlNodePtr) doc, (xmlNodePtr) dtd); | |
433 | |
434 } else { | |
435 xmlAddPrevSibling(doc->children, (xmlNodePtr) dtd); | |
436 } | |
437 | |
438 #endif | |
439 | |
440 doc->extSubset = dtd; | |
441 } | |
442 | |
443 | |
444 static void ngx_cdecl | |
445 ngx_http_xslt_sax_error(void *data, const char *msg, ...) | |
446 { | |
3686
47c1a9bff989
use xmlSAXHandler._private field to store xslt filter context
Igor Sysoev <igor@sysoev.ru>
parents:
3642
diff
changeset
|
447 xmlParserCtxtPtr ctxt = data; |
2139 | 448 |
3686
47c1a9bff989
use xmlSAXHandler._private field to store xslt filter context
Igor Sysoev <igor@sysoev.ru>
parents:
3642
diff
changeset
|
449 size_t n; |
47c1a9bff989
use xmlSAXHandler._private field to store xslt filter context
Igor Sysoev <igor@sysoev.ru>
parents:
3642
diff
changeset
|
450 va_list args; |
47c1a9bff989
use xmlSAXHandler._private field to store xslt filter context
Igor Sysoev <igor@sysoev.ru>
parents:
3642
diff
changeset
|
451 ngx_http_xslt_filter_ctx_t *ctx; |
47c1a9bff989
use xmlSAXHandler._private field to store xslt filter context
Igor Sysoev <igor@sysoev.ru>
parents:
3642
diff
changeset
|
452 u_char buf[NGX_MAX_ERROR_STR]; |
47c1a9bff989
use xmlSAXHandler._private field to store xslt filter context
Igor Sysoev <igor@sysoev.ru>
parents:
3642
diff
changeset
|
453 |
47c1a9bff989
use xmlSAXHandler._private field to store xslt filter context
Igor Sysoev <igor@sysoev.ru>
parents:
3642
diff
changeset
|
454 ctx = ctxt->sax->_private; |
2139 | 455 |
456 buf[0] = '\0'; | |
457 | |
458 va_start(args, msg); | |
459 n = (size_t) vsnprintf((char *) buf, NGX_MAX_ERROR_STR, msg, args); | |
460 va_end(args); | |
461 | |
462 while (--n && (buf[n] == CR || buf[n] == LF)) { /* void */ } | |
463 | |
464 ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0, | |
2999 | 465 "libxml2 error: \"%*s\"", n + 1, buf); |
2139 | 466 } |
467 | |
468 | |
469 static ngx_buf_t * | |
470 ngx_http_xslt_apply_stylesheet(ngx_http_request_t *r, | |
471 ngx_http_xslt_filter_ctx_t *ctx) | |
472 { | |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
473 int len, rc, doc_type; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
474 u_char *type, *encoding; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
475 ngx_buf_t *b; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
476 ngx_uint_t i; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
477 xmlChar *buf; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
478 xmlDocPtr doc, res; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
479 ngx_http_xslt_sheet_t *sheet; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
480 ngx_http_xslt_filter_loc_conf_t *conf; |
2139 | 481 |
482 conf = ngx_http_get_module_loc_conf(r, ngx_http_xslt_filter_module); | |
483 sheet = conf->sheets.elts; | |
484 doc = ctx->doc; | |
485 | |
486 /* preallocate array for 4 params */ | |
487 | |
488 if (ngx_array_init(&ctx->params, r->pool, 4 * 2 + 1, sizeof(char *)) | |
489 != NGX_OK) | |
490 { | |
491 xmlFreeDoc(doc); | |
492 return NULL; | |
493 } | |
494 | |
495 for (i = 0; i < conf->sheets.nelts; i++) { | |
496 | |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
497 ctx->transform = xsltNewTransformContext(sheet[i].stylesheet, doc); |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
498 if (ctx->transform == NULL) { |
2139 | 499 xmlFreeDoc(doc); |
500 return NULL; | |
501 } | |
502 | |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
503 if (conf->params |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
504 && ngx_http_xslt_params(r, ctx, conf->params, 0) != NGX_OK) |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
505 { |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
506 xsltFreeTransformContext(ctx->transform); |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
507 xmlFreeDoc(doc); |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
508 return NULL; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
509 } |
2139 | 510 |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
511 if (ngx_http_xslt_params(r, ctx, &sheet[i].params, 1) != NGX_OK) { |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
512 xsltFreeTransformContext(ctx->transform); |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
513 xmlFreeDoc(doc); |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
514 return NULL; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
515 } |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
516 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
517 res = xsltApplyStylesheetUser(sheet[i].stylesheet, doc, |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
518 ctx->params.elts, NULL, NULL, |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
519 ctx->transform); |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
520 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
521 xsltFreeTransformContext(ctx->transform); |
2139 | 522 xmlFreeDoc(doc); |
523 | |
524 if (res == NULL) { | |
525 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
526 "xsltApplyStylesheet() failed"); | |
527 return NULL; | |
528 } | |
529 | |
530 doc = res; | |
531 | |
532 /* reset array elements */ | |
533 ctx->params.nelts = 0; | |
534 } | |
535 | |
2153
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
536 /* there must be at least one stylesheet */ |
2139 | 537 |
2159
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
538 if (r == r->main) { |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
539 type = ngx_http_xslt_content_type(sheet[i - 1].stylesheet); |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
540 |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
541 } else { |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
542 type = NULL; |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
543 } |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
544 |
2153
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
545 encoding = ngx_http_xslt_encoding(sheet[i - 1].stylesheet); |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
546 doc_type = doc->type; |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
547 |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
548 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
549 "xslt filter type: %d t:%s e:%s", |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
550 doc_type, type ? type : (u_char *) "(null)", |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
551 encoding ? encoding : (u_char *) "(null)"); |
2139 | 552 |
553 rc = xsltSaveResultToString(&buf, &len, doc, sheet[i - 1].stylesheet); | |
554 | |
555 xmlFreeDoc(doc); | |
556 | |
557 if (rc != 0) { | |
558 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
559 "xsltSaveResultToString() failed"); | |
560 return NULL; | |
561 } | |
562 | |
563 if (len == 0) { | |
564 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
565 "xsltSaveResultToString() returned zero-length result"); | |
566 return NULL; | |
567 } | |
568 | |
569 b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t)); | |
570 if (b == NULL) { | |
571 ngx_free(buf); | |
572 return NULL; | |
573 } | |
574 | |
575 b->pos = buf; | |
576 b->last = buf + len; | |
577 b->memory = 1; | |
578 | |
2159
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
579 if (encoding) { |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
580 r->headers_out.charset.len = ngx_strlen(encoding); |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
581 r->headers_out.charset.data = encoding; |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
582 } |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
583 |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
584 if (r != r->main) { |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
585 return b; |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
586 } |
0ec936b0010a
clear Last-Modified; set content-type and length for main request only
Igor Sysoev <igor@sysoev.ru>
parents:
2158
diff
changeset
|
587 |
2899
61d5b945730a
fix XSLT filter in SSI subrequests
Igor Sysoev <igor@sysoev.ru>
parents:
2882
diff
changeset
|
588 b->last_buf = 1; |
61d5b945730a
fix XSLT filter in SSI subrequests
Igor Sysoev <igor@sysoev.ru>
parents:
2882
diff
changeset
|
589 |
2153
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
590 if (type) { |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
591 len = ngx_strlen(type); |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
592 |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
593 r->headers_out.content_type_len = len; |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
594 r->headers_out.content_type.len = len; |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
595 r->headers_out.content_type.data = type; |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
596 |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
597 } else if (doc_type == XML_HTML_DOCUMENT_NODE) { |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
598 |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
599 r->headers_out.content_type_len = sizeof("text/html") - 1; |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3508
diff
changeset
|
600 ngx_str_set(&r->headers_out.content_type, "text/html"); |
2153
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
601 } |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
602 |
2882
896db5a09bd2
reset content_type hash value, this fixes a bug when XSLT responses
Igor Sysoev <igor@sysoev.ru>
parents:
2821
diff
changeset
|
603 r->headers_out.content_type_lowcase = NULL; |
896db5a09bd2
reset content_type hash value, this fixes a bug when XSLT responses
Igor Sysoev <igor@sysoev.ru>
parents:
2821
diff
changeset
|
604 |
2139 | 605 return b; |
606 } | |
607 | |
608 | |
609 static ngx_int_t | |
610 ngx_http_xslt_params(ngx_http_request_t *r, ngx_http_xslt_filter_ctx_t *ctx, | |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
611 ngx_array_t *params, ngx_uint_t final) |
2139 | 612 { |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
613 u_char *p, *last, *value, *dst, *src, **s; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
614 size_t len; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
615 ngx_uint_t i; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
616 ngx_str_t string; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
617 ngx_http_xslt_param_t *param; |
2139 | 618 |
619 param = params->elts; | |
620 | |
621 for (i = 0; i < params->nelts; i++) { | |
622 | |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
623 if (ngx_http_complex_value(r, ¶m[i].value, &string) != NGX_OK) { |
2139 | 624 return NGX_ERROR; |
625 } | |
626 | |
627 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
628 "xslt filter param: \"%s\"", string.data); | |
629 | |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
630 if (param[i].name) { |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
631 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
632 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
633 "xslt filter param name: \"%s\"", param[i].name); |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
634 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
635 if (param[i].quote) { |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
636 if (xsltQuoteOneUserParam(ctx->transform, param[i].name, |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
637 string.data) |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
638 != 0) |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
639 { |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
640 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
641 "xsltQuoteOneUserParam(\"%s\", \"%s\") failed", |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
642 param[i].name, string.data); |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
643 return NGX_ERROR; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
644 } |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
645 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
646 continue; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
647 } |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
648 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
649 s = ngx_array_push(&ctx->params); |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
650 if (s == NULL) { |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
651 return NGX_ERROR; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
652 } |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
653 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
654 *s = param[i].name; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
655 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
656 s = ngx_array_push(&ctx->params); |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
657 if (s == NULL) { |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
658 return NGX_ERROR; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
659 } |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
660 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
661 *s = string.data; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
662 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
663 continue; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
664 } |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
665 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
666 /* |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
667 * parse param1=value1:param2=value2 syntax as used by parameters |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
668 * specified in xslt_stylesheet directives |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
669 */ |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
670 |
2139 | 671 p = string.data; |
4553
3dd8a403faa1
Fixed off-by-one in xslt parameter parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
672 last = string.data + string.len; |
2139 | 673 |
674 while (p && *p) { | |
675 | |
676 value = p; | |
677 p = (u_char *) ngx_strchr(p, '='); | |
678 if (p == NULL) { | |
679 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
680 "invalid libxslt parameter \"%s\"", value); | |
681 return NGX_ERROR; | |
682 } | |
683 *p++ = '\0'; | |
684 | |
685 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
686 "xslt filter param name: \"%s\"", value); | |
687 | |
688 s = ngx_array_push(&ctx->params); | |
689 if (s == NULL) { | |
690 return NGX_ERROR; | |
691 } | |
692 | |
693 *s = value; | |
694 | |
695 value = p; | |
696 p = (u_char *) ngx_strchr(p, ':'); | |
697 | |
698 if (p) { | |
699 len = p - value; | |
700 *p++ = '\0'; | |
701 | |
702 } else { | |
703 len = last - value; | |
704 } | |
705 | |
706 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
707 "xslt filter param value: \"%s\"", value); | |
708 | |
709 dst = value; | |
710 src = value; | |
711 | |
712 ngx_unescape_uri(&dst, &src, len, 0); | |
713 | |
714 *dst = '\0'; | |
715 | |
716 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
717 "xslt filter param unescaped: \"%s\"", value); | |
718 | |
719 s = ngx_array_push(&ctx->params); | |
720 if (s == NULL) { | |
721 return NGX_ERROR; | |
722 } | |
723 | |
724 *s = value; | |
725 } | |
726 } | |
727 | |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
728 if (final) { |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
729 s = ngx_array_push(&ctx->params); |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
730 if (s == NULL) { |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
731 return NGX_ERROR; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
732 } |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
733 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
734 *s = NULL; |
2139 | 735 } |
736 | |
737 return NGX_OK; | |
738 } | |
739 | |
740 | |
2153
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
741 static u_char * |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
742 ngx_http_xslt_content_type(xsltStylesheetPtr s) |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
743 { |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
744 u_char *type; |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
745 |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
746 if (s->mediaType) { |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
747 return s->mediaType; |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
748 } |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
749 |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
750 for (s = s->imports; s; s = s->next) { |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
751 |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
752 type = ngx_http_xslt_content_type(s); |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
753 |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
754 if (type) { |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
755 return type; |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
756 } |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
757 } |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
758 |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
759 return NULL; |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
760 } |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
761 |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
762 |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
763 static u_char * |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
764 ngx_http_xslt_encoding(xsltStylesheetPtr s) |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
765 { |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
766 u_char *encoding; |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
767 |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
768 if (s->encoding) { |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
769 return s->encoding; |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
770 } |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
771 |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
772 for (s = s->imports; s; s = s->next) { |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
773 |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
774 encoding = ngx_http_xslt_encoding(s); |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
775 |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
776 if (encoding) { |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
777 return encoding; |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
778 } |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
779 } |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
780 |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
781 return NULL; |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
782 } |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
783 |
6476e445d6ce
xsl:output's media-type and encoding support
Igor Sysoev <igor@sysoev.ru>
parents:
2152
diff
changeset
|
784 |
2139 | 785 static void |
786 ngx_http_xslt_cleanup(void *data) | |
787 { | |
788 ngx_free(data); | |
789 } | |
790 | |
791 | |
792 static char * | |
793 ngx_http_xslt_entities(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |
794 { | |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
795 ngx_http_xslt_filter_loc_conf_t *xlcf = conf; |
2139 | 796 |
2156
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
797 ngx_str_t *value; |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
798 ngx_uint_t i; |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
799 ngx_pool_cleanup_t *cln; |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
800 ngx_http_xslt_file_t *file; |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
801 ngx_http_xslt_filter_main_conf_t *xmcf; |
2139 | 802 |
803 if (xlcf->dtd) { | |
804 return "is duplicate"; | |
805 } | |
806 | |
807 value = cf->args->elts; | |
808 | |
2156
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
809 xmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_xslt_filter_module); |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
810 |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
811 file = xmcf->dtd_files.elts; |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
812 for (i = 0; i < xmcf->dtd_files.nelts; i++) { |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
813 if (ngx_strcmp(file[i].name, &value[1].data) == 0) { |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
814 xlcf->dtd = file[i].data; |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
815 return NGX_CONF_OK; |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
816 } |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
817 } |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
818 |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
819 cln = ngx_pool_cleanup_add(cf->pool, 0); |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
820 if (cln == NULL) { |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
821 return NGX_CONF_ERROR; |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
822 } |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
823 |
2139 | 824 xlcf->dtd = xmlParseDTD(NULL, (xmlChar *) value[1].data); |
825 | |
826 if (xlcf->dtd == NULL) { | |
827 ngx_conf_log_error(NGX_LOG_ERR, cf, 0, "xmlParseDTD() failed"); | |
828 return NGX_CONF_ERROR; | |
829 } | |
830 | |
2156
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
831 cln->handler = ngx_http_xslt_cleanup_dtd; |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
832 cln->data = xlcf->dtd; |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
833 |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
834 file = ngx_array_push(&xmcf->dtd_files); |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
835 if (file == NULL) { |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
836 return NGX_CONF_ERROR; |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
837 } |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
838 |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
839 file->name = value[1].data; |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
840 file->data = xlcf->dtd; |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
841 |
2139 | 842 return NGX_CONF_OK; |
843 } | |
844 | |
845 | |
846 | |
847 static char * | |
848 ngx_http_xslt_stylesheet(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |
849 { | |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
850 ngx_http_xslt_filter_loc_conf_t *xlcf = conf; |
2139 | 851 |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
852 ngx_str_t *value; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
853 ngx_uint_t i, n; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
854 ngx_pool_cleanup_t *cln; |
2156
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
855 ngx_http_xslt_file_t *file; |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
856 ngx_http_xslt_sheet_t *sheet; |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
857 ngx_http_xslt_param_t *param; |
2588
a6954ce88b80
use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents:
2299
diff
changeset
|
858 ngx_http_compile_complex_value_t ccv; |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
859 ngx_http_xslt_filter_main_conf_t *xmcf; |
2139 | 860 |
861 value = cf->args->elts; | |
862 | |
863 if (xlcf->sheets.elts == NULL) { | |
864 if (ngx_array_init(&xlcf->sheets, cf->pool, 1, | |
865 sizeof(ngx_http_xslt_sheet_t)) | |
866 != NGX_OK) | |
867 { | |
868 return NGX_CONF_ERROR; | |
869 } | |
870 } | |
871 | |
872 sheet = ngx_array_push(&xlcf->sheets); | |
873 if (sheet == NULL) { | |
874 return NGX_CONF_ERROR; | |
875 } | |
876 | |
877 ngx_memzero(sheet, sizeof(ngx_http_xslt_sheet_t)); | |
878 | |
879 if (ngx_conf_full_name(cf->cycle, &value[1], 0) != NGX_OK) { | |
880 return NGX_CONF_ERROR; | |
881 } | |
882 | |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
883 xmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_xslt_filter_module); |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
884 |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
885 file = xmcf->sheet_files.elts; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
886 for (i = 0; i < xmcf->sheet_files.nelts; i++) { |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
887 if (ngx_strcmp(file[i].name, &value[1].data) == 0) { |
2156
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
888 sheet->stylesheet = file[i].data; |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
889 goto found; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
890 } |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
891 } |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
892 |
2139 | 893 cln = ngx_pool_cleanup_add(cf->pool, 0); |
894 if (cln == NULL) { | |
895 return NGX_CONF_ERROR; | |
896 } | |
897 | |
898 sheet->stylesheet = xsltParseStylesheetFile(value[1].data); | |
899 if (sheet->stylesheet == NULL) { | |
900 ngx_conf_log_error(NGX_LOG_ERR, cf, 0, | |
901 "xsltParseStylesheetFile(\"%s\") failed", | |
902 value[1].data); | |
903 return NGX_CONF_ERROR; | |
904 } | |
905 | |
906 cln->handler = ngx_http_xslt_cleanup_stylesheet; | |
907 cln->data = sheet->stylesheet; | |
908 | |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
909 file = ngx_array_push(&xmcf->sheet_files); |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
910 if (file == NULL) { |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
911 return NGX_CONF_ERROR; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
912 } |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
913 |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
914 file->name = value[1].data; |
2156
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
915 file->data = sheet->stylesheet; |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
916 |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
917 found: |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
918 |
2139 | 919 n = cf->args->nelts; |
920 | |
921 if (n == 2) { | |
922 return NGX_CONF_OK; | |
923 } | |
924 | |
925 if (ngx_array_init(&sheet->params, cf->pool, n - 2, | |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
926 sizeof(ngx_http_xslt_param_t)) |
2139 | 927 != NGX_OK) |
928 { | |
929 return NGX_CONF_ERROR; | |
930 } | |
931 | |
932 for (i = 2; i < n; i++) { | |
933 | |
934 param = ngx_array_push(&sheet->params); | |
935 if (param == NULL) { | |
936 return NGX_CONF_ERROR; | |
937 } | |
938 | |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
939 ngx_memzero(param, sizeof(ngx_http_xslt_param_t)); |
2588
a6954ce88b80
use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents:
2299
diff
changeset
|
940 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); |
2139 | 941 |
2588
a6954ce88b80
use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents:
2299
diff
changeset
|
942 ccv.cf = cf; |
a6954ce88b80
use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents:
2299
diff
changeset
|
943 ccv.value = &value[i]; |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
944 ccv.complex_value = ¶m->value; |
2588
a6954ce88b80
use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents:
2299
diff
changeset
|
945 ccv.zero = 1; |
2139 | 946 |
2588
a6954ce88b80
use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents:
2299
diff
changeset
|
947 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { |
2139 | 948 return NGX_CONF_ERROR; |
949 } | |
950 } | |
951 | |
952 return NGX_CONF_OK; | |
953 } | |
954 | |
955 | |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
956 static char * |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
957 ngx_http_xslt_param(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
958 { |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
959 ngx_http_xslt_filter_loc_conf_t *xlcf = conf; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
960 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
961 ngx_http_xslt_param_t *param; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
962 ngx_http_compile_complex_value_t ccv; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
963 ngx_str_t *value; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
964 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
965 value = cf->args->elts; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
966 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
967 if (xlcf->params == NULL) { |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
968 xlcf->params = ngx_array_create(cf->pool, 2, |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
969 sizeof(ngx_http_xslt_param_t)); |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
970 if (xlcf->params == NULL) { |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
971 return NGX_CONF_ERROR; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
972 } |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
973 } |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
974 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
975 param = ngx_array_push(xlcf->params); |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
976 if (param == NULL) { |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
977 return NGX_CONF_ERROR; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
978 } |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
979 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
980 param->name = value[1].data; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
981 param->quote = (cmd->post == NULL) ? 0 : 1; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
982 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
983 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
984 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
985 ccv.cf = cf; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
986 ccv.value = &value[2]; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
987 ccv.complex_value = ¶m->value; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
988 ccv.zero = 1; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
989 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
990 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
991 return NGX_CONF_ERROR; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
992 } |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
993 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
994 return NGX_CONF_OK; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
995 } |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
996 |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
997 |
2139 | 998 static void |
2156
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
999 ngx_http_xslt_cleanup_dtd(void *data) |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
1000 { |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
1001 xmlFreeDtd(data); |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
1002 } |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
1003 |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
1004 |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
1005 static void |
2139 | 1006 ngx_http_xslt_cleanup_stylesheet(void *data) |
1007 { | |
2156
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
1008 xsltFreeStylesheet(data); |
2139 | 1009 } |
1010 | |
1011 | |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1012 static void * |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1013 ngx_http_xslt_filter_create_main_conf(ngx_conf_t *cf) |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1014 { |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1015 ngx_http_xslt_filter_main_conf_t *conf; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1016 |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1017 conf = ngx_palloc(cf->pool, sizeof(ngx_http_xslt_filter_main_conf_t)); |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1018 if (conf == NULL) { |
2912
c7d57b539248
return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents:
2899
diff
changeset
|
1019 return NULL; |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1020 } |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1021 |
2156
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
1022 if (ngx_array_init(&conf->dtd_files, cf->pool, 1, |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
1023 sizeof(ngx_http_xslt_file_t)) |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
1024 != NGX_OK) |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
1025 { |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
1026 return NULL; |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
1027 } |
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
1028 |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1029 if (ngx_array_init(&conf->sheet_files, cf->pool, 1, |
2156
0c6d0bd60579
reuse compiled DTD hash in different locations, add DTD cleanup
Igor Sysoev <igor@sysoev.ru>
parents:
2154
diff
changeset
|
1030 sizeof(ngx_http_xslt_file_t)) |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1031 != NGX_OK) |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1032 { |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1033 return NULL; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1034 } |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1035 |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1036 return conf; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1037 } |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1038 |
2139 | 1039 |
1040 static void * | |
1041 ngx_http_xslt_filter_create_conf(ngx_conf_t *cf) | |
1042 { | |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1043 ngx_http_xslt_filter_loc_conf_t *conf; |
2139 | 1044 |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1045 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_xslt_filter_loc_conf_t)); |
2139 | 1046 if (conf == NULL) { |
2912
c7d57b539248
return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents:
2899
diff
changeset
|
1047 return NULL; |
2139 | 1048 } |
1049 | |
1050 /* | |
1051 * set by ngx_pcalloc(): | |
1052 * | |
2148 | 1053 * conf->dtd = NULL; |
1054 * conf->sheets = { NULL }; | |
1055 * conf->types = { NULL }; | |
1056 * conf->types_keys = NULL; | |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
1057 * conf->params = NULL; |
2139 | 1058 */ |
1059 | |
1060 return conf; | |
1061 } | |
1062 | |
1063 | |
1064 static char * | |
1065 ngx_http_xslt_filter_merge_conf(ngx_conf_t *cf, void *parent, void *child) | |
1066 { | |
2154
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1067 ngx_http_xslt_filter_loc_conf_t *prev = parent; |
4f48a2765da0
reuse compiled XSLT tree in different locations
Igor Sysoev <igor@sysoev.ru>
parents:
2153
diff
changeset
|
1068 ngx_http_xslt_filter_loc_conf_t *conf = child; |
2139 | 1069 |
1070 if (conf->dtd == NULL) { | |
1071 conf->dtd = prev->dtd; | |
1072 } | |
1073 | |
1074 if (conf->sheets.nelts == 0) { | |
1075 conf->sheets = prev->sheets; | |
1076 } | |
1077 | |
4554
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
1078 if (conf->params == NULL) { |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
1079 conf->params = prev->params; |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
1080 } |
212a0251951b
Added xslt_param and xslt_string_param directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4553
diff
changeset
|
1081 |
3372
6b8e5c882e47
support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents:
3115
diff
changeset
|
1082 if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types, |
6b8e5c882e47
support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents:
3115
diff
changeset
|
1083 &prev->types_keys, &prev->types, |
2148 | 1084 ngx_http_xslt_default_types) |
2139 | 1085 != NGX_OK) |
1086 { | |
1087 return NGX_CONF_ERROR; | |
1088 } | |
1089 | |
1090 return NGX_CONF_OK; | |
1091 } | |
1092 | |
1093 | |
1094 static ngx_int_t | |
1095 ngx_http_xslt_filter_init(ngx_conf_t *cf) | |
1096 { | |
1097 xmlInitParser(); | |
1098 | |
2299 | 1099 #if (NGX_HAVE_EXSLT) |
1100 exsltRegisterAll(); | |
1101 #endif | |
1102 | |
2139 | 1103 ngx_http_next_header_filter = ngx_http_top_header_filter; |
1104 ngx_http_top_header_filter = ngx_http_xslt_header_filter; | |
1105 | |
1106 ngx_http_next_body_filter = ngx_http_top_body_filter; | |
1107 ngx_http_top_body_filter = ngx_http_xslt_body_filter; | |
1108 | |
1109 return NGX_OK; | |
1110 } | |
1111 | |
1112 | |
1113 static void | |
1114 ngx_http_xslt_filter_exit(ngx_cycle_t *cycle) | |
1115 { | |
1116 xsltCleanupGlobals(); | |
1117 xmlCleanupParser(); | |
1118 } |