blob: 7335bf10415b10898811bfb33b6f41107b0c2bc8 [file] [log] [blame] [raw]
ngx_int_t
ndk_http_complex_value_compile (ngx_conf_t *cf, ngx_http_complex_value_t *cv, ngx_str_t *value)
{
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;
return ngx_http_compile_complex_value (&ccv);
}
ngx_array_t *
ndk_http_complex_value_array_create (ngx_conf_t *cf, char **s, ngx_int_t n)
{
ngx_int_t i;
ngx_http_complex_value_t *cv;
ngx_array_t *a;
ngx_str_t value;
a = ngx_array_create (cf->pool, n, sizeof (ngx_http_complex_value_t));
if (a == NULL)
return NULL;
for (i=0; i<n; i++, s++) {
cv = ngx_array_push (a);
value.data = (u_char *) *s;
value.len = strlen (*s);
if (ndk_http_complex_value_compile (cf, cv, &value))
return NULL;
}
return a;
}
ngx_int_t
ndk_http_complex_value_array_compile (ngx_conf_t *cf, ngx_array_t *a)
{
ngx_int_t i;
ngx_http_complex_value_t *cv;
if (a == NULL || a == NGX_CONF_UNSET_PTR) {
return NGX_ERROR;
}
cv = a->elts;
for (i=0; i<a->nelts; i++, cv++) {
if (ndk_http_complex_value_compile (cf, cv, &cv->value))
return NGX_ERROR;
}
return NGX_OK;
}
char *
ndk_conf_set_http_complex_value_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
char *p = conf;
ngx_http_complex_value_t *cv;
ngx_str_t *value;
ngx_conf_post_t *post;
cv = (ngx_http_complex_value_t *) (p + cmd->offset);
if (cv->value.data) {
return "is duplicate";
}
value = cf->args->elts;
if (ndk_http_complex_value_compile (cf, cv, value + 1))
return NGX_CONF_ERROR;
if (cmd->post) {
post = cmd->post;
return post->post_handler (cf, post, cv);
}
return NGX_CONF_OK;
}
char *
ndk_conf_set_http_complex_value_array_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
char *p = conf;
ngx_str_t *value;
ngx_http_complex_value_t *cv;
ngx_array_t **a;
ngx_conf_post_t *post;
ngx_int_t i, alloc;
a = (ngx_array_t **) (p + cmd->offset);
if (*a == NULL || *a == NGX_CONF_UNSET_PTR) {
alloc = cf->args->nelts > 4 ? cf->args->nelts : 4;
*a = ngx_array_create (cf->pool, alloc, sizeof (ngx_http_complex_value_t));
if (*a == NULL) {
return NGX_CONF_ERROR;
}
}
value = cf->args->elts;
for (i=1; i<cf->args->nelts; i++) {
cv = ngx_array_push (*a);
if (cv == NULL) {
return NGX_CONF_ERROR;
}
if (ndk_http_complex_value_compile (cf, cv, &value[i]) == NGX_ERROR)
return NGX_CONF_ERROR;
}
if (cmd->post) {
post = cmd->post;
return post->post_handler (cf, post, a);
}
return NGX_CONF_OK;
}
char *
ndk_conf_set_http_complex_keyval_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
char *p = conf;
ngx_str_t *value;
ndk_http_complex_keyval_t *ckv;
ngx_array_t **a;
ngx_conf_post_t *post;
ngx_int_t alloc;
a = (ngx_array_t **) (p + cmd->offset);
if (*a == NULL || *a == NGX_CONF_UNSET_PTR) {
alloc = cf->args->nelts > 4 ? cf->args->nelts : 4;
*a = ngx_array_create (cf->pool, alloc, sizeof (ndk_http_complex_keyval_t));
if (*a == NULL) {
return NGX_CONF_ERROR;
}
}
ckv = ngx_array_push (*a);
if (ckv == NULL) {
return NGX_CONF_ERROR;
}
value = cf->args->elts;
ckv->key = value[1];
if (ndk_http_complex_value_compile (cf, &ckv->value, &value[2]) == NGX_ERROR)
return NGX_CONF_ERROR;
if (cmd->post) {
post = cmd->post;
return post->post_handler (cf, post, a);
}
return NGX_CONF_OK;
}
// TODO : complex keyval1