Lua-cURLv3/examples/lcurl/easy.obj.lua

148 lines
3.0 KiB
Lua

--- High level wrapper around lcurl.easy
--
-- Usage:
--
-- local e = cURL.easy{
-- url = 'http://example.com',
-- writefunction = io.stdout;
-- headerfunction = function(msg) io.stderr:write(msg) end;
-- }
-- e:perform()
--
local curl = require "lcurl.safe"
local easy = {} do
local LCURL_ERROR_EASY = curl.ERROR_EASY
local CURLE_UNKNOWN_OPTION = curl.E_UNKNOWN_OPTION
easy.__index = function(self, k)
if k:sub(1, 4) == 'set_' then
local h = self:handle()
local name = k:sub(5)
if h['setopt_' .. name] then
easy[k] = function(self, value) return self:set(name, value) end
end
elseif k:sub(1, 4) == 'get_' then
local h = self:handle()
local name = k:sub(5)
if h['getinfo_' .. name] then
easy[k] = function(self) return self:get(name) end
end
end
return easy[k]
end
local function setopt(handle, k, v, ...)
local fn = handle["setopt_" .. k]
if not fn then
return nil, curl.error(LCURL_ERROR_EASY, CURLE_UNKNOWN_OPTION)
end
local ok, err = fn(handle, v, ...)
if not ok then return nil, err end
return true
end
function easy:new(opt)
local handle, err = curl.easy()
if not handle then return nil, err end
if opt then for k, v in pairs(opt) do
local ok, err = setopt(handle, k, v)
if not ok then
handle:close()
return nil, err
end
end end
local o = setmetatable({
_handle = handle;
}, self)
return o
end
function easy:handle()
return self._handle
end
function easy:set(k, v, ...)
local handle = self:handle()
if type(k) == "table" then
assert(v == nil)
for k, v in pairs(k) do
local ok, err = setopt(handle, k, v)
if not ok then return nil, err, k end
end
return self
end
assert(type(k) == 'string')
local ok, err = setopt(handle, k, v, ...)
if not ok then return nil, err end
return self
end
function easy:perform(opt)
if opt then
local ok, err = self:set(opt)
if not ok then return nil, err end
end
local e = self:handle()
local ok, err = e:perform()
if ok then return nil, err end
return self
end
function easy:post(data)
local post = curl.form()
local ok, err
for k, v in pairs(data) do
if type(v) == "string" then
ok, err = post:add_content(k, v)
else
assert(type(v) == "table")
if v.data then
ok, err = post:add_buffer(k, v.file, v.data, v.type, v.headers)
else
ok, err = post:add_file(k, v.file, v.data, v.type, v.filename, v.headers)
end
end
if not ok then break end
end
if not ok then
post:free()
return nil, err
end
local e = self:handle()
ok, err = e:setopt_httppost(post)
if not ok then
post:free()
return nil, err
end
return self
end
function easy:get(k, ...)
assert(type(k) == "string")
local handle = self:handle()
local fn = handle["getinfo_" .. k]
if not fn then return nil, "Unknown info: " .. k end
return fn(handle, ...)
end
end
local cURL = {}
cURL.easy = function(...) return easy:new(...) end
return cURL