summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorValentin Bartenev <vbart@nginx.com>2017-07-07 18:09:15 +0300
committerValentin Bartenev <vbart@nginx.com>2017-07-07 18:09:15 +0300
commitfc9f73bbea940b003824aec914bf6ea948c09252 (patch)
tree1c84c31b43e8b95f1d7d613b92bfcf9f6fa28ea0
parent9a402ea83d24ab4e380298a5718e7c4bf1a76219 (diff)
downloadunit-fc9f73bbea940b003824aec914bf6ea948c09252.tar.gz
unit-fc9f73bbea940b003824aec914bf6ea948c09252.tar.bz2
Controller: relaxed JSON parser.
Now it allows commas after the last elements in objects and arrays, as it's a common Igor's mistake.
-rw-r--r--src/nxt_conf.c152
1 files changed, 72 insertions, 80 deletions
diff --git a/src/nxt_conf.c b/src/nxt_conf.c
index f891f71e..935afab9 100644
--- a/src/nxt_conf.c
+++ b/src/nxt_conf.c
@@ -939,12 +939,6 @@ nxt_conf_json_parse_object(nxt_mp_t *mp, nxt_conf_value_t *value, u_char *start,
nxt_conf_object_t *object;
nxt_conf_object_member_t *member, *element;
- p = nxt_conf_json_skip_space(start + 1, end);
-
- if (nxt_slow_path(p == end)) {
- return NULL;
- }
-
mp_temp = nxt_mp_create(1024, 128, 256, 32);
if (nxt_slow_path(mp_temp == NULL)) {
return NULL;
@@ -953,70 +947,72 @@ nxt_conf_json_parse_object(nxt_mp_t *mp, nxt_conf_value_t *value, u_char *start,
nxt_lvlhsh_init(&hash);
count = 0;
+ p = start;
- if (*p != '}') {
-
- for ( ;; ) {
- count++;
+ for ( ;; ) {
+ p = nxt_conf_json_skip_space(p + 1, end);
- if (*p != '"') {
- goto error;
- }
+ if (nxt_slow_path(p == end)) {
+ goto error;
+ }
- member = nxt_mp_get(mp_temp, sizeof(nxt_conf_object_member_t));
- if (nxt_slow_path(member == NULL)) {
- goto error;
+ if (*p != '"') {
+ if (nxt_fast_path(*p == '}')) {
+ break;
}
- p = nxt_conf_json_parse_string(mp, &member->name, p, end);
+ goto error;
+ }
- if (nxt_slow_path(p == NULL)) {
- goto error;
- }
+ count++;
- rc = nxt_conf_object_hash_add(mp_temp, &hash, member);
+ member = nxt_mp_get(mp_temp, sizeof(nxt_conf_object_member_t));
+ if (nxt_slow_path(member == NULL)) {
+ goto error;
+ }
- if (nxt_slow_path(rc != NXT_OK)) {
- goto error;
- }
+ p = nxt_conf_json_parse_string(mp, &member->name, p, end);
- p = nxt_conf_json_skip_space(p, end);
+ if (nxt_slow_path(p == NULL)) {
+ goto error;
+ }
- if (nxt_slow_path(p == end || *p != ':')) {
- goto error;
- }
+ rc = nxt_conf_object_hash_add(mp_temp, &hash, member);
- p = nxt_conf_json_skip_space(p + 1, end);
+ if (nxt_slow_path(rc != NXT_OK)) {
+ goto error;
+ }
- if (nxt_slow_path(p == end)) {
- goto error;
- }
+ p = nxt_conf_json_skip_space(p, end);
- p = nxt_conf_json_parse_value(mp, &member->value, p, end);
+ if (nxt_slow_path(p == end || *p != ':')) {
+ goto error;
+ }
- if (nxt_slow_path(p == NULL)) {
- goto error;
- }
+ p = nxt_conf_json_skip_space(p + 1, end);
- p = nxt_conf_json_skip_space(p, end);
+ if (nxt_slow_path(p == end)) {
+ goto error;
+ }
- if (nxt_slow_path(p == end)) {
- goto error;
- }
+ p = nxt_conf_json_parse_value(mp, &member->value, p, end);
- if (*p == '}') {
- break;
- }
+ if (nxt_slow_path(p == NULL)) {
+ goto error;
+ }
- if (nxt_slow_path(*p != ',')) {
- goto error;
- }
+ p = nxt_conf_json_skip_space(p, end);
- p = nxt_conf_json_skip_space(p + 1, end);
+ if (nxt_slow_path(p == end)) {
+ goto error;
+ }
- if (nxt_slow_path(p == end)) {
- goto error;
+ if (*p != ',') {
+ if (nxt_fast_path(*p == '}')) {
+ break;
}
+
+ goto error;
}
}
@@ -1117,12 +1113,6 @@ nxt_conf_json_parse_array(nxt_mp_t *mp, nxt_conf_value_t *value, u_char *start,
nxt_conf_array_t *array;
nxt_conf_value_t *element;
- p = nxt_conf_json_skip_space(start + 1, end);
-
- if (nxt_slow_path(p == end)) {
- return NULL;
- }
-
mp_temp = nxt_mp_create(1024, 128, 256, 32);
if (nxt_slow_path(mp_temp == NULL)) {
return NULL;
@@ -1134,42 +1124,44 @@ nxt_conf_json_parse_array(nxt_mp_t *mp, nxt_conf_value_t *value, u_char *start,
}
count = 0;
+ p = start;
- if (*p != ']') {
-
- for ( ;; ) {
- count++;
+ for ( ;; ) {
+ p = nxt_conf_json_skip_space(p + 1, end);
- element = nxt_list_add(list);
- if (nxt_slow_path(element == NULL)) {
- goto error;
- }
+ if (nxt_slow_path(p == end)) {
+ goto error;
+ }
- p = nxt_conf_json_parse_value(mp, element, p, end);
+ if (*p == ']') {
+ break;
+ }
- if (nxt_slow_path(p == NULL)) {
- goto error;
- }
+ count++;
- p = nxt_conf_json_skip_space(p, end);
+ element = nxt_list_add(list);
+ if (nxt_slow_path(element == NULL)) {
+ goto error;
+ }
- if (nxt_slow_path(p == end)) {
- goto error;
- }
+ p = nxt_conf_json_parse_value(mp, element, p, end);
- if (*p == ']') {
- break;
- }
+ if (nxt_slow_path(p == NULL)) {
+ goto error;
+ }
- if (nxt_slow_path(*p != ',')) {
- goto error;
- }
+ p = nxt_conf_json_skip_space(p, end);
- p = nxt_conf_json_skip_space(p + 1, end);
+ if (nxt_slow_path(p == end)) {
+ goto error;
+ }
- if (nxt_slow_path(p == end)) {
- goto error;
+ if (*p != ',') {
+ if (nxt_fast_path(*p == ']')) {
+ break;
}
+
+ goto error;
}
}