aboutsummaryrefslogtreecommitdiff
path: root/src/tp.lua
diff options
context:
space:
mode:
authorDiego Nehab <diego@tecgraf.puc-rio.br>2004-03-18 07:01:14 +0000
committerDiego Nehab <diego@tecgraf.puc-rio.br>2004-03-18 07:01:14 +0000
commit2c160627e51650f98d6ef01ae36bb86d6e91045f (patch)
treee67051e051b0a315aebc0a511d242905272aecfb /src/tp.lua
parentbcc0c2a9f0be2ca796ef5206a78e283fe15e6186 (diff)
downloadluasocket-2c160627e51650f98d6ef01ae36bb86d6e91045f.tar.gz
luasocket-2c160627e51650f98d6ef01ae36bb86d6e91045f.tar.bz2
luasocket-2c160627e51650f98d6ef01ae36bb86d6e91045f.zip
Message source in smtp.lua is a work of art.
Diffstat (limited to 'src/tp.lua')
-rw-r--r--src/tp.lua54
1 files changed, 22 insertions, 32 deletions
diff --git a/src/tp.lua b/src/tp.lua
index d8dabc0..3912fab 100644
--- a/src/tp.lua
+++ b/src/tp.lua
@@ -18,32 +18,18 @@ setfenv(1, socket.tp)
18 18
19TIMEOUT = 60 19TIMEOUT = 60
20 20
21-- tries to get a pattern from the server and closes socket on error
22local function try_receiving(sock, pattern)
23 local data, message = sock:receive(pattern)
24 if not data then sock:close() end
25 return data, message
26end
27
28-- tries to send data to server and closes socket on error
29local function try_sending(sock, data)
30 local sent, message = sock:send(data)
31 if not sent then sock:close() end
32 return sent, message
33end
34
35-- gets server reply 21-- gets server reply
36local function get_reply(sock) 22local function get_reply(sock)
37 local code, current, separator, _ 23 local code, current, separator, _
38 local line, message = try_receiving(sock) 24 local line, err = sock:receive()
39 local reply = line 25 local reply = line
40 if message then return nil, message end 26 if err then return nil, err end
41 _, _, code, separator = string.find(line, "^(%d%d%d)(.?)") 27 _, _, code, separator = string.find(line, "^(%d%d%d)(.?)")
42 if not code then return nil, "invalid server reply" end 28 if not code then return nil, "invalid server reply" end
43 if separator == "-" then -- reply is multiline 29 if separator == "-" then -- reply is multiline
44 repeat 30 repeat
45 line, message = try_receiving(sock) 31 line, err = sock:receive()
46 if message then return nil, message end 32 if err then return nil, err end
47 _,_, current, separator = string.find(line, "^(%d%d%d)(.)") 33 _,_, current, separator = string.find(line, "^(%d%d%d)(.)")
48 if not current or not separator then 34 if not current or not separator then
49 return nil, "invalid server reply" 35 return nil, "invalid server reply"
@@ -58,29 +44,25 @@ end
58-- metatable for sock object 44-- metatable for sock object
59local metatable = { __index = {} } 45local metatable = { __index = {} }
60 46
61-- execute the "check" instr
62function metatable.__index:check(ok) 47function metatable.__index:check(ok)
63 local code, reply = get_reply(self.sock) 48 local code, reply = get_reply(self.sock)
64 if not code then return nil, reply end 49 if not code then return nil, reply end
65 if type(ok) ~= "function" then 50 if type(ok) ~= "function" then
66 if type(ok) ~= "table" then ok = {ok} end 51 if type(ok) == "table" then
67 for i, v in ipairs(ok) do 52 for i, v in ipairs(ok) do
68 if string.find(code, v) then return code, reply end 53 if string.find(code, v) then return code, reply end
54 end
55 return nil, reply
56 else
57 if string.find(code, ok) then return code, reply
58 else return nil, reply end
69 end 59 end
70 return nil, reply
71 else return ok(code, reply) end 60 else return ok(code, reply) end
72end 61end
73 62
74function metatable.__index:cmdchk(cmd, arg, ok)
75 local code, err = self:command(cmd, arg)
76 if not code then return nil, err end
77 return self:check(ok)
78end
79
80-- execute the "command" instr
81function metatable.__index:command(cmd, arg) 63function metatable.__index:command(cmd, arg)
82 if arg then return try_sending(self.sock, cmd .. " " .. arg.. "\r\n") 64 if arg then return self.sock:send(cmd .. " " .. arg.. "\r\n")
83 return try_sending(self.sock, cmd .. "\r\n") end 65 else return self.sock:send(cmd .. "\r\n") end
84end 66end
85 67
86function metatable.__index:sink(snk, pat) 68function metatable.__index:sink(snk, pat)
@@ -88,6 +70,14 @@ function metatable.__index:sink(snk, pat)
88 return snk(chunk, err) 70 return snk(chunk, err)
89end 71end
90 72
73function metatable.__index:send(data)
74 return self.sock:send(data)
75end
76
77function metatable.__index:receive(pat)
78 return self.sock:receive(pat)
79end
80
91function metatable.__index:source(src, instr) 81function metatable.__index:source(src, instr)
92 while true do 82 while true do
93 local chunk, err = src() 83 local chunk, err = src()