mirror of
https://github.com/lunarmodules/luasocket.git
synced 2024-12-26 20:38:22 +01:00
My own ltn12.filter.chain is done.
Implemented part of DB's suggestion for ftp. Mimetest.lua generates the test file for base64 instead of loading from disk.
This commit is contained in:
parent
396946b63a
commit
4964552718
2
TODO
2
TODO
@ -4,7 +4,6 @@ new scheme to choose family/protocol of object to create
|
|||||||
change ltn13 to make sure drawbacks are obvious
|
change ltn13 to make sure drawbacks are obvious
|
||||||
- check discussion
|
- check discussion
|
||||||
make sure errors not thrown by try() are not caught by protect()
|
make sure errors not thrown by try() are not caught by protect()
|
||||||
use wim's filter.chain or something better
|
|
||||||
use mike's "don't set to blocking before closing unless needed" patch?
|
use mike's "don't set to blocking before closing unless needed" patch?
|
||||||
take a look at DB's smtp patch (add "extra argument" table)
|
take a look at DB's smtp patch (add "extra argument" table)
|
||||||
move wsocket.c:sock_send kludge to buffer.c:sendraw (probably)?
|
move wsocket.c:sock_send kludge to buffer.c:sendraw (probably)?
|
||||||
@ -24,6 +23,7 @@ testar os options!
|
|||||||
- proteger ou atomizar o conjunto (timedout, receive), (timedout, send)
|
- proteger ou atomizar o conjunto (timedout, receive), (timedout, send)
|
||||||
- inet_ntoa também é uma merda.
|
- inet_ntoa também é uma merda.
|
||||||
|
|
||||||
|
*use wim's filter.chain or something better
|
||||||
*fix PROXY in http.lua
|
*fix PROXY in http.lua
|
||||||
*use new distribution scheme
|
*use new distribution scheme
|
||||||
*create the getstats method.
|
*create the getstats method.
|
||||||
|
@ -125,8 +125,10 @@ function metat.__index:send(sendt)
|
|||||||
if string.find(code, "1..") then self.try(self.tp:check("2..")) end
|
if string.find(code, "1..") then self.try(self.tp:check("2..")) end
|
||||||
-- done with data connection
|
-- done with data connection
|
||||||
self.data:close()
|
self.data:close()
|
||||||
|
-- find out how many bytes were sent
|
||||||
|
local sent = socket.skip(1, self.data:getstats())
|
||||||
self.data = nil
|
self.data = nil
|
||||||
return 1
|
return sent
|
||||||
end
|
end
|
||||||
|
|
||||||
function metat.__index:receive(recvt)
|
function metat.__index:receive(recvt)
|
||||||
@ -186,9 +188,10 @@ local function tput(putt)
|
|||||||
f:login(putt.user, putt.password)
|
f:login(putt.user, putt.password)
|
||||||
if putt.type then f:type(putt.type) end
|
if putt.type then f:type(putt.type) end
|
||||||
f:pasv()
|
f:pasv()
|
||||||
f:send(putt)
|
local sent = f:send(putt)
|
||||||
f:quit()
|
f:quit()
|
||||||
return f:close()
|
f:close()
|
||||||
|
return sent
|
||||||
end
|
end
|
||||||
|
|
||||||
local default = {
|
local default = {
|
||||||
|
@ -31,38 +31,38 @@ function filter.cycle(low, ctx, extra)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- chains a bunch of filters together
|
local function chain2(f1, f2)
|
||||||
-- by Wim Couwenberg
|
local ff1, ff2 = "", ""
|
||||||
function filter.chain(...)
|
|
||||||
local current = 1
|
|
||||||
local bottom = 1
|
|
||||||
local top = table.getn(arg)
|
|
||||||
local retry = ""
|
|
||||||
return function(chunk)
|
return function(chunk)
|
||||||
if chunk ~= retry then
|
local rf1 = chunk and ""
|
||||||
current = bottom
|
local rf2 = ff1 and ""
|
||||||
retry = chunk and retry
|
-- if f2 still has pending data, get it and return it
|
||||||
|
if ff2 ~= rf2 then
|
||||||
|
ff2 = f2(rf2)
|
||||||
|
if ff2 ~= "" then return ff2 end
|
||||||
end
|
end
|
||||||
repeat
|
-- here we know f2 needs more data
|
||||||
if current == bottom then
|
-- we try to get it from f1
|
||||||
chunk = arg[current](chunk)
|
ff1 = f1(chunk)
|
||||||
if chunk == "" or bottom == top then return chunk
|
while 1 do
|
||||||
elseif chunk then current = current + 1
|
-- if f1 can't produce data, we need more data from the user
|
||||||
else
|
if ff1 == "" then return "" end
|
||||||
bottom = bottom + 1
|
-- otherwise we pass new data to f2 until it produces something
|
||||||
current = bottom
|
-- or f1 runs out of data too
|
||||||
end
|
ff2 = f2(ff1)
|
||||||
else
|
if ff2 ~= "" then return ff2 end
|
||||||
chunk = arg[current](chunk or "")
|
ff1 = f1(rf1)
|
||||||
if chunk == "" then
|
|
||||||
chunk = retry
|
|
||||||
current = current - 1
|
|
||||||
elseif current == top then return chunk
|
|
||||||
else current = current + 1
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
until false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- chains a bunch of filters together
|
||||||
|
function filter.chain(...)
|
||||||
|
local f = arg[1]
|
||||||
|
for i = 2, table.getn(arg) do
|
||||||
|
f = chain2(f, arg[i])
|
||||||
|
end
|
||||||
|
return f
|
||||||
end
|
end
|
||||||
|
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
|
@ -8,13 +8,10 @@ local qptest = "qptest.bin"
|
|||||||
local eqptest = "qptest.bin2"
|
local eqptest = "qptest.bin2"
|
||||||
local dqptest = "qptest.bin3"
|
local dqptest = "qptest.bin3"
|
||||||
|
|
||||||
local b64test = "lsocket.2.0.dylib"
|
local b64test = "b64test.bin"
|
||||||
local eb64test = "b64test.bin"
|
local eb64test = "b64test.bin2"
|
||||||
local db64test = "b64test.bin2"
|
local db64test = "b64test.bin3"
|
||||||
|
|
||||||
-- make sure test file exists
|
|
||||||
local f = assert(io.open(b64test, "r"))
|
|
||||||
f:close()
|
|
||||||
|
|
||||||
-- from Machado de Assis, "A Mão e a Rosa"
|
-- from Machado de Assis, "A Mão e a Rosa"
|
||||||
local mao = [[
|
local mao = [[
|
||||||
@ -86,6 +83,7 @@ local function named(f, name)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
]]
|
]]
|
||||||
|
|
||||||
local function named(f)
|
local function named(f)
|
||||||
return f
|
return f
|
||||||
end
|
end
|
||||||
@ -188,6 +186,19 @@ local function cleanup_qptest()
|
|||||||
os.remove(dqptest)
|
os.remove(dqptest)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- create test file
|
||||||
|
function create_b64test()
|
||||||
|
local f = assert(io.open(b64test, "wb"))
|
||||||
|
local t = {}
|
||||||
|
for j = 1, 100 do
|
||||||
|
for i = 1, 100 do
|
||||||
|
t[i] = math.random(0, 255)
|
||||||
|
end
|
||||||
|
f:write(string.char(unpack(t)))
|
||||||
|
end
|
||||||
|
f:close()
|
||||||
|
end
|
||||||
|
|
||||||
local function encode_b64test()
|
local function encode_b64test()
|
||||||
local e1 = mime.encode("base64")
|
local e1 = mime.encode("base64")
|
||||||
local e2 = mime.encode("base64")
|
local e2 = mime.encode("base64")
|
||||||
@ -212,6 +223,7 @@ local function decode_b64test()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function cleanup_b64test()
|
local function cleanup_b64test()
|
||||||
|
os.remove(b64test)
|
||||||
os.remove(eb64test)
|
os.remove(eb64test)
|
||||||
os.remove(db64test)
|
os.remove(db64test)
|
||||||
end
|
end
|
||||||
@ -221,12 +233,12 @@ local function compare_b64test()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function identity_test()
|
local function identity_test()
|
||||||
local chain = ltn12.filter.chain(
|
local chain = named(ltn12.filter.chain(
|
||||||
mime.encode("quoted-printable"),
|
named(mime.encode("quoted-printable"), "1 eq"),
|
||||||
mime.encode("base64"),
|
named(mime.encode("base64"), "2 eb"),
|
||||||
mime.decode("base64"),
|
named(mime.decode("base64"), "3 db"),
|
||||||
mime.decode("quoted-printable")
|
named(mime.decode("quoted-printable"), "4 dq")
|
||||||
)
|
), "chain")
|
||||||
transform(b64test, eb64test, chain)
|
transform(b64test, eb64test, chain)
|
||||||
compare(b64test, eb64test)
|
compare(b64test, eb64test)
|
||||||
os.remove(eb64test)
|
os.remove(eb64test)
|
||||||
@ -271,6 +283,7 @@ end
|
|||||||
local t = socket.gettime()
|
local t = socket.gettime()
|
||||||
|
|
||||||
identity_test()
|
identity_test()
|
||||||
|
create_b64test()
|
||||||
encode_b64test()
|
encode_b64test()
|
||||||
decode_b64test()
|
decode_b64test()
|
||||||
compare_b64test()
|
compare_b64test()
|
||||||
|
Loading…
Reference in New Issue
Block a user