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.
95 lines
2.7 KiB
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
|
|
|