Software /
code /
prosody
Diff
util/json.lua @ 12792:997f3ca90628 0.12
util.json: Accept empty arrays with whitespace (fixes #1782)
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Fri, 04 Nov 2022 12:26:10 +0000 |
parent | 9329:19bc3ec13f07 |
child | 12975:d10957394a3c |
line wrap: on
line diff
--- a/util/json.lua Mon Oct 31 14:32:02 2022 +0000 +++ b/util/json.lua Fri Nov 04 12:26:10 2022 +0000 @@ -217,12 +217,19 @@ end local function _readarray(json, index) local a = {}; - local oindex = index; while true do - local val; - val, index = _readvalue(json, index + 1); + local val, terminated; + val, index, terminated = _readvalue(json, index + 1, 0x5d); if val == nil then - if json:byte(oindex + 1) == 0x5d then return setmetatable(a, array_mt), oindex + 2; end -- "]" + if terminated then -- "]" found instead of value + if #a ~= 0 then + -- A non-empty array here means we processed a comma, + -- but it wasn't followed by a value. JSON doesn't allow + -- trailing commas. + return nil, "value expected"; + end + val, index = setmetatable(a, array_mt), index+1; + end return val, index; end t_insert(a, val); @@ -294,7 +301,7 @@ end return nil, "false parse failed"; end -function _readvalue(json, index) +function _readvalue(json, index, terminator) index = _skip_whitespace(json, index); local b = json:byte(index); -- TODO try table lookup instead of if-else? @@ -312,6 +319,8 @@ return _readtrue(json, index); elseif b == 0x66 then -- "f" return _readfalse(json, index); + elseif b == terminator then + return nil, index, true; else return nil, "value expected"; end