comparison src/http/modules/ngx_http_xslt_filter_module.c @ 464:c8cfb6c462ef NGINX_0_7_44

nginx 0.7.44 *) Feature: the ngx_http_proxy_module preliminary cache support. *) Feature: the --with-pcre option in the configure. *) Feature: the "try_files" directive is now allowed on the server block level. *) Bugfix: the "try_files" directive handled incorrectly a query string in a fallback parameter. *) Bugfix: the "try_files" directive might test incorrectly directories. *) Bugfix: if there is the single server for given address:port pair, then captures in regular expressions in a "server_name" directive did not work.
author Igor Sysoev <http://sysoev.ru>
date Mon, 23 Mar 2009 00:00:00 +0300
parents ff86d646f9df
children ed5e10fb40fc
comparison
equal deleted inserted replaced
463:51cb914e6d3a 464:c8cfb6c462ef
36 ngx_array_t sheet_files; /* ngx_http_xslt_file_t */ 36 ngx_array_t sheet_files; /* ngx_http_xslt_file_t */
37 } ngx_http_xslt_filter_main_conf_t; 37 } ngx_http_xslt_filter_main_conf_t;
38 38
39 39
40 typedef struct { 40 typedef struct {
41 ngx_array_t *lengths;
42 ngx_array_t *values;
43 } ngx_http_xslt_param_t;
44
45
46 typedef struct {
47 xsltStylesheetPtr stylesheet; 41 xsltStylesheetPtr stylesheet;
48 ngx_array_t params; /* ngx_http_xslt_param_t */ 42 ngx_array_t params; /* ngx_http_complex_value_t */
49 } ngx_http_xslt_sheet_t; 43 } ngx_http_xslt_sheet_t;
50 44
51 45
52 typedef struct { 46 typedef struct {
53 xmlDtdPtr dtd; 47 xmlDtdPtr dtd;
865 859
866 static ngx_int_t 860 static ngx_int_t
867 ngx_http_xslt_params(ngx_http_request_t *r, ngx_http_xslt_filter_ctx_t *ctx, 861 ngx_http_xslt_params(ngx_http_request_t *r, ngx_http_xslt_filter_ctx_t *ctx,
868 ngx_array_t *params) 862 ngx_array_t *params)
869 { 863 {
870 u_char *p, *last, *value, *dst, *src, **s; 864 u_char *p, *last, *value, *dst, *src, **s;
871 size_t len; 865 size_t len;
872 ngx_uint_t i; 866 ngx_uint_t i;
873 ngx_str_t string; 867 ngx_str_t string;
874 ngx_http_xslt_param_t *param; 868 ngx_http_complex_value_t *param;
875 869
876 param = params->elts; 870 param = params->elts;
877 871
878 for (i = 0; i < params->nelts; i++) { 872 for (i = 0; i < params->nelts; i++) {
879 873
880 if (ngx_http_script_run(r, &string, param[i].lengths->elts, 1, 874 if (ngx_http_complex_value(r, &param[i], &string) != NGX_OK) {
881 param[i].values->elts)
882 == NULL)
883 {
884 return NGX_ERROR; 875 return NGX_ERROR;
885 } 876 }
886
887 last = string.data + string.len - 1;
888 *last = '\0';
889 877
890 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, 878 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
891 "xslt filter param: \"%s\"", string.data); 879 "xslt filter param: \"%s\"", string.data);
892 880
893 p = string.data; 881 p = string.data;
882 last = string.data + string.len - 1;
894 883
895 while (p && *p) { 884 while (p && *p) {
896 885
897 value = p; 886 value = p;
898 p = (u_char *) ngx_strchr(p, '='); 887 p = (u_char *) ngx_strchr(p, '=');
1071 ngx_str_t *value; 1060 ngx_str_t *value;
1072 ngx_uint_t i, n; 1061 ngx_uint_t i, n;
1073 ngx_pool_cleanup_t *cln; 1062 ngx_pool_cleanup_t *cln;
1074 ngx_http_xslt_file_t *file; 1063 ngx_http_xslt_file_t *file;
1075 ngx_http_xslt_sheet_t *sheet; 1064 ngx_http_xslt_sheet_t *sheet;
1076 ngx_http_xslt_param_t *param; 1065 ngx_http_complex_value_t *param;
1077 ngx_http_script_compile_t sc; 1066 ngx_http_compile_complex_value_t ccv;
1078 ngx_http_xslt_filter_main_conf_t *xmcf; 1067 ngx_http_xslt_filter_main_conf_t *xmcf;
1079 1068
1080 value = cf->args->elts; 1069 value = cf->args->elts;
1081 1070
1082 if (xlcf->sheets.elts == NULL) { 1071 if (xlcf->sheets.elts == NULL) {
1140 if (n == 2) { 1129 if (n == 2) {
1141 return NGX_CONF_OK; 1130 return NGX_CONF_OK;
1142 } 1131 }
1143 1132
1144 if (ngx_array_init(&sheet->params, cf->pool, n - 2, 1133 if (ngx_array_init(&sheet->params, cf->pool, n - 2,
1145 sizeof(ngx_http_xslt_param_t)) 1134 sizeof(ngx_http_complex_value_t))
1146 != NGX_OK) 1135 != NGX_OK)
1147 { 1136 {
1148 return NGX_CONF_ERROR; 1137 return NGX_CONF_ERROR;
1149 } 1138 }
1150 1139
1153 param = ngx_array_push(&sheet->params); 1142 param = ngx_array_push(&sheet->params);
1154 if (param == NULL) { 1143 if (param == NULL) {
1155 return NGX_CONF_ERROR; 1144 return NGX_CONF_ERROR;
1156 } 1145 }
1157 1146
1158 param->lengths = NULL; 1147 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
1159 param->values = NULL; 1148
1160 1149 ccv.cf = cf;
1161 ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); 1150 ccv.value = &value[i];
1162 1151 ccv.complex_value = param;
1163 sc.cf = cf; 1152 ccv.zero = 1;
1164 sc.source = &value[i]; 1153
1165 sc.lengths = &param->lengths; 1154 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
1166 sc.values = &param->values;
1167 sc.variables = ngx_http_script_variables_count(&value[i]);
1168 sc.complete_lengths = 1;
1169 sc.complete_values = 1;
1170
1171 if (ngx_http_script_compile(&sc) != NGX_OK) {
1172 return NGX_CONF_ERROR; 1155 return NGX_CONF_ERROR;
1173 } 1156 }
1157
1174 } 1158 }
1175 1159
1176 return NGX_CONF_OK; 1160 return NGX_CONF_OK;
1177 } 1161 }
1178 1162