diff --git a/mongoose.c b/mongoose.c index f670a232..d54c6ee6 100644 --- a/mongoose.c +++ b/mongoose.c @@ -1901,7 +1901,19 @@ static void printdirentry(const char *name, void *userdata) { } else { mg_snprintf(sz, sizeof(sz), "%lld", (uint64_t) size); } +#if defined(MG_HTTP_DIRLIST_TIME) + char time_str[30]; + struct tm * time_info = localtime(&t); + strftime(time_str, sizeof time_str, "%Y/%m/%d %H:%M:%S", time_info); + mg_snprintf(mod, sizeof(mod), "%s", time_str); +#elif defined(MG_HTTP_DIRLIST_TIME_UTC) + char time_str[30]; + struct tm * time_info = gmtime(&t); + strftime(time_str, sizeof time_str, "%Y/%m/%d %H:%M:%S", time_info); + mg_snprintf(mod, sizeof(mod), "%s", time_str); +#else mg_snprintf(mod, sizeof(mod), "%ld", (unsigned long) t); +#endif n = (int) mg_url_encode(name, strlen(name), path, sizeof(path)); mg_printf(d->c, " %s%s" @@ -2482,6 +2494,7 @@ int mg_json_get(struct mg_str json, const char *path, int *toklen) { int pos = 1; // Current position in `path` int ci = -1, ei = -1; // Current and expected index in array + if (toklen) *toklen = 0; if (path[0] != '$') return MG_JSON_INVALID; #define MG_CHECKRET(x) \ @@ -2560,6 +2573,7 @@ int mg_json_get(struct mg_str json, const char *path, int *toklen) { if (n < 0) return n; if (i + 1 + n >= len) return MG_JSON_NOT_FOUND; if (depth < ed) return MG_JSON_NOT_FOUND; + if (depth == ed && path[pos - 1] != '.') return MG_JSON_NOT_FOUND; // printf("K %s [%.*s] [%.*s] %d %d %d\n", path, pos, path, n, // &s[i + 1], n, depth, ed); // NOTE(cpq): in the check sequence below is important. diff --git a/src/json.c b/src/json.c index eab85750..bc04b045 100644 --- a/src/json.c +++ b/src/json.c @@ -1,6 +1,6 @@ -#include "json.h" #include "base64.h" #include "fmt.h" +#include "json.h" static const char *escapeseq(int esc) { return esc ? "\b\f\n\r\t\\\"" : "bfnrt\\\""; @@ -86,6 +86,7 @@ int mg_json_get(struct mg_str json, const char *path, int *toklen) { int pos = 1; // Current position in `path` int ci = -1, ei = -1; // Current and expected index in array + if (toklen) *toklen = 0; if (path[0] != '$') return MG_JSON_INVALID; #define MG_CHECKRET(x) \ @@ -164,6 +165,7 @@ int mg_json_get(struct mg_str json, const char *path, int *toklen) { if (n < 0) return n; if (i + 1 + n >= len) return MG_JSON_NOT_FOUND; if (depth < ed) return MG_JSON_NOT_FOUND; + if (depth == ed && path[pos - 1] != '.') return MG_JSON_NOT_FOUND; // printf("K %s [%.*s] [%.*s] %d %d %d\n", path, pos, path, n, // &s[i + 1], n, depth, ed); // NOTE(cpq): in the check sequence below is important. diff --git a/test/unit_test.c b/test/unit_test.c index 52d70c4c..2bb763c1 100644 --- a/test/unit_test.c +++ b/test/unit_test.c @@ -2393,21 +2393,21 @@ static void test_json(void) { ASSERT(mg_json_get(mg_str_n("[1,2]", 5), "$[3]", &n) == MG_JSON_NOT_FOUND); json = mg_str("{\"a\":[]}"); - ASSERT(mg_json_get(json, "$.a", &n) == 5); + ASSERT(mg_json_get(json, "$.a", &n) == 5 && n == 2); json = mg_str("{\"a\":[1,2]}"); - ASSERT(mg_json_get(json, "$.a", &n) == 5); + ASSERT(mg_json_get(json, "$.a", &n) == 5 && n == 5); json = mg_str("{\"a\":[1,[1]]}"); - ASSERT(mg_json_get(json, "$.a", &n) == 5); + ASSERT(mg_json_get(json, "$.a", &n) == 5 && n == 7); json = mg_str("{\"a\":[[]]}"); - ASSERT(mg_json_get(json, "$.a", &n) == 5); + ASSERT(mg_json_get(json, "$.a", &n) == 5 && n == 4); json = mg_str("{\"a\":[[1,2]]}"); - ASSERT(mg_json_get(json, "$.a", &n) == 5); + ASSERT(mg_json_get(json, "$.a", &n) == 5 && n == 7); json = mg_str("{\"a\":{}}"); - ASSERT(mg_json_get(json, "$.a", &n) == 5); + ASSERT(mg_json_get(json, "$.a", &n) == 5 && n == 2); json = mg_str("{\"a\":{\"a\":{}}}"); - ASSERT(mg_json_get(json, "$.a", &n) == 5); + ASSERT(mg_json_get(json, "$.a", &n) == 5 && n == 8); json = mg_str("{\"a\":{\"a\":[]}}"); - ASSERT(mg_json_get(json, "$.a", &n) == 5); + ASSERT(mg_json_get(json, "$.a", &n) == 5 && n == 8); json = mg_str("[[1,[2,3]],4]"); ASSERT(mg_json_get(json, "$", &n) == 0 && n == 13); @@ -2521,6 +2521,22 @@ static void test_json(void) { ASSERT(mg_json_get_long(json, "$.a[2]", -42) == 4); ASSERT(mg_json_get_long(json, "$.a[3]", -42) == -42); } + + json = mg_str("{\"a\":[],\"b\":[1,2]}"); + ASSERT(mg_json_get(json, "$.a", &n) == 5 && n == 2); + ASSERT(mg_json_get(json, "$.a[0]", &n) < 0 && n == 0); + + json = mg_str("{\"a\":{},\"b\":[1,2]}"); + ASSERT(mg_json_get(json, "$.a", &n) == 5 && n == 2); + ASSERT(mg_json_get(json, "$.a[0]", &n) < 0 && n == 0); + + json = mg_str("{\"a\":true,\"b\":[1,2]}"); + ASSERT(mg_json_get(json, "$.a", &n) == 5 && n == 4); + ASSERT(mg_json_get(json, "$.a[0]", &n) < 0 && n == 0); + + json = mg_str("{\"a\":1,\"b\":[1,2]}"); + ASSERT(mg_json_get(json, "$.a", &n) == 5 && n == 1); + ASSERT(mg_json_get(json, "$.a[0]", &n) < 0 && n == 0); } static void resp_rpc(struct mg_rpc_req *r) {