diff options
Diffstat (limited to 'server/src/async/proto.lua')
-rw-r--r-- | server/src/async/proto.lua | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/server/src/async/proto.lua b/server/src/async/proto.lua new file mode 100644 index 00000000..4570de2e --- /dev/null +++ b/server/src/async/proto.lua @@ -0,0 +1,59 @@ +local thread = require 'bee.thread' +local json = require 'json' +local proto = thread.channel 'proto' +local errlog = thread.channel 'errlog' + +local function pushError(...) + local t = table.pack(...) + for i = 1, t.n do + t[i] = tostring(t[i]) + end + local buf = table.concat(t, '\t') + errlog:push(buf) +end + +local function readProtoHeader() + local header = io.read 'l' + if header:sub(1, #'Content-Length') == 'Content-Length' then + return header + elseif header:sub(1, #'Content-Type') == 'Content-Type' then + return nil + else + pushError('Proto header error:', header) + return nil + end +end + +local function readProtoContent(header) + local len = tonumber(header:match('%d+')) + if not len then + pushError('Proto header error:', header) + return nil + end + local buf = io.read(len+2) + if not buf then + return nil + end + local suc, res = pcall(json.decode, buf) + if not suc then + pushError('Proto error:', buf) + return nil + end + return res +end + +local function readProto() + local header = readProtoHeader() + if not header then + return + end + local data = readProtoContent(header) + if not data then + return + end + proto:push(data) +end + +while true do + readProto() +end |