blob: 4aae164e76fc1b39f73f872ce01d7ae2383d114f [file] [log] [blame] [raw]
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;
}