Configuration: added ability to modify object members with slashes.
Example: PUT/POST/DELETE /config/listeners/unix:%2Fpath%2Fto%2Fsocket This follows a49ee872e83d.
This commit is contained in:
@@ -16,6 +16,8 @@
|
|||||||
#define NXT_CONF_MAX_SHORT_STRING 14
|
#define NXT_CONF_MAX_SHORT_STRING 14
|
||||||
#define NXT_CONF_MAX_STRING NXT_INT32_T_MAX
|
#define NXT_CONF_MAX_STRING NXT_INT32_T_MAX
|
||||||
|
|
||||||
|
#define NXT_CONF_MAX_TOKEN_LEN 256
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NXT_CONF_VALUE_NULL = 0,
|
NXT_CONF_VALUE_NULL = 0,
|
||||||
@@ -90,6 +92,17 @@ struct nxt_conf_op_s {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
u_char *start;
|
||||||
|
u_char *end;
|
||||||
|
nxt_bool_t last;
|
||||||
|
u_char buf[NXT_CONF_MAX_TOKEN_LEN];
|
||||||
|
} nxt_conf_path_parse_t;
|
||||||
|
|
||||||
|
|
||||||
|
static nxt_int_t nxt_conf_path_next_token(nxt_conf_path_parse_t *parse,
|
||||||
|
nxt_str_t *token);
|
||||||
|
|
||||||
static u_char *nxt_conf_json_skip_space(u_char *start, u_char *end);
|
static u_char *nxt_conf_json_skip_space(u_char *start, u_char *end);
|
||||||
static u_char *nxt_conf_json_parse_value(nxt_mp_t *mp, nxt_conf_value_t *value,
|
static u_char *nxt_conf_json_parse_value(nxt_mp_t *mp, nxt_conf_value_t *value,
|
||||||
u_char *start, u_char *end, nxt_conf_json_error_t *error);
|
u_char *start, u_char *end, nxt_conf_json_error_t *error);
|
||||||
@@ -402,33 +415,22 @@ nxt_conf_type(nxt_conf_value_t *value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
u_char *start;
|
|
||||||
u_char *end;
|
|
||||||
nxt_bool_t last;
|
|
||||||
} nxt_conf_path_parse_t;
|
|
||||||
|
|
||||||
|
|
||||||
static void nxt_conf_path_next_token(nxt_conf_path_parse_t *parse,
|
|
||||||
nxt_str_t *token);
|
|
||||||
|
|
||||||
|
|
||||||
nxt_conf_value_t *
|
nxt_conf_value_t *
|
||||||
nxt_conf_get_path(nxt_conf_value_t *value, nxt_str_t *path)
|
nxt_conf_get_path(nxt_conf_value_t *value, nxt_str_t *path)
|
||||||
{
|
{
|
||||||
u_char *end;
|
|
||||||
nxt_str_t token;
|
nxt_str_t token;
|
||||||
nxt_int_t index;
|
nxt_int_t ret, index;
|
||||||
nxt_conf_path_parse_t parse;
|
nxt_conf_path_parse_t parse;
|
||||||
|
|
||||||
u_char buf[256];
|
|
||||||
|
|
||||||
parse.start = path->start;
|
parse.start = path->start;
|
||||||
parse.end = path->start + path->length;
|
parse.end = path->start + path->length;
|
||||||
parse.last = 0;
|
parse.last = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
nxt_conf_path_next_token(&parse, &token);
|
ret = nxt_conf_path_next_token(&parse, &token);
|
||||||
|
if (nxt_slow_path(ret != NXT_OK)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (token.length == 0) {
|
if (token.length == 0) {
|
||||||
|
|
||||||
@@ -439,18 +441,6 @@ nxt_conf_get_path(nxt_conf_value_t *value, nxt_str_t *path)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nxt_slow_path(token.length > 256)) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
end = nxt_decode_uri(buf, token.start, token.length);
|
|
||||||
if (nxt_slow_path(end == NULL)) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
token.length = end - buf;
|
|
||||||
token.start = buf;
|
|
||||||
|
|
||||||
switch (value->type) {
|
switch (value->type) {
|
||||||
|
|
||||||
case NXT_CONF_VALUE_OBJECT:
|
case NXT_CONF_VALUE_OBJECT:
|
||||||
@@ -481,24 +471,38 @@ nxt_conf_get_path(nxt_conf_value_t *value, nxt_str_t *path)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static nxt_int_t
|
||||||
nxt_conf_path_next_token(nxt_conf_path_parse_t *parse, nxt_str_t *token)
|
nxt_conf_path_next_token(nxt_conf_path_parse_t *parse, nxt_str_t *token)
|
||||||
{
|
{
|
||||||
u_char *p, *end;
|
u_char *p, *start, *end;
|
||||||
|
size_t length;
|
||||||
|
|
||||||
end = parse->end;
|
start = parse->start + 1;
|
||||||
p = parse->start + 1;
|
|
||||||
|
|
||||||
token->start = p;
|
p = start;
|
||||||
|
|
||||||
while (p < end && *p != '/') {
|
while (p < parse->end && *p != '/') {
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
|
|
||||||
parse->start = p;
|
parse->start = p;
|
||||||
parse->last = (p >= end);
|
parse->last = (p >= parse->end);
|
||||||
|
|
||||||
token->length = p - token->start;
|
length = p - start;
|
||||||
|
|
||||||
|
if (nxt_slow_path(length > NXT_CONF_MAX_TOKEN_LEN)) {
|
||||||
|
return NXT_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
end = nxt_decode_uri(parse->buf, start, length);
|
||||||
|
if (nxt_slow_path(end == NULL)) {
|
||||||
|
return NXT_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
token->length = end - parse->buf;
|
||||||
|
token->start = parse->buf;
|
||||||
|
|
||||||
|
return NXT_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -757,7 +761,7 @@ nxt_conf_op_compile(nxt_mp_t *mp, nxt_conf_op_t **ops, nxt_conf_value_t *root,
|
|||||||
nxt_str_t *path, nxt_conf_value_t *value, nxt_bool_t add)
|
nxt_str_t *path, nxt_conf_value_t *value, nxt_bool_t add)
|
||||||
{
|
{
|
||||||
nxt_str_t token;
|
nxt_str_t token;
|
||||||
nxt_int_t index;
|
nxt_int_t ret, index;
|
||||||
nxt_conf_op_t *op, **parent;
|
nxt_conf_op_t *op, **parent;
|
||||||
nxt_conf_value_t *node;
|
nxt_conf_value_t *node;
|
||||||
nxt_conf_path_parse_t parse;
|
nxt_conf_path_parse_t parse;
|
||||||
@@ -778,7 +782,10 @@ nxt_conf_op_compile(nxt_mp_t *mp, nxt_conf_op_t **ops, nxt_conf_value_t *root,
|
|||||||
*parent = op;
|
*parent = op;
|
||||||
parent = (nxt_conf_op_t **) &op->ctx;
|
parent = (nxt_conf_op_t **) &op->ctx;
|
||||||
|
|
||||||
nxt_conf_path_next_token(&parse, &token);
|
ret = nxt_conf_path_next_token(&parse, &token);
|
||||||
|
if (nxt_slow_path(ret != NXT_OK)) {
|
||||||
|
return NXT_CONF_OP_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
switch (root->type) {
|
switch (root->type) {
|
||||||
|
|
||||||
@@ -872,7 +879,10 @@ nxt_conf_op_compile(nxt_mp_t *mp, nxt_conf_op_t **ops, nxt_conf_value_t *root,
|
|||||||
return NXT_CONF_OP_ERROR;
|
return NXT_CONF_OP_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
nxt_conf_set_string(&member->name, &token);
|
ret = nxt_conf_set_string_dup(&member->name, mp, &token);
|
||||||
|
if (nxt_slow_path(ret != NXT_OK)) {
|
||||||
|
return NXT_CONF_OP_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
member->value = *value;
|
member->value = *value;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user