Fixed crash
This commit is contained in:
parent
6a3d484486
commit
f299d0fae7
@ -23,65 +23,86 @@ local function async_request(url, payload, callback)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local client = vim.loop.new_tcp()
|
-- Resolve hostname to IP
|
||||||
|
vim.loop.getaddrinfo(host, "443", {
|
||||||
client:connect(host, 443, function(err)
|
family = "inet",
|
||||||
if err then
|
socktype = "stream",
|
||||||
|
protocol = "tcp"
|
||||||
|
}, function(err, res)
|
||||||
|
if err then
|
||||||
vim.schedule(function()
|
vim.schedule(function()
|
||||||
callback(nil, "Connection error: " .. err)
|
callback(nil, "DNS resolution error: " .. err)
|
||||||
end)
|
end)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local ssl = vim.loop.new_tls()
|
if not res or #res == 0 then
|
||||||
ssl:wrap(client)
|
vim.schedule(function()
|
||||||
|
callback(nil, "Could not resolve hostname")
|
||||||
|
end)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local client = vim.loop.new_tcp()
|
||||||
|
|
||||||
local request = string.format(
|
client:connect(res[1].addr, res[1].port, function(err)
|
||||||
"POST %s HTTP/1.1\r\n" ..
|
if err then
|
||||||
"Host: %s\r\n" ..
|
|
||||||
"Content-Type: application/json\r\n" ..
|
|
||||||
"Content-Length: %d\r\n" ..
|
|
||||||
"\r\n" ..
|
|
||||||
"%s",
|
|
||||||
path, host, #payload, payload
|
|
||||||
)
|
|
||||||
|
|
||||||
local response = ""
|
|
||||||
|
|
||||||
ssl:write(request, function(err)
|
|
||||||
if err then
|
|
||||||
vim.schedule(function()
|
vim.schedule(function()
|
||||||
callback(nil, "Write error: " .. err)
|
callback(nil, "Connection error: " .. err)
|
||||||
end)
|
end)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local ssl = vim.loop.new_tls()
|
||||||
|
ssl:wrap(client)
|
||||||
|
|
||||||
ssl:read_start(function(err, chunk)
|
local request = string.format(
|
||||||
|
"POST %s HTTP/1.1\r\n" ..
|
||||||
|
"Host: %s\r\n" ..
|
||||||
|
"Content-Type: application/json\r\n" ..
|
||||||
|
"Content-Length: %d\r\n" ..
|
||||||
|
"\r\n" ..
|
||||||
|
"%s",
|
||||||
|
path, host, #payload, payload
|
||||||
|
)
|
||||||
|
|
||||||
|
local response = ""
|
||||||
|
|
||||||
|
ssl:write(request, function(err)
|
||||||
if err then
|
if err then
|
||||||
vim.schedule(function()
|
vim.schedule(function()
|
||||||
callback(nil, "Read error: " .. err)
|
callback(nil, "Write error: " .. err)
|
||||||
end)
|
end)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if chunk then
|
ssl:read_start(function(err, chunk)
|
||||||
response = response .. chunk
|
if err then
|
||||||
else
|
vim.schedule(function()
|
||||||
-- Connection closed, process response
|
callback(nil, "Read error: " .. err)
|
||||||
local body = response:match("\r\n\r\n(.+)$")
|
end)
|
||||||
local success, decoded = pcall(vim.json.decode, body)
|
return
|
||||||
|
end
|
||||||
|
|
||||||
vim.schedule(function()
|
if chunk then
|
||||||
if success then
|
response = response .. chunk
|
||||||
callback(decoded)
|
else
|
||||||
else
|
-- Connection closed, process response
|
||||||
callback(nil, "JSON decode error: " .. body)
|
local body = response:match("\r\n\r\n(.+)$")
|
||||||
end
|
local success, decoded = pcall(vim.json.decode, body)
|
||||||
end)
|
|
||||||
|
vim.schedule(function()
|
||||||
ssl:close()
|
if success then
|
||||||
client:close()
|
callback(decoded)
|
||||||
end
|
else
|
||||||
|
callback(nil, "JSON decode error: " .. body)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
ssl:close()
|
||||||
|
client:close()
|
||||||
|
end
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user