78 lines
1.7 KiB
Lua
78 lines
1.7 KiB
Lua
-- Test sjson and GitHub API
|
|
|
|
local s = tls.createConnection()
|
|
s:on("connection", function(sck)
|
|
sck:send(
|
|
[[GET /repos/nodemcu/nodemcu-firmware/git/trees/master HTTP/1.0
|
|
User-agent: nodemcu/0.1
|
|
Host: api.github.com
|
|
Connection: close
|
|
Accept: application/json
|
|
|
|
]])
|
|
end)
|
|
|
|
local function startswith(String, Start)
|
|
return string.sub(String, 1, string.len(Start)) == Start
|
|
end
|
|
|
|
local seenBlank = false
|
|
local partial
|
|
local wantval = { tree = 1, path = 1, url = 1 }
|
|
-- Make an sjson decoder that only keeps certain fields
|
|
local decoder = sjson.decoder({
|
|
metatable =
|
|
{
|
|
__newindex = function(t, k, v)
|
|
if wantval[k] or type(k) == "number" then
|
|
rawset(t, k, v)
|
|
end
|
|
end
|
|
}
|
|
})
|
|
local function handledata(sck)
|
|
decoder:write(sck)
|
|
end
|
|
|
|
-- The receive callback is somewhat gnarly as it has to deal with find the end of the header
|
|
-- and having the newline sequence split across packets
|
|
s:on("receive", function(socket, c) -- luacheck: no unused
|
|
if partial then
|
|
c = partial .. c
|
|
partial = nil
|
|
end
|
|
if seenBlank then
|
|
handledata(c)
|
|
return
|
|
end
|
|
while c do
|
|
if startswith(c, "\r\n") then
|
|
seenBlank = true
|
|
c = c:sub(3)
|
|
handledata(c)
|
|
return
|
|
end
|
|
local str, e = c:find("\r\n")
|
|
if str then
|
|
-- Throw away line
|
|
c = c:sub(e + 1)
|
|
else
|
|
partial = c
|
|
c = nil
|
|
end
|
|
end
|
|
end)
|
|
|
|
local function getresult()
|
|
local result = decoder:result()
|
|
-- This gets the resulting decoded object with only the required fields
|
|
print(result['tree'][4]['path'], "is at",
|
|
result['tree'][4]['url'])
|
|
end
|
|
|
|
s:on("disconnection", getresult)
|
|
s:on("reconnection", getresult)
|
|
|
|
-- Make it all happen!
|
|
s:connect(443, "api.github.com")
|