You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lua-lib/copas/ftp.lua~

95 lines
2.7 KiB

-------------------------------------------------------------------
-- identical to the socket.ftp module except that it uses
-- async wrapped Copas sockets
local copas = require("copas")
local socket = require("socket")
local ftp = require("socket.ftp")
local ltn12 = require("ltn12")
local url = require("socket.url")
local create = function() return copas.wrap(socket.tcp()) end
local forwards = { -- setting these will be forwarded to the original smtp module
PORT = true,
TIMEOUT = true,
PASSWORD = true,
USER = true
}
copas.ftp = setmetatable({}, {
-- use original module as metatable, to lookup constants like socket.TIMEOUT, etc.
__index = ftp,
-- Setting constants is forwarded to the luasocket.ftp module.
__newindex = function(self, key, value)
if forwards[key] then ftp[key] = value return end
return rawset(self, key, value)
end,
})
local _M = copas.ftp
---[[ copy of Luasocket stuff here untile PR #133 is accepted
-- a copy of the version in LuaSockets' ftp.lua
-- no 'create' can be passed in the string form, hence a local copy here
local default = {
path = "/",
scheme = "ftp"
}
-- a copy of the version in LuaSockets' ftp.lua
-- no 'create' can be passed in the string form, hence a local copy here
local function parse(u)
local t = socket.try(url.parse(u, default))
socket.try(t.scheme == "ftp", "wrong scheme '" .. t.scheme .. "'")
socket.try(t.host, "missing hostname")
local pat = "^type=(.)$"
if t.params then
t.type = socket.skip(2, string.find(t.params, pat))
socket.try(t.type == "a" or t.type == "i",
"invalid type '" .. t.type .. "'")
end
return t
end
-- parses a simple form into the advanced form
-- if `body` is provided, a PUT, otherwise a GET.
-- If GET, then a field `target` is added to store the results
_M.parseRequest = function(u, body)
local t = parse(u)
if body then
t.source = ltn12.source.string(body)
else
t.target = {}
t.sink = ltn12.sink.table(t.target)
end
end
--]]
_M.put = socket.protect(function(putt, body)
if type(putt) == "string" then
putt = _M.parseRequest(putt, body)
_M.put(putt)
return table.concat(putt.target)
else
putt.create = putt.create or create
return ftp.put(putt)
end
end)
_M.get = socket.protect(function(gett)
if type(gett) == "string" then
gett = _M.parseRequest(gett)
_M.get(gett)
return table.concat(gett.target)
else
gett.create = gett.create or create
return ftp.get(gett)
end
end)
_M.command = function(cmdt)
cmdt.create = cmdt.create or create
return ftp.command(cmdt)
end
return _M