From 5b2a124305f26d36e95b639b1c70a32368f03261 Mon Sep 17 00:00:00 2001 From: Diego Nehab Date: Mon, 8 Jul 2002 21:01:45 +0000 Subject: [PATCH] Updated for Lua 4.1-w3. --- src/ftp.lua | 117 ++++++++++++++++++++++++--------------------------- src/smtp.lua | 64 ++++++++++++++-------------- src/url.lua | 36 ++++++++-------- 3 files changed, 105 insertions(+), 112 deletions(-) diff --git a/src/ftp.lua b/src/ftp.lua index 1af4d30..1fa48f7 100644 --- a/src/ftp.lua +++ b/src/ftp.lua @@ -1,6 +1,6 @@ ----------------------------------------------------------------------------- -- FTP support for the Lua language --- LuaSocket 1.4 toolkit. +-- LuaSocket 1.5 toolkit. -- Author: Diego Nehab -- Date: 26/12/2000 -- Conforming to: RFC 959, LTN7 @@ -23,13 +23,6 @@ Public.EMAIL = "anonymous@anonymous.org" -- block size used in transfers Public.BLOCKSIZE = 8192 ------------------------------------------------------------------------------ --- Required libraries ------------------------------------------------------------------------------ -dofile "concat.lua" -dofile "url.lua" -dofile "code.lua" - ----------------------------------------------------------------------------- -- Tries to send DOS mode lines. Closes socket on error. -- Input @@ -91,7 +84,7 @@ function Private.send_command(control, cmd, arg) local line if arg then line = cmd .. " " .. arg else line = cmd end - return %Private.try_sendline(control, line) + return Private.try_sendline(control, line) end ----------------------------------------------------------------------------- @@ -104,14 +97,14 @@ end ----------------------------------------------------------------------------- function Private.get_answer(control) local code, lastcode, sep, _ - local line, err = %Private.try_receive(control) + local line, err = Private.try_receive(control) local answer = line if err then return nil, err end _,_, code, sep = strfind(line, "^(%d%d%d)(.)") if not code or not sep then return nil, answer end if sep == "-" then -- answer is multiline repeat - line, err = %Private.try_receive(control) + line, err = Private.try_receive(control) if err then return nil, err end _,_, lastcode, sep = strfind(line, "^(%d%d%d)(.)") answer = answer .. "\n" .. line @@ -130,7 +123,7 @@ end -- answer: server complete answer or system error message ----------------------------------------------------------------------------- function Private.check_answer(control, success) - local answer, code = %Private.get_answer(control) + local answer, code = Private.get_answer(control) if not answer then return nil, code end if type(success) ~= "table" then success = {success} end for i = 1, getn(success) do @@ -155,9 +148,9 @@ end -- answer: server complete answer or system error message ----------------------------------------------------------------------------- function Private.command(control, cmd, arg, success) - local err = %Private.send_command(control, cmd, arg) + local err = Private.send_command(control, cmd, arg) if err then return nil, err end - return %Private.check_answer(control, success) + return Private.check_answer(control, success) end ----------------------------------------------------------------------------- @@ -169,9 +162,9 @@ end -- answer: server answer or error message ----------------------------------------------------------------------------- function Private.greet(control) - local code, answer = %Private.check_answer(control, {120, 220}) + local code, answer = Private.check_answer(control, {120, 220}) if code == 120 then -- please try again, somewhat busy now... - return %Private.check_answer(control, {220}) + return Private.check_answer(control, {220}) end return code, answer end @@ -187,9 +180,9 @@ end -- answer: server answer or error message ----------------------------------------------------------------------------- function Private.login(control, user, password) - local code, answer = %Private.command(control, "user", user, {230, 331}) + local code, answer = Private.command(control, "user", user, {230, 331}) if code == 331 and password then -- need pass and we have pass - return %Private.command(control, "pass", password, {230, 202}) + return Private.command(control, "pass", password, {230, 202}) end return code, answer end @@ -204,7 +197,7 @@ end -- answer: server answer or error message ----------------------------------------------------------------------------- function Private.cwd(control, path) - if path then return %Private.command(control, "cwd", path, {250}) + if path then return Private.command(control, "cwd", path, {250}) else return 250, nil end end @@ -221,13 +214,13 @@ function Private.port(control) local server, ctl_ip ctl_ip, answer = control:getsockname() server, answer = bind(ctl_ip, 0) - server:timeout(%Public.TIMEOUT) + server:timeout(Public.TIMEOUT) local ip, p, ph, pl ip, p = server:getsockname() pl = mod(p, 256) ph = (p - pl)/256 local arg = gsub(format("%s,%d,%d", ip, ph, pl), "%.", ",") - code, answer = %Private.command(control, "port", arg, {200}) + code, answer = Private.command(control, "port", arg, {200}) if not code then server:close() return nil, answer @@ -243,7 +236,7 @@ end -- answer: server answer or error message ----------------------------------------------------------------------------- function Private.logout(control) - local code, answer = %Private.command(control, "quit", nil, {221}) + local code, answer = Private.command(control, "quit", nil, {221}) if code then control:close() end return code, answer end @@ -259,7 +252,7 @@ end function Private.receive_indirect(data, callback) local chunk, err, res while not err do - chunk, err = %Private.try_receive(data, %Public.BLOCKSIZE) + chunk, err = Private.try_receive(data, Public.BLOCKSIZE) if err == "closed" then err = "done" end res = callback(chunk, err) if not res then break end @@ -282,11 +275,11 @@ function Private.retrieve(control, server, name, is_directory, content_cb) local data -- ask server for file or directory listing accordingly if is_directory then - code, answer = %Private.cwd(control, name) + code, answer = Private.cwd(control, name) if not code then return answer end - code, answer = %Private.command(control, "nlst", nil, {150, 125}) + code, answer = Private.command(control, "nlst", nil, {150, 125}) else - code, answer = %Private.command(control, "retr", name, {150, 125}) + code, answer = Private.command(control, "retr", name, {150, 125}) end if not code then return nil, answer end data, answer = server:accept() @@ -295,14 +288,14 @@ function Private.retrieve(control, server, name, is_directory, content_cb) control:close() return answer end - answer = %Private.receive_indirect(data, content_cb) + answer = Private.receive_indirect(data, content_cb) if answer then control:close() return answer end data:close() -- make sure file transfered ok - return %Private.check_answer(control, {226, 250}) + return Private.check_answer(control, {226, 250}) end ----------------------------------------------------------------------------- @@ -347,7 +340,7 @@ end ----------------------------------------------------------------------------- function Private.store(control, server, file, send_cb) local data, err - local code, answer = %Private.command(control, "stor", file, {150, 125}) + local code, answer = Private.command(control, "stor", file, {150, 125}) if not code then control:close() return nil, answer @@ -360,7 +353,7 @@ function Private.store(control, server, file, send_cb) return nil, answer end -- send whole file - err = %Private.send_indirect(data, send_cb, send_cb()) + err = Private.send_indirect(data, send_cb, send_cb()) if err then control:close() return nil, err @@ -368,7 +361,7 @@ function Private.store(control, server, file, send_cb) -- close connection to inform that file transmission is complete data:close() -- check if file was received correctly - return %Private.check_answer(control, {226, 250}) + return Private.check_answer(control, {226, 250}) end ----------------------------------------------------------------------------- @@ -383,7 +376,7 @@ function Private.change_type(control, params) local type, _ _, _, type = strfind(params or "", "type=(.)") if type == "a" or type == "i" then - local code, err = %Private.command(control, "type", type, {200}) + local code, err = Private.command(control, "type", type, {200}) if not code then return err end end end @@ -401,12 +394,12 @@ function Private.open(parsed) local control, err = connect(parsed.host, parsed.port) if not control then return nil, err end -- make sure we don't block forever - control:timeout(%Public.TIMEOUT) + control:timeout(Public.TIMEOUT) -- check greeting - local code, answer = %Private.greet(control) + local code, answer = Private.greet(control) if not code then return nil, answer end -- try to log in - code, err = %Private.login(control, parsed.user, parsed.password) + code, err = Private.login(control, parsed.user, parsed.password) if not code then return nil, err else return control end end @@ -418,7 +411,7 @@ end ----------------------------------------------------------------------------- function Private.close(control) -- disconnect - %Private.logout(control) + Private.logout(control) end ----------------------------------------------------------------------------- @@ -432,7 +425,7 @@ end function Private.change_dir(control, segment) local n = getn(segment) for i = 1, n-1 do - local code, answer = %Private.cwd(control, segment[i]) + local code, answer = Private.cwd(control, segment[i]) if not code then return answer end end end @@ -457,10 +450,10 @@ function Private.upload(control, request, segment) end content_cb = request.content_cb -- setup passive connection - local server, answer = %Private.port(control) + local server, answer = Private.port(control) if not server then return answer end -- ask server to receive file - code, answer = %Private.store(control, server, name, content_cb) + code, answer = Private.store(control, server, name, content_cb) if not code then return answer end end @@ -485,10 +478,10 @@ function Private.download(control, request, segment) return "Invalid file path" end -- setup passive connection - local server, answer = %Private.port(control) + local server, answer = Private.port(control) if not server then return answer end -- ask server to send file or directory listing - code, answer = %Private.retrieve(control, server, name, + code, answer = Private.retrieve(control, server, name, is_directory, content_cb) if not code then return answer end end @@ -510,7 +503,7 @@ function Private.parse_url(request) user = "anonymous", port = 21, path = "/", - password = %Public.EMAIL, + password = Public.EMAIL, scheme = "ftp" }) -- explicit login information overrides that given by URL @@ -565,17 +558,17 @@ end -- err: error message if any ----------------------------------------------------------------------------- function Public.get_cb(request) - local parsed = %Private.parse_url(request) + local parsed = Private.parse_url(request) if parsed.scheme ~= "ftp" then return format("unknown scheme '%s'", parsed.scheme) end - local control, err = %Private.open(parsed) + local control, err = Private.open(parsed) if not control then return err end - local segment = %Private.parse_path(parsed) - return %Private.change_dir(control, segment) or - %Private.change_type(control, parsed.params) or - %Private.download(control, request, segment) or - %Private.close(control) + local segment = Private.parse_path(parsed) + return Private.change_dir(control, segment) or + Private.change_type(control, parsed.params) or + Private.download(control, request, segment) or + Private.close(control) end ----------------------------------------------------------------------------- @@ -591,17 +584,17 @@ end -- err: error message if any ----------------------------------------------------------------------------- function Public.put_cb(request) - local parsed = %Private.parse_url(request) + local parsed = Private.parse_url(request) if parsed.scheme ~= "ftp" then return format("unknown scheme '%s'", parsed.scheme) end - local control, err = %Private.open(parsed) + local control, err = Private.open(parsed) if not control then return err end - local segment = %Private.parse_path(parsed) - return %Private.change_dir(control, segment) or - %Private.change_type(control, parsed.params) or - %Private.upload(control, request, segment) or - %Private.close(control) + local segment = Private.parse_path(parsed) + return Private.change_dir(control, segment) or + Private.change_type(control, parsed.params) or + Private.upload(control, request, segment) or + Private.close(control) end ----------------------------------------------------------------------------- @@ -617,11 +610,11 @@ end -- err: error message if any ----------------------------------------------------------------------------- function Public.put(url_or_request, content) - local request = %Private.build_request(url_or_request) + local request = Private.build_request(url_or_request) request.content_cb = function() - return %content, strlen(%content) + return content, strlen(content) end - return %Public.put_cb(request) + return Public.put_cb(request) end ----------------------------------------------------------------------------- @@ -638,11 +631,11 @@ end ----------------------------------------------------------------------------- function Public.get(url_or_request) local cat = Concat.create() - local request = %Private.build_request(url_or_request) + local request = Private.build_request(url_or_request) request.content_cb = function(chunk, err) - if chunk then %cat:addstring(chunk) end + if chunk then cat:addstring(chunk) end return 1 end - local err = %Public.get_cb(request) + local err = Public.get_cb(request) return cat:getresult(), err end diff --git a/src/smtp.lua b/src/smtp.lua index 7450792..72a0e5a 100644 --- a/src/smtp.lua +++ b/src/smtp.lua @@ -1,6 +1,6 @@ ----------------------------------------------------------------------------- -- SMTP support for the Lua language. --- LuaSocket 1.4 toolkit +-- LuaSocket 1.5 toolkit -- Author: Diego Nehab -- Date: 26/12/2000 -- Conforming to: RFC 821, LTN7 @@ -65,7 +65,7 @@ function Private.send_command(sock, command, param) local line if param then line = command .. " " .. param .. "\r\n" else line = command .. "\r\n" end - return %Private.try_send(sock, line) + return Private.try_send(sock, line) end ----------------------------------------------------------------------------- @@ -78,14 +78,14 @@ end ----------------------------------------------------------------------------- function Private.get_answer(control) local code, lastcode, sep, _ - local line, err = %Private.try_receive(control) + local line, err = Private.try_receive(control) local answer = line if err then return nil, err end _,_, code, sep = strfind(line, "^(%d%d%d)(.)") if not code or not sep then return nil, answer end if sep == "-" then -- answer is multiline repeat - line, err = %Private.try_receive(control) + line, err = Private.try_receive(control) if err then return nil, err end _,_, lastcode, sep = strfind(line, "^(%d%d%d)(.)") answer = answer .. "\n" .. line @@ -105,7 +105,7 @@ end -- answer: complete server answer or system error message ----------------------------------------------------------------------------- function Private.check_answer(control, success) - local answer, code = %Private.get_answer(control) + local answer, code = Private.get_answer(control) if not answer then return nil, code end if type(success) ~= "table" then success = {success} end for i = 1, getn(success) do @@ -126,9 +126,9 @@ end -- answer: complete server reply ----------------------------------------------------------------------------- function Private.send_helo(sock) - local err = %Private.send_command(sock, "HELO", %Public.DOMAIN) + local err = Private.send_command(sock, "HELO", Public.DOMAIN) if err then return nil, err end - return %Private.check_answer(sock, 250) + return Private.check_answer(sock, 250) end ----------------------------------------------------------------------------- @@ -140,9 +140,9 @@ end -- answer: complete server reply or error message ----------------------------------------------------------------------------- function Private.send_quit(sock) - local err = %Private.send_command(sock, "QUIT") + local err = Private.send_command(sock, "QUIT") if err then return nil, err end - local code, answer = %Private.check_answer(sock, 221) + local code, answer = Private.check_answer(sock, 221) sock:close() return code, answer end @@ -158,9 +158,9 @@ end ----------------------------------------------------------------------------- function Private.send_mail(sock, sender) local param = format("FROM:<%s>", sender or "") - local err = %Private.send_command(sock, "MAIL", param) + local err = Private.send_command(sock, "MAIL", param) if err then return nil, err end - return %Private.check_answer(sock, 250) + return Private.check_answer(sock, 250) end ----------------------------------------------------------------------------- @@ -175,11 +175,11 @@ function Private.send_headers(sock, headers) local err -- send request headers for i, v in headers or {} do - err = %Private.try_send(sock, i .. ": " .. v .. "\r\n") + err = Private.try_send(sock, i .. ": " .. v .. "\r\n") if err then return err end end -- mark end of request headers - return %Private.try_send(sock, "\r\n") + return Private.try_send(sock, "\r\n") end ----------------------------------------------------------------------------- @@ -193,18 +193,18 @@ end -- answer: complete server reply or error message ----------------------------------------------------------------------------- function Private.send_data(sock, headers, body) - local err = %Private.send_command(sock, "DATA") + local err = Private.send_command(sock, "DATA") if err then return nil, err end - local code, answer = %Private.check_answer(sock, 354) + local code, answer = Private.check_answer(sock, 354) if not code then return nil, answer end -- avoid premature end in message body body = gsub(body or "", "\n%.", "\n%.%.") -- mark end of message body body = body .. "\r\n.\r\n" - err = %Private.send_headers(sock, headers) + err = Private.send_headers(sock, headers) if err then return nil, err end - err = %Private.try_send(sock, body) - return %Private.check_answer(sock, 250) + err = Private.try_send(sock, body) + return Private.check_answer(sock, 250) end ----------------------------------------------------------------------------- @@ -221,9 +221,9 @@ function Private.send_rcpt(sock, rcpt) local code, answer = nil, "No recipient specified" if type(rcpt) ~= "table" then rcpt = {rcpt} end for i = 1, getn(rcpt) do - err = %Private.send_command(sock, "RCPT", format("TO:<%s>", rcpt[i])) + err = Private.send_command(sock, "RCPT", format("TO:<%s>", rcpt[i])) if err then return nil, err end - code, answer = %Private.check_answer(sock, {250, 251}) + code, answer = Private.check_answer(sock, {250, 251}) if not code then return code, answer end end return code, answer @@ -240,16 +240,16 @@ end function Private.open(server) local code, answer -- default server - server = server or %Public.SERVER + server = server or Public.SERVER -- connect to server and make sure we won't hang - local sock, err = connect(server, %Public.PORT) + local sock, err = connect(server, Public.PORT) if not sock then return nil, err end - sock:timeout(%Public.TIMEOUT) + sock:timeout(Public.TIMEOUT) -- initial server greeting - code, answer = %Private.check_answer(sock, 220) + code, answer = Private.check_answer(sock, 220) if not code then return nil, answer end -- HELO - code, answer = %Private.send_helo(sock) + code, answer = Private.send_helo(sock) if not code then return nil, answer end return sock end @@ -270,13 +270,13 @@ end function Private.send(sock, message) local code, answer -- MAIL - code, answer = %Private.send_mail(sock, message.from) + code, answer = Private.send_mail(sock, message.from) if not code then return nil, answer end -- RCPT - code, answer = %Private.send_rcpt(sock, message.rcpt) + code, answer = Private.send_rcpt(sock, message.rcpt) if not code then return nil, answer end -- DATA - return %Private.send_data(sock, message.headers, message.body) + return Private.send_data(sock, message.headers, message.body) end ----------------------------------------------------------------------------- @@ -289,7 +289,7 @@ end ----------------------------------------------------------------------------- function Private.close(sock) -- QUIT - return %Private.send_quit(sock) + return Private.send_quit(sock) end ----------------------------------------------------------------------------- @@ -305,11 +305,11 @@ end -- nil if successfull, error message in case of error ----------------------------------------------------------------------------- function Public.mail(message) - local sock, err = %Private.open(message.server) + local sock, err = Private.open(message.server) if not sock then return err end - local code, answer = %Private.send(sock, message) + local code, answer = Private.send(sock, message) if not code then return answer end - code, answer = %Private.close(sock) + code, answer = Private.close(sock) if code then return nil end return answer end diff --git a/src/url.lua b/src/url.lua index 673c9ac..e17bcf5 100644 --- a/src/url.lua +++ b/src/url.lua @@ -1,6 +1,6 @@ ----------------------------------------------------------------------------- -- URI parsing, composition and relative URL resolution --- LuaSocket 1.4 toolkit. +-- LuaSocket 1.5 toolkit. -- Author: Diego Nehab -- Date: 20/7/2001 -- Conforming to: RFC 2396, LTN7 @@ -36,24 +36,24 @@ function Public.parse_url(url, default) -- remove whitespace url = gsub(url, "%s", "") -- get fragment - url = gsub(url, "#(.*)$", function(f) %parsed.fragment = f end) + url = gsub(url, "#(.*)$", function(f) parsed.fragment = f end) -- get scheme - url = gsub(url, "^([%w][%w%+%-%.]*)%:", function(s) %parsed.scheme = s end) + url = gsub(url, "^([%w][%w%+%-%.]*)%:", function(s) parsed.scheme = s end) -- get authority - url = gsub(url, "^//([^/]*)", function(n) %parsed.authority = n end) + url = gsub(url, "^//([^/]*)", function(n) parsed.authority = n end) -- get query string - url = gsub(url, "%?(.*)", function(q) %parsed.query = q end) + url = gsub(url, "%?(.*)", function(q) parsed.query = q end) -- get params - url = gsub(url, "%;(.*)", function(p) %parsed.params = p end) + url = gsub(url, "%;(.*)", function(p) parsed.params = p end) if url ~= "" then parsed.path = url end local authority = parsed.authority if not authority then return parsed end - authority = gsub(authority,"^([^@]*)@",function(u) %parsed.userinfo = u end) - authority = gsub(authority, ":([^:]*)$", function(p) %parsed.port = p end) + authority = gsub(authority,"^([^@]*)@",function(u) parsed.userinfo = u end) + authority = gsub(authority, ":([^:]*)$", function(p) parsed.port = p end) if authority ~= "" then parsed.host = authority end local userinfo = parsed.userinfo if not userinfo then return parsed end - userinfo = gsub(userinfo, ":([^:]*)$", function(p) %parsed.password = p end) + userinfo = gsub(userinfo, ":([^:]*)$", function(p) parsed.password = p end) parsed.user = userinfo return parsed end @@ -99,8 +99,8 @@ end -- corresponding absolute url ----------------------------------------------------------------------------- function Public.absolute_url(base_url, relative_url) - local base = %Public.parse_url(base_url) - local relative = %Public.parse_url(relative_url) + local base = Public.parse_url(base_url) + local relative = Public.parse_url(relative_url) if not base then return relative_url elseif not relative then return base_url elseif relative.scheme then return relative_url @@ -117,10 +117,10 @@ function Public.absolute_url(base_url, relative_url) end end else - relative.path = %Private.absolute_path(base.path,relative.path) + relative.path = Private.absolute_path(base.path,relative.path) end end - return %Public.build_url(relative) + return Public.build_url(relative) end end @@ -135,7 +135,7 @@ function Public.parse_path(path) local parsed = {} path = path or "" path = gsub(path, "%s", "") - gsub(path, "([^/]+)", function (s) tinsert(%parsed, s) end) + gsub(path, "([^/]+)", function (s) tinsert(parsed, s) end) for i = 1, getn(parsed) do parsed[i] = Code.unescape(parsed[i]) end @@ -166,11 +166,11 @@ function Public.build_path(parsed, unsafe) end else for i = 1, n-1 do - path = path .. %Private.protect_segment(parsed[i]) + path = path .. Private.protect_segment(parsed[i]) path = path .. "/" end if n > 0 then - path = path .. %Private.protect_segment(parsed[n]) + path = path .. Private.protect_segment(parsed[n]) if parsed.is_directory then path = path .. "/" end end end @@ -194,9 +194,9 @@ Private.segment_set = Private.make_set { } function Private.protect_segment(s) - local segment_set = %Private.segment_set + local segment_set = Private.segment_set return gsub(s, "(%W)", function (c) - if %segment_set[c] then return c + if segment_set[c] then return c else return Code.escape(c) end end) end