| |
| |
| ndk_http_complex_path_value_t ndk_empty_http_complex_path_value = {{0,NULL},0}; |
| |
| |
| ngx_int_t |
| ndk_http_complex_path_value_compile (ngx_conf_t *cf, ngx_http_complex_value_t *cv, ngx_str_t *value, ngx_uint_t prefix) |
| { |
| ngx_http_compile_complex_value_t ccv; |
| |
| ngx_memzero (&ccv, sizeof(ngx_http_compile_complex_value_t)); |
| |
| ccv.cf = cf; |
| ccv.value = value; |
| ccv.complex_value = cv; |
| |
| switch (prefix) { |
| |
| case 1 : |
| ccv.root_prefix = 1; |
| break; |
| |
| case 2 : |
| ccv.conf_prefix = 1; |
| break; |
| } |
| |
| ndk_path_to_dir_safe (value, 1, 0); |
| |
| if (!value->len) |
| return NGX_OK; |
| |
| return ngx_http_compile_complex_value (&ccv); |
| } |
| |
| |
| |
| ngx_array_t * |
| ndk_http_complex_path_create_compile (ngx_conf_t *cf, ngx_str_t *path, ngx_uint_t prefix) |
| { |
| ndk_http_complex_path_elt_t *cpe; |
| ngx_array_t *a; |
| ngx_int_t n; |
| u_char *m, *s, *e; |
| ngx_str_t value; |
| |
| n = ndk_strcntc (path, ':') + 1; |
| |
| a = ngx_array_create (cf->pool, n, sizeof (ndk_http_complex_path_elt_t)); |
| if (a == NULL) { |
| return NULL; |
| } |
| |
| s = path->data; |
| e = s + path->len; |
| |
| |
| while (s < e) { |
| |
| m = s; |
| |
| while (m < e && *m != ':') m++; |
| |
| if (m == s) { |
| s = m+1; |
| continue; |
| } |
| |
| cpe = ngx_array_push (a); |
| if (cpe == NULL) { |
| return NULL; |
| } |
| |
| if (*s == '#') { |
| s++; |
| cpe->dynamic = 1; |
| } else { |
| cpe->dynamic = 0; |
| } |
| |
| value.data = s; |
| value.len = m - s; |
| |
| if (ndk_http_complex_path_value_compile (cf, &cpe->val, &value, prefix) == NGX_ERROR) |
| return NULL; |
| |
| s = m+1; |
| } |
| |
| return a; |
| } |
| |
| |
| |
| |
| char * |
| ndk_conf_set_http_complex_path_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
| { |
| char *p = conf; |
| |
| ngx_str_t *path; |
| ngx_array_t *a; |
| ngx_conf_post_t *post; |
| ndk_http_complex_path_t *cp; |
| |
| cp = (ndk_http_complex_path_t *) (p + cmd->offset); |
| |
| if (cp->a != NGX_CONF_UNSET_PTR) { |
| return "is duplicate"; |
| } |
| |
| path = cf->args->elts; |
| path++; |
| |
| cp->a = ndk_http_complex_path_create_compile (cf, path, cp->prefix); |
| if (cp->a == NULL) |
| // TODO : log |
| return NGX_CONF_ERROR; |
| |
| if (cmd->post) { |
| post = cmd->post; |
| return post->post_handler (cf, post, a); |
| } |
| |
| return NGX_CONF_OK; |
| } |
| |
| |
| |