diff --git a/src/ftp.lua b/src/ftp.lua
index 6286f90..a894c1c 100644
--- a/src/ftp.lua
+++ b/src/ftp.lua
@@ -34,8 +34,13 @@ _M.PASSWORD = "[email protected]"
-----------------------------------------------------------------------------
local metat = { __index = {} }
-function _M.open(server, port, create)
- local tp = socket.try(tp.connect(server, port or _M.PORT, _M.TIMEOUT, create))
+function _M.open(params)
+ local tp = socket.try(tp.connect(
+ params.server,
+ params.port or _M.PORT,
+ _M.TIMEOUT,
+ function() return params:create() end -- wrap create as a method call
+ ))
local f = base.setmetatable({ tp = tp }, metat)
-- make sure everything gets closed in an exception
f.try = socket.newtry(function() f:close() end)
@@ -203,7 +208,7 @@ end
local function tput(putt)
putt = override(putt)
socket.try(putt.host, "missing hostname")
- local f = _M.open(putt.host, putt.port, putt.create)
+ local f = _M.open(putt)
f:greet()
f:login(putt.user, putt.password)
if putt.type then f:type(putt.type) end
@@ -235,7 +240,7 @@ end
local function tget(gett)
gett = override(gett)
socket.try(gett.host, "missing hostname")
- local f = _M.open(gett.host, gett.port, gett.create)
+ local f = _M.open(gett)
f:greet()
f:login(gett.user, gett.password)
if gett.type then f:type(gett.type) end
@@ -262,7 +267,8 @@ _M.command = socket.protect(function(cmdt)
cmdt = override(cmdt)
socket.try(cmdt.host, "missing hostname")
socket.try(cmdt.command, "missing command")
- local f = _M.open(cmdt.host, cmdt.port, cmdt.create)
+ cmdt.create = cmdt.create or socket.tcp
+ local f = _M.open(cmdt)
f:greet()
f:login(cmdt.user, cmdt.password)
f.try(f.tp:command(cmdt.command, cmdt.argument))
@@ -277,6 +283,7 @@ _M.put = socket.protect(function(putt, body)
tput(putt)
return table.concat(putt.target)
else
+ putt.create = putt.create or socket.tcp
return tput(putt)
end
end)
@@ -287,6 +294,7 @@ _M.get = socket.protect(function(gett)
tget(gett)
return table.concat(gett.target)
else
+ gett.create = gett.create or socket.tcp
return tget(gett)
end
end)
diff --git a/src/http.lua b/src/http.lua
index 550634c..d926e72 100644
--- a/src/http.lua
+++ b/src/http.lua
@@ -106,15 +106,15 @@ end
-----------------------------------------------------------------------------
local metat = { __index = {} }
-function _M.open(host, port, create)
- -- create socket with user connect function, or with default
- local c = socket.try((create or socket.tcp)())
+function _M.open(reqt)
+ -- create socket with user connect function
+ local c = socket.try(reqt:create()) -- method call, passing reqt table as self!
local h = base.setmetatable({ c = c }, metat)
-- create finalized try
h.try = socket.newtry(function() h:close() end)
-- set timeout before connecting
h.try(c:settimeout(_M.TIMEOUT))
- h.try(c:connect(host, port or PORT))
+ h.try(c:connect(reqt.host, reqt.port or PORT))
-- here everything worked
return h
end
@@ -294,7 +294,7 @@ end
-- we loop until we get what we want, or
-- until we are sure there is no way to get it
local nreqt = adjustrequest(reqt)
- local h = _M.open(nreqt.host, nreqt.port, nreqt.create)
+ local h = _M.open(nreqt)
-- send request line and headers
h:sendrequestline(nreqt.method, nreqt.uri)
h:sendheaders(nreqt.headers)
@@ -352,9 +352,10 @@ end
_M.request = socket.protect(function(reqt, body)
- if base.type(reqt) == "string" then return srequest(reqt, body)
+ if base.type(reqt) == "string" then
+ local t, code, headers, status = reqt.target, socket.skip(1, _M.request(reqt))
return table.concat(t), code, headers, status
- else return trequest(reqt) end
+ else
+ reqt.create = reqt.create or socket.tcp
+ return trequest(reqt)
+ end
end)
diff --git a/src/smtp.lua b/src/smtp.lua
index b113d00..ea52873 100644
--- a/src/smtp.lua
+++ b/src/smtp.lua
@@ -113,9 +113,13 @@ function metat.__index:send(mailt)
self:data(ltn12.source.chain(mailt.source, mime.stuff()), mailt.step)
end
-function _M.open(server, port, create)
- local tp = socket.try(tp.connect(server or _M.SERVER, port or _M.PORT,
- _M.TIMEOUT, create))
+function _M.open(mailt)
+ local tp = socket.try(tp.connect(
+ mailt.server or _M.SERVER,
+ mailt.port or _M.PORT,
+ _M.TIMEOUT,
+ function() return mailt:create() end -- wrap to do a method call
+ ))
local s = base.setmetatable({tp = tp}, metat)
-- make sure tp is closed if we get an exception
s.try = socket.newtry(function()
@@ -245,7 +249,8 @@ end
-- High level SMTP API
-----------------------------------------------------------------------------
_M.send = socket.protect(function(mailt)
- local s = _M.open(mailt.server, mailt.port, mailt.create)
+ mailt.create = mailt.create or socket.tcp
+ local s = _M.open(mailt)
local ext = s:greet(mailt.domain)
s:auth(mailt.user, mailt.password, ext)
s:send(mailt)