summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_conf_validation.c
diff options
context:
space:
mode:
authorValentin Bartenev <vbart@nginx.com>2020-05-14 13:15:00 +0300
committerValentin Bartenev <vbart@nginx.com>2020-05-14 13:15:00 +0300
commit0174c971b5ec0d604e4e9becfa41e0bc31179e57 (patch)
tree8d0c0c41b10cc290084676aac836c1dd2313410b /src/nxt_conf_validation.c
parentd803ec39bc75622194802d249edc11fedc8e2441 (diff)
downloadunit-0174c971b5ec0d604e4e9becfa41e0bc31179e57.tar.gz
unit-0174c971b5ec0d604e4e9becfa41e0bc31179e57.tar.bz2
Configuration: URI encoding in the "pass" option.
This is useful to escape "/" in path fragments. For example, in order to reference the application named "foo/bar": { "pass": "applications/foo%2Fbar" }
Diffstat (limited to 'src/nxt_conf_validation.c')
-rw-r--r--src/nxt_conf_validation.c60
1 files changed, 27 insertions, 33 deletions
diff --git a/src/nxt_conf_validation.c b/src/nxt_conf_validation.c
index bc03bdfb..476fc97b 100644
--- a/src/nxt_conf_validation.c
+++ b/src/nxt_conf_validation.c
@@ -1032,79 +1032,73 @@ static nxt_int_t
nxt_conf_vldt_pass(nxt_conf_validation_t *vldt, nxt_conf_value_t *value,
void *data)
{
- u_char *p;
- nxt_str_t pass, first, second;
+ nxt_str_t pass;
+ nxt_int_t ret;
+ nxt_str_t segments[2];
nxt_conf_get_string(value, &pass);
- p = nxt_memchr(pass.start, '/', pass.length);
-
- if (p != NULL) {
- first.length = p - pass.start;
- first.start = pass.start;
+ ret = nxt_http_pass_segments(vldt->pool, &pass, segments, 2);
- if (pass.length - first.length == 1) {
- goto error;
+ if (ret != NXT_OK) {
+ if (ret == NXT_DECLINED) {
+ return nxt_conf_vldt_error(vldt, "Request \"pass\" value \"%V\" "
+ "is invalid.", &pass);
}
- second.length = pass.length - first.length - 1;
- second.start = p + 1;
-
- } else {
- first = pass;
- second.length = 0;
+ return NXT_ERROR;
}
- if (nxt_str_eq(&first, "applications", 12)) {
+ if (nxt_str_eq(&segments[0], "applications", 12)) {
- if (second.length == 0) {
+ if (segments[1].length == 0) {
goto error;
}
- value = nxt_conf_get_object_member(vldt->conf, &first, NULL);
+ value = nxt_conf_get_object_member(vldt->conf, &segments[0], NULL);
- if (nxt_slow_path(value == NULL)) {
+ if (value == NULL) {
goto error;
}
- value = nxt_conf_get_object_member(value, &second, NULL);
+ value = nxt_conf_get_object_member(value, &segments[1], NULL);
- if (nxt_slow_path(value == NULL)) {
+ if (value == NULL) {
goto error;
}
return NXT_OK;
}
- if (nxt_str_eq(&first, "upstreams", 9)) {
+ if (nxt_str_eq(&segments[0], "upstreams", 9)) {
- if (second.length == 0) {
+ if (segments[1].length == 0) {
goto error;
}
- value = nxt_conf_get_object_member(vldt->conf, &first, NULL);
+ value = nxt_conf_get_object_member(vldt->conf, &segments[0], NULL);
- if (nxt_slow_path(value == NULL)) {
+ if (value == NULL) {
goto error;
}
- value = nxt_conf_get_object_member(value, &second, NULL);
+ value = nxt_conf_get_object_member(value, &segments[1], NULL);
- if (nxt_slow_path(value == NULL)) {
+ if (value == NULL) {
goto error;
}
return NXT_OK;
}
- if (nxt_str_eq(&first, "routes", 6)) {
- value = nxt_conf_get_object_member(vldt->conf, &first, NULL);
+ if (nxt_str_eq(&segments[0], "routes", 6)) {
+ value = nxt_conf_get_object_member(vldt->conf, &segments[0], NULL);
- if (nxt_slow_path(value == NULL)) {
+ if (value == NULL) {
goto error;
}
- if (second.length == 0) {
+ if (segments[1].length == 0) {
if (nxt_conf_type(value) != NXT_CONF_ARRAY) {
goto error;
}
@@ -1116,9 +1110,9 @@ nxt_conf_vldt_pass(nxt_conf_validation_t *vldt, nxt_conf_value_t *value,
goto error;
}
- value = nxt_conf_get_object_member(value, &second, NULL);
+ value = nxt_conf_get_object_member(value, &segments[1], NULL);
- if (nxt_slow_path(value == NULL)) {
+ if (value == NULL) {
goto error;
}