Implemented "location" option for "return" action.
This allows to specify redirects:
{
"action": {
"return": 301,
"location": "https://www.example.com/"
}
}
This commit is contained in:
@@ -362,6 +362,11 @@ static nxt_conf_vldt_object_t nxt_conf_vldt_return_action_members[] = {
|
|||||||
&nxt_conf_vldt_return,
|
&nxt_conf_vldt_return,
|
||||||
NULL },
|
NULL },
|
||||||
|
|
||||||
|
{ nxt_string("location"),
|
||||||
|
NXT_CONF_VLDT_STRING,
|
||||||
|
NULL,
|
||||||
|
NULL },
|
||||||
|
|
||||||
NXT_CONF_VLDT_END
|
NXT_CONF_VLDT_END
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1103,6 +1103,8 @@ static const nxt_str_t nxt_http_redirection[] = {
|
|||||||
nxt_string("HTTP/1.1 302 Found\r\n"),
|
nxt_string("HTTP/1.1 302 Found\r\n"),
|
||||||
nxt_string("HTTP/1.1 303 See Other\r\n"),
|
nxt_string("HTTP/1.1 303 See Other\r\n"),
|
||||||
nxt_string("HTTP/1.1 304 Not Modified\r\n"),
|
nxt_string("HTTP/1.1 304 Not Modified\r\n"),
|
||||||
|
nxt_string("HTTP/1.1 307 Temporary Redirect\r\n"),
|
||||||
|
nxt_string("HTTP/1.1 308 Permanent Redirect\r\n"),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ typedef enum {
|
|||||||
NXT_HTTP_FOUND = 302,
|
NXT_HTTP_FOUND = 302,
|
||||||
NXT_HTTP_SEE_OTHER = 303,
|
NXT_HTTP_SEE_OTHER = 303,
|
||||||
NXT_HTTP_NOT_MODIFIED = 304,
|
NXT_HTTP_NOT_MODIFIED = 304,
|
||||||
|
NXT_HTTP_TEMPORARY_REDIRECT = 307,
|
||||||
|
NXT_HTTP_PERMANENT_REDIRECT = 308,
|
||||||
|
|
||||||
NXT_HTTP_BAD_REQUEST = 400,
|
NXT_HTTP_BAD_REQUEST = 400,
|
||||||
NXT_HTTP_FORBIDDEN = 403,
|
NXT_HTTP_FORBIDDEN = 403,
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ nxt_http_action_t *
|
|||||||
nxt_http_return_handler(nxt_task_t *task, nxt_http_request_t *r,
|
nxt_http_return_handler(nxt_task_t *task, nxt_http_request_t *r,
|
||||||
nxt_http_action_t *action)
|
nxt_http_action_t *action)
|
||||||
{
|
{
|
||||||
|
nxt_http_field_t *field;
|
||||||
nxt_http_status_t status;
|
nxt_http_status_t status;
|
||||||
|
|
||||||
status = action->u.return_code;
|
status = action->u.return_code;
|
||||||
@@ -27,6 +28,20 @@ nxt_http_return_handler(nxt_task_t *task, nxt_http_request_t *r,
|
|||||||
|
|
||||||
r->status = status;
|
r->status = status;
|
||||||
r->resp.content_length_n = 0;
|
r->resp.content_length_n = 0;
|
||||||
|
|
||||||
|
if (action->name.length > 0) {
|
||||||
|
field = nxt_list_zero_add(r->resp.fields);
|
||||||
|
if (nxt_slow_path(field == NULL)) {
|
||||||
|
nxt_http_request_error(task, r, NXT_HTTP_INTERNAL_SERVER_ERROR);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
nxt_http_field_name_set(field, "Location");
|
||||||
|
|
||||||
|
field->value = action->name.start;
|
||||||
|
field->value_length = action->name.length;
|
||||||
|
}
|
||||||
|
|
||||||
r->state = &nxt_http_return_send_state;
|
r->state = &nxt_http_return_send_state;
|
||||||
|
|
||||||
nxt_http_request_header_send(task, r, NULL, NULL);
|
nxt_http_request_header_send(task, r, NULL, NULL);
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ typedef enum {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
nxt_conf_value_t *pass;
|
nxt_conf_value_t *pass;
|
||||||
nxt_conf_value_t *ret;
|
nxt_conf_value_t *ret;
|
||||||
|
nxt_str_t location;
|
||||||
nxt_conf_value_t *share;
|
nxt_conf_value_t *share;
|
||||||
nxt_conf_value_t *proxy;
|
nxt_conf_value_t *proxy;
|
||||||
nxt_conf_value_t *fallback;
|
nxt_conf_value_t *fallback;
|
||||||
@@ -581,6 +582,11 @@ static nxt_conf_map_t nxt_http_route_action_conf[] = {
|
|||||||
NXT_CONF_MAP_PTR,
|
NXT_CONF_MAP_PTR,
|
||||||
offsetof(nxt_http_route_action_conf_t, ret)
|
offsetof(nxt_http_route_action_conf_t, ret)
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
nxt_string("location"),
|
||||||
|
NXT_CONF_MAP_STR,
|
||||||
|
offsetof(nxt_http_route_action_conf_t, location)
|
||||||
|
},
|
||||||
{
|
{
|
||||||
nxt_string("share"),
|
nxt_string("share"),
|
||||||
NXT_CONF_MAP_PTR,
|
NXT_CONF_MAP_PTR,
|
||||||
@@ -606,6 +612,7 @@ nxt_http_route_action_create(nxt_router_temp_conf_t *tmcf, nxt_conf_value_t *cv,
|
|||||||
nxt_mp_t *mp;
|
nxt_mp_t *mp;
|
||||||
nxt_int_t ret;
|
nxt_int_t ret;
|
||||||
nxt_str_t name, *string;
|
nxt_str_t name, *string;
|
||||||
|
nxt_uint_t encode;
|
||||||
nxt_conf_value_t *conf;
|
nxt_conf_value_t *conf;
|
||||||
nxt_http_route_action_conf_t accf;
|
nxt_http_route_action_conf_t accf;
|
||||||
|
|
||||||
@@ -619,9 +626,38 @@ nxt_http_route_action_create(nxt_router_temp_conf_t *tmcf, nxt_conf_value_t *cv,
|
|||||||
|
|
||||||
nxt_memzero(action, sizeof(nxt_http_action_t));
|
nxt_memzero(action, sizeof(nxt_http_action_t));
|
||||||
|
|
||||||
|
mp = tmcf->router_conf->mem_pool;
|
||||||
|
|
||||||
if (accf.ret != NULL) {
|
if (accf.ret != NULL) {
|
||||||
action->handler = nxt_http_return_handler;
|
action->handler = nxt_http_return_handler;
|
||||||
action->u.return_code = nxt_conf_get_integer(accf.ret);
|
action->u.return_code = nxt_conf_get_integer(accf.ret);
|
||||||
|
|
||||||
|
if (accf.location.length > 0) {
|
||||||
|
if (nxt_is_complex_uri_encoded(accf.location.start,
|
||||||
|
accf.location.length))
|
||||||
|
{
|
||||||
|
string = nxt_str_dup(mp, &action->name, &accf.location);
|
||||||
|
if (nxt_slow_path(string == NULL)) {
|
||||||
|
return NXT_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
string = &action->name;
|
||||||
|
|
||||||
|
encode = nxt_encode_complex_uri(NULL, accf.location.start,
|
||||||
|
accf.location.length);
|
||||||
|
string->length = accf.location.length + encode * 2;
|
||||||
|
|
||||||
|
string->start = nxt_mp_nget(mp, string->length);
|
||||||
|
if (nxt_slow_path(string->start == NULL)) {
|
||||||
|
return NXT_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
nxt_encode_complex_uri(string->start, accf.location.start,
|
||||||
|
accf.location.length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return NXT_OK;
|
return NXT_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -637,8 +673,6 @@ nxt_http_route_action_create(nxt_router_temp_conf_t *tmcf, nxt_conf_value_t *cv,
|
|||||||
|
|
||||||
nxt_conf_get_string(conf, &name);
|
nxt_conf_get_string(conf, &name);
|
||||||
|
|
||||||
mp = tmcf->router_conf->mem_pool;
|
|
||||||
|
|
||||||
string = nxt_str_dup(mp, &action->name, &name);
|
string = nxt_str_dup(mp, &action->name, &name);
|
||||||
if (nxt_slow_path(string == NULL)) {
|
if (nxt_slow_path(string == NULL)) {
|
||||||
return NXT_ERROR;
|
return NXT_ERROR;
|
||||||
|
|||||||
Reference in New Issue
Block a user