local cqueues = require "cqueues"
local ca = require "cqueues.auxlib"
local ce = require "cqueues.errno"
local connection_methods = {}
local function onerror(socket, op, why, lvl) -- luacheck: ignore 212
local err = string.format("%s: %s", op, ce.strerror(why))
if op == "starttls" then
local ssl = socket:checktls()
if ssl and ssl.getVerifyResult then
local code, msg = ssl:getVerifyResult()
if code ~= 0 then
err = err .. ":" .. msg
end
end
end
if why == ce.ETIMEDOUT then
if op == "fill" or op == "read" then
socket:clearerr("r")
elseif op == "flush" then
socket:clearerr("w")
end
end
return err, why
end
function connection_methods:pollfd()
if self.socket == nil then
return nil
end
return self.socket:pollfd()
end
function connection_methods:events()
if self.socket == nil then
return nil
end
return self.socket:events()
end
function connection_methods:timeout()
if self.socket == nil then
return nil
end
return self.socket:timeout()
end
function connection_methods:onidle_() -- luacheck: ignore 212
end
function connection_methods:onidle(...)
local old_handler = self.onidle_
if select("#", ...) > 0 then
self.onidle_ = ...
end
return old_handler
end
function connection_methods:connect(timeout)
if self.socket == nil then
return nil
end
local ok, err, errno = self.socket:connect(timeout)
if not ok then
return nil, err, errno
end
return true
end
function connection_methods:checktls()
if self.socket == nil then
return nil
end
return self.socket:checktls()
end
function connection_methods:localname()
if self.socket == nil then
return nil
end
return ca.fileresult(self.socket:localname())
end
function connection_methods:peername()
if self.socket == nil then
return nil
end
return ca.fileresult(self.socket:peername())
end
-- Primarily used for testing
function connection_methods:flush(timeout)
return self.socket:flush("n", timeout)
end
function connection_methods:close()
self:shutdown()
if self.socket then
cqueues.poll()
cqueues.poll()
self.socket:close()
end
return true
end
return {
onerror = onerror;
methods = connection_methods;
}