| 191 | | array *ca; |
| 192 | | data_array *da = (data_array *)du; |
| 193 | | |
| 194 | | s = malloc(sizeof(plugin_config)); |
| 195 | | s->rewrite = rewrite_rule_buffer_init(); |
| 196 | | |
| 197 | | cv[0].destination = s->rewrite; |
| 198 | | cv[1].destination = s->rewrite; |
| 199 | | |
| 200 | | p->config_storage[i] = s; |
| 201 | | ca = ((data_config *)srv->config_context->data[i])->value; |
| 202 | | |
| 203 | | if (0 != config_insert_values_global(srv, ca, cv)) { |
| | 180 | |
| | 181 | if (du->type != TYPE_ARRAY) { |
| | 182 | log_error_write(srv, __FILE__, __LINE__, "sss", |
| | 183 | "unexpected type for key: ", option, "array of strings"); |
| | 184 | |
| 207 | | if (NULL != (du = array_get_element(ca, "url.rewrite"))) { |
| 208 | | if (du->type != TYPE_ARRAY) { |
| 209 | | log_error_write(srv, __FILE__, __LINE__, "sss", |
| 210 | | "unexpected type for key: ", "url.rewrite", "array of strings"); |
| | 188 | da = (data_array *)du; |
| | 189 | |
| | 190 | for (j = 0; j < da->value->used; j++) { |
| | 191 | if (da->value->data[j]->type != TYPE_STRING) { |
| | 192 | log_error_write(srv, __FILE__, __LINE__, "sssbs", |
| | 193 | "unexpected type for key: ", |
| | 194 | option, |
| | 195 | "[", da->value->data[j]->key, "](string)"); |
| 214 | | |
| 215 | | da = (data_array *)du; |
| 216 | | |
| 217 | | for (j = 0; j < da->value->used; j++) { |
| 218 | | if (da->value->data[j]->type != TYPE_STRING) { |
| 219 | | log_error_write(srv, __FILE__, __LINE__, "sssbs", |
| 220 | | "unexpected type for key: ", |
| 221 | | "url.rewrite", |
| 222 | | "[", da->value->data[j]->key, "](string)"); |
| 223 | | |
| 224 | | return HANDLER_ERROR; |
| 225 | | } |
| 226 | | |
| 227 | | if (0 != rewrite_rule_buffer_append(s->rewrite, |
| 228 | | ((data_string *)(da->value->data[j]))->key, |
| 229 | | ((data_string *)(da->value->data[j]))->value, |
| 230 | | 0)) { |
| 231 | | #ifdef HAVE_PCRE_H |
| 232 | | log_error_write(srv, __FILE__, __LINE__, "sb", |
| 233 | | "pcre-compile failed for", da->value->data[j]->key); |
| | 199 | |
| | 200 | if (0 != rewrite_rule_buffer_append(s->rewrite, |
| | 201 | ((data_string *)(da->value->data[j]))->key, |
| | 202 | ((data_string *)(da->value->data[j]))->value, |
| | 203 | once)) { |
| | 204 | #ifdef HAVE_PCRE_H |
| | 205 | log_error_write(srv, __FILE__, __LINE__, "sb", |
| | 206 | "pcre-compile failed for", da->value->data[j]->key); |
| 241 | | |
| 242 | | if (NULL != (du = array_get_element(ca, "url.rewrite-final"))) { |
| 243 | | if (du->type != TYPE_ARRAY) { |
| 244 | | log_error_write(srv, __FILE__, __LINE__, "sss", |
| 245 | | "unexpected type for key: ", "url.rewrite", "array of strings"); |
| 246 | | |
| 247 | | return HANDLER_ERROR; |
| 248 | | } |
| 249 | | |
| 250 | | da = (data_array *)du; |
| 251 | | |
| 252 | | for (j = 0; j < da->value->used; j++) { |
| 253 | | if (da->value->data[j]->type != TYPE_STRING) { |
| 254 | | log_error_write(srv, __FILE__, __LINE__, "sssbs", |
| 255 | | "unexpected type for key: ", |
| 256 | | "url.rewrite", |
| 257 | | "[", da->value->data[j]->key, "](string)"); |
| 258 | | |
| 259 | | return HANDLER_ERROR; |
| 260 | | } |
| 261 | | |
| 262 | | if (0 != rewrite_rule_buffer_append(s->rewrite, |
| 263 | | ((data_string *)(da->value->data[j]))->key, |
| 264 | | ((data_string *)(da->value->data[j]))->value, |
| 265 | | 1)) { |
| 266 | | |
| 267 | | #ifdef HAVE_PCRE_H |
| 268 | | log_error_write(srv, __FILE__, __LINE__, "sb", |
| 269 | | "pcre-compile failed for", da->value->data[j]->key); |
| 270 | | #else |
| 271 | | log_error_write(srv, __FILE__, __LINE__, "s", |
| 272 | | "pcre support is missing, please install libpcre and the headers"); |
| 273 | | #endif |
| 274 | | } |
| 275 | | } |
| 276 | | } |
| | 213 | } |
| | 214 | |
| | 215 | return 0; |
| | 216 | } |
| | 217 | |
| | 218 | SETDEFAULTS_FUNC(mod_rewrite_set_defaults) { |
| | 219 | plugin_data *p = p_d; |
| | 220 | size_t i = 0; |
| | 221 | |
| | 222 | config_values_t cv[] = { |
| | 223 | { "url.rewrite-repeat", NULL, T_CONFIG_LOCAL, T_CONFIG_SCOPE_CONNECTION }, /* 0 */ |
| | 224 | { "url.rewrite-once", NULL, T_CONFIG_LOCAL, T_CONFIG_SCOPE_CONNECTION }, /* 1 */ |
| | 225 | |
| | 226 | /* old names, still supported |
| | 227 | * |
| | 228 | * url.rewrite remapped to url.rewrite-once |
| | 229 | * url.rewrite-final is url.rewrite-once |
| | 230 | * |
| | 231 | */ |
| | 232 | { "url.rewrite", NULL, T_CONFIG_LOCAL, T_CONFIG_SCOPE_CONNECTION }, /* 2 */ |
| | 233 | { "url.rewrite-final", NULL, T_CONFIG_LOCAL, T_CONFIG_SCOPE_CONNECTION }, /* 3 */ |
| | 234 | { NULL, NULL, T_CONFIG_UNSET, T_CONFIG_SCOPE_UNSET } |
| | 235 | }; |
| | 236 | |
| | 237 | if (!p) return HANDLER_ERROR; |
| | 238 | |
| | 239 | /* 0 */ |
| | 240 | p->config_storage = malloc(srv->config_context->used * sizeof(specific_config *)); |
| | 241 | |
| | 242 | for (i = 0; i < srv->config_context->used; i++) { |
| | 243 | plugin_config *s; |
| | 244 | array *ca; |
| | 245 | |
| | 246 | s = malloc(sizeof(plugin_config)); |
| | 247 | s->rewrite = rewrite_rule_buffer_init(); |
| | 248 | |
| | 249 | cv[0].destination = s->rewrite; |
| | 250 | cv[1].destination = s->rewrite; |
| | 251 | cv[2].destination = s->rewrite; |
| | 252 | |
| | 253 | p->config_storage[i] = s; |
| | 254 | ca = ((data_config *)srv->config_context->data[i])->value; |
| | 255 | |
| | 256 | if (0 != config_insert_values_global(srv, ca, cv)) { |
| | 257 | return HANDLER_ERROR; |
| | 258 | } |
| | 259 | |
| | 260 | parse_config_entry(srv, s, ca, "url.rewrite-once", 1); |
| | 261 | parse_config_entry(srv, s, ca, "url.rewrite-final", 1); |
| | 262 | parse_config_entry(srv, s, ca, "url.rewrite", 1); |
| | 263 | parse_config_entry(srv, s, ca, "url.rewrite-repeat", 0); |