blob: bc2714afdb8d55bf43b19a66e8dbbb65cc873354 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
local json = require 'json'
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')
ERR: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
OUT:push(data)
end
while true do
readProto()
collectgarbage()
GC:push(ID, collectgarbage 'count')
end
|