Router: refactored variable pass.

Since the "pass" option supports both strings and variables, a generic
nxt_var_t structure can be used in the configuration phase, and the "name"
field in actions is redundant.

No functional changes.
This commit is contained in:
Zhidao HONG
2021-09-07 21:13:44 +08:00
parent 9c1894bf77
commit a336928e10
6 changed files with 81 additions and 54 deletions

View File

@@ -216,14 +216,12 @@ static nxt_int_t nxt_http_route_resolve(nxt_task_t *task,
nxt_router_temp_conf_t *tmcf, nxt_http_route_t *route);
static nxt_int_t nxt_http_action_resolve(nxt_task_t *task,
nxt_router_temp_conf_t *tmcf, nxt_http_action_t *action);
static nxt_http_action_t *nxt_http_action_pass_var(nxt_task_t *task,
static nxt_http_action_t *nxt_http_pass_var(nxt_task_t *task,
nxt_http_request_t *r, nxt_http_action_t *action);
static void nxt_http_action_pass_var_ready(nxt_task_t *task, void *obj,
void *data);
static void nxt_http_action_pass_var_error(nxt_task_t *task, void *obj,
void *data);
static nxt_int_t nxt_http_pass_find(nxt_task_t *task, nxt_mp_t *mp,
nxt_router_conf_t *rtcf, nxt_http_action_t *action);
static void nxt_http_pass_var_ready(nxt_task_t *task, void *obj, void *data);
static void nxt_http_pass_var_error(nxt_task_t *task, void *obj, void *data);
static nxt_int_t nxt_http_pass_find(nxt_mp_t *mp, nxt_router_conf_t *rtcf,
nxt_str_t *pass, nxt_http_action_t *action);
static nxt_int_t nxt_http_route_find(nxt_http_routes_t *routes, nxt_str_t *name,
nxt_http_action_t *action);
@@ -652,7 +650,7 @@ nxt_http_action_init(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
{
nxt_mp_t *mp;
nxt_int_t ret;
nxt_str_t name, *string;
nxt_str_t pass;
nxt_http_action_conf_t acf;
nxt_memzero(&acf, sizeof(acf));
@@ -679,10 +677,10 @@ nxt_http_action_init(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
return nxt_http_proxy_init(mp, action, &acf);
}
nxt_conf_get_string(acf.pass, &name);
nxt_conf_get_string(acf.pass, &pass);
string = nxt_str_dup(mp, &action->name, &name);
if (nxt_slow_path(string == NULL)) {
action->u.var = nxt_var_compile(&pass, mp);
if (nxt_slow_path(action->u.var == NULL)) {
return NXT_ERROR;
}
@@ -1372,7 +1370,7 @@ nxt_http_action_resolve(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
nxt_http_action_t *action)
{
nxt_int_t ret;
nxt_var_t *var;
nxt_str_t pass;
if (action->handler != NULL) {
if (action->fallback != NULL) {
@@ -1382,20 +1380,17 @@ nxt_http_action_resolve(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
return NXT_OK;
}
if (nxt_is_var(&action->name)) {
var = nxt_var_compile(&action->name, tmcf->router_conf->mem_pool);
if (nxt_slow_path(var == NULL)) {
if (nxt_var_is_const(action->u.var)) {
nxt_var_raw(action->u.var, &pass);
ret = nxt_http_pass_find(tmcf->mem_pool, tmcf->router_conf, &pass,
action);
if (nxt_slow_path(ret != NXT_OK)) {
return NXT_ERROR;
}
action->u.var = var;
action->handler = nxt_http_action_pass_var;
return NXT_OK;
}
ret = nxt_http_pass_find(task, tmcf->mem_pool, tmcf->router_conf, action);
if (nxt_slow_path(ret != NXT_OK)) {
return NXT_ERROR;
} else {
action->handler = nxt_http_pass_var;
}
return NXT_OK;
@@ -1403,28 +1398,36 @@ nxt_http_action_resolve(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
static nxt_http_action_t *
nxt_http_action_pass_var(nxt_task_t *task, nxt_http_request_t *r,
nxt_http_pass_var(nxt_task_t *task, nxt_http_request_t *r,
nxt_http_action_t *action)
{
nxt_var_t *var;
nxt_int_t ret;
nxt_str_t str;
nxt_var_t *var;
var = action->u.var;
nxt_var_raw(var, &str);
nxt_debug(task, "http pass: \"%V\"", &str);
ret = nxt_var_query_init(&r->var_query, r, r->mem_pool);
if (nxt_slow_path(ret != NXT_OK)) {
goto fail;
}
var = action->u.var;
action = nxt_mp_get(r->mem_pool, sizeof(nxt_http_action_t));
action = nxt_mp_get(r->mem_pool,
sizeof(nxt_http_action_t) + sizeof(nxt_str_t));
if (nxt_slow_path(action == NULL)) {
goto fail;
}
nxt_var_query(task, r->var_query, var, &action->name);
action->u.pass = nxt_pointer_to(action, sizeof(nxt_http_action_t));
nxt_var_query(task, r->var_query, var, action->u.pass);
nxt_var_query_resolve(task, r->var_query, action,
nxt_http_action_pass_var_ready,
nxt_http_action_pass_var_error);
nxt_http_pass_var_ready,
nxt_http_pass_var_error);
return NULL;
fail:
@@ -1435,7 +1438,7 @@ fail:
static void
nxt_http_action_pass_var_ready(nxt_task_t *task, void *obj, void *data)
nxt_http_pass_var_ready(nxt_task_t *task, void *obj, void *data)
{
nxt_int_t ret;
nxt_router_conf_t *rtcf;
@@ -1447,9 +1450,9 @@ nxt_http_action_pass_var_ready(nxt_task_t *task, void *obj, void *data)
action = data;
rtcf = r->conf->socket_conf->router_conf;
nxt_debug(task, "http pass lookup: %V", &action->name);
nxt_debug(task, "http pass lookup: %V", action->u.pass);
ret = nxt_http_pass_find(task, r->mem_pool, rtcf, action);
ret = nxt_http_pass_find(r->mem_pool, rtcf, action->u.pass, action);
if (ret != NXT_OK) {
status = (ret == NXT_DECLINED) ? NXT_HTTP_NOT_FOUND
@@ -1464,7 +1467,7 @@ nxt_http_action_pass_var_ready(nxt_task_t *task, void *obj, void *data)
static void
nxt_http_action_pass_var_error(nxt_task_t *task, void *obj, void *data)
nxt_http_pass_var_error(nxt_task_t *task, void *obj, void *data)
{
nxt_http_request_t *r;
@@ -1475,13 +1478,13 @@ nxt_http_action_pass_var_error(nxt_task_t *task, void *obj, void *data)
static nxt_int_t
nxt_http_pass_find(nxt_task_t *task, nxt_mp_t *mp, nxt_router_conf_t *rtcf,
nxt_http_pass_find(nxt_mp_t *mp, nxt_router_conf_t *rtcf, nxt_str_t *pass,
nxt_http_action_t *action)
{
nxt_int_t ret;
nxt_str_t segments[3];
nxt_int_t ret;
nxt_str_t segments[3];
ret = nxt_http_pass_segments(mp, &action->name, segments, 3);
ret = nxt_http_pass_segments(mp, pass, segments, 3);
if (nxt_slow_path(ret != NXT_OK)) {
return ret;
}
@@ -1587,18 +1590,24 @@ nxt_http_route_find(nxt_http_routes_t *routes, nxt_str_t *name,
nxt_http_action_t *
nxt_http_action_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
nxt_str_t *name)
nxt_str_t *pass)
{
nxt_mp_t *mp;
nxt_int_t ret;
nxt_http_action_t *action;
action = nxt_mp_alloc(tmcf->router_conf->mem_pool,
sizeof(nxt_http_action_t));
mp = tmcf->router_conf->mem_pool;
action = nxt_mp_alloc(mp, sizeof(nxt_http_action_t));
if (nxt_slow_path(action == NULL)) {
return NULL;
}
action->name = *name;
action->u.var = nxt_var_compile(pass, mp);
if (nxt_slow_path(action->u.var == NULL)) {
return NULL;
}
action->handler = NULL;
ret = nxt_http_action_resolve(task, tmcf, action);
@@ -1623,8 +1632,6 @@ nxt_http_pass_application(nxt_task_t *task, nxt_router_conf_t *rtcf,
return NULL;
}
action->name = *name;
(void) nxt_router_application_init(rtcf, name, NULL, action);
return action;