diff options
| author | Diego Nehab <diego@tecgraf.puc-rio.br> | 2004-11-28 02:36:07 +0000 |
|---|---|---|
| committer | Diego Nehab <diego@tecgraf.puc-rio.br> | 2004-11-28 02:36:07 +0000 |
| commit | 297b32e828b76ee544c9d4f89f996eda78830cc0 (patch) | |
| tree | 312ca3a296b1e959acddeca9303cb238ac8324dc | |
| parent | 05e8f243851049cebda6c5b690d3cde0f1e2c874 (diff) | |
| download | luasocket-297b32e828b76ee544c9d4f89f996eda78830cc0.tar.gz luasocket-297b32e828b76ee544c9d4f89f996eda78830cc0.tar.bz2 luasocket-297b32e828b76ee544c9d4f89f996eda78830cc0.zip | |
LTN12 bug removed.
| -rw-r--r-- | src/ltn12.lua | 26 | ||||
| -rw-r--r-- | src/mime.c | 7 | ||||
| -rw-r--r-- | src/mime.lua | 9 | ||||
| -rw-r--r-- | test/mimetest.lua | 13 |
4 files changed, 39 insertions, 16 deletions
diff --git a/src/ltn12.lua b/src/ltn12.lua index 5216ff6..1a13a43 100644 --- a/src/ltn12.lua +++ b/src/ltn12.lua | |||
| @@ -40,30 +40,27 @@ end | |||
| 40 | function filter.chain(...) | 40 | function filter.chain(...) |
| 41 | local n = table.getn(arg) | 41 | local n = table.getn(arg) |
| 42 | local top, index = 1, 1 | 42 | local top, index = 1, 1 |
| 43 | local retry = "" | ||
| 43 | return function(chunk) | 44 | return function(chunk) |
| 45 | retry = chunk and retry | ||
| 44 | while true do | 46 | while true do |
| 45 | if index == top then | 47 | if index == top then |
| 46 | chunk = arg[index](chunk) | 48 | chunk = arg[index](chunk) |
| 47 | if chunk == "" or top == n then | 49 | if chunk == "" or top == n then return chunk |
| 48 | return chunk | 50 | elseif chunk then index = index + 1 |
| 49 | elseif chunk then | ||
| 50 | index = index + 1 | ||
| 51 | else | 51 | else |
| 52 | top = top+1 | 52 | top = top+1 |
| 53 | index = top | 53 | index = top |
| 54 | end | 54 | end |
| 55 | else | 55 | else |
| 56 | local original = chunk | 56 | chunk = arg[index](chunk or "") |
| 57 | chunk = arg[index](original or "") | ||
| 58 | if chunk == "" then | 57 | if chunk == "" then |
| 59 | index = index - 1 | 58 | index = index - 1 |
| 60 | chunk = original and chunk | 59 | chunk = retry |
| 61 | elseif chunk then | 60 | elseif chunk then |
| 62 | if index == n then return chunk | 61 | if index == n then return chunk |
| 63 | else index = index + 1 end | 62 | else index = index + 1 end |
| 64 | else | 63 | else base.error("filter returned inappropriate nil") end |
| 65 | base.error("filter returned inappropriate nil") | ||
| 66 | end | ||
| 67 | end | 64 | end |
| 68 | end | 65 | end |
| 69 | end | 66 | end |
| @@ -138,6 +135,8 @@ function source.rewind(src) | |||
| 138 | end | 135 | end |
| 139 | end | 136 | end |
| 140 | 137 | ||
| 138 | local print = print | ||
| 139 | |||
| 141 | -- chains a source with a filter | 140 | -- chains a source with a filter |
| 142 | function source.chain(src, f) | 141 | function source.chain(src, f) |
| 143 | base.assert(src and f) | 142 | base.assert(src and f) |
| @@ -151,13 +150,16 @@ function source.chain(src, f) | |||
| 151 | last_out = f(last_in) | 150 | last_out = f(last_in) |
| 152 | if last_out ~= "" then return last_out end | 151 | if last_out ~= "" then return last_out end |
| 153 | if not last_in then | 152 | if not last_in then |
| 154 | error('filter returned inappropriate ""') | 153 | base.error('filter returned inappropriate ""') |
| 155 | end | 154 | end |
| 156 | end | 155 | end |
| 157 | elseif last_out then | 156 | elseif last_out then |
| 158 | last_out = f(last_in and "") | 157 | last_out = f(last_in and "") |
| 159 | if last_in and not last_out then | 158 | if last_in and not last_out then |
| 160 | error('filter returned inappropriate nil') | 159 | base.error('filter returned inappropriate nil') |
| 160 | end | ||
| 161 | if last_out == "" and not last_in then | ||
| 162 | base.error(base.tostring(f) .. ' returned inappropriate ""') | ||
| 161 | end | 163 | end |
| 162 | return last_out | 164 | return last_out |
| 163 | else | 165 | else |
| @@ -267,6 +267,7 @@ static int mime_global_b64(lua_State *L) | |||
| 267 | if (!input) { | 267 | if (!input) { |
| 268 | asize = b64pad(atom, asize, &buffer); | 268 | asize = b64pad(atom, asize, &buffer); |
| 269 | luaL_pushresult(&buffer); | 269 | luaL_pushresult(&buffer); |
| 270 | if (!(*lua_tostring(L, -1))) lua_pushnil(L); | ||
| 270 | lua_pushnil(L); | 271 | lua_pushnil(L); |
| 271 | return 2; | 272 | return 2; |
| 272 | } | 273 | } |
| @@ -306,6 +307,7 @@ static int mime_global_unb64(lua_State *L) | |||
| 306 | /* if second is nil, we are done */ | 307 | /* if second is nil, we are done */ |
| 307 | if (!input) { | 308 | if (!input) { |
| 308 | luaL_pushresult(&buffer); | 309 | luaL_pushresult(&buffer); |
| 310 | if (!(*lua_tostring(L, -1))) lua_pushnil(L); | ||
| 309 | lua_pushnil(L); | 311 | lua_pushnil(L); |
| 310 | return 2; | 312 | return 2; |
| 311 | } | 313 | } |
| @@ -418,7 +420,7 @@ static size_t qppad(UC *input, size_t size, luaL_Buffer *buffer) | |||
| 418 | if (qpclass[input[i]] == QP_PLAIN) luaL_putchar(buffer, input[i]); | 420 | if (qpclass[input[i]] == QP_PLAIN) luaL_putchar(buffer, input[i]); |
| 419 | else qpquote(input[i], buffer); | 421 | else qpquote(input[i], buffer); |
| 420 | } | 422 | } |
| 421 | luaL_addstring(buffer, EQCRLF); | 423 | if (size > 0) luaL_addstring(buffer, EQCRLF); |
| 422 | return 0; | 424 | return 0; |
| 423 | } | 425 | } |
| 424 | 426 | ||
| @@ -454,7 +456,9 @@ static int mime_global_qp(lua_State *L) | |||
| 454 | if (!input) { | 456 | if (!input) { |
| 455 | asize = qppad(atom, asize, &buffer); | 457 | asize = qppad(atom, asize, &buffer); |
| 456 | luaL_pushresult(&buffer); | 458 | luaL_pushresult(&buffer); |
| 459 | if (!(*lua_tostring(L, -1))) lua_pushnil(L); | ||
| 457 | lua_pushnil(L); | 460 | lua_pushnil(L); |
| 461 | return 2; | ||
| 458 | } | 462 | } |
| 459 | /* otherwise process rest of input */ | 463 | /* otherwise process rest of input */ |
| 460 | last = input + isize; | 464 | last = input + isize; |
| @@ -531,6 +535,7 @@ static int mime_global_unqp(lua_State *L) | |||
| 531 | /* if second part is nil, we are done */ | 535 | /* if second part is nil, we are done */ |
| 532 | if (!input) { | 536 | if (!input) { |
| 533 | luaL_pushresult(&buffer); | 537 | luaL_pushresult(&buffer); |
| 538 | if (!(*lua_tostring(L, -1))) lua_pushnil(L); | ||
| 534 | lua_pushnil(L); | 539 | lua_pushnil(L); |
| 535 | return 2; | 540 | return 2; |
| 536 | } | 541 | } |
diff --git a/src/mime.lua b/src/mime.lua index 712600c..42d0b3c 100644 --- a/src/mime.lua +++ b/src/mime.lua | |||
| @@ -49,6 +49,15 @@ mime.decodet['quoted-printable'] = function() | |||
| 49 | return ltn12.filter.cycle(unqp, "") | 49 | return ltn12.filter.cycle(unqp, "") |
| 50 | end | 50 | end |
| 51 | 51 | ||
| 52 | local io, string = io, string | ||
| 53 | |||
| 54 | local function format(chunk) | ||
| 55 | if chunk then | ||
| 56 | if chunk == "" then return "''" | ||
| 57 | else return string.len(chunk) end | ||
| 58 | else return "nil" end | ||
| 59 | end | ||
| 60 | |||
| 52 | -- define the line-wrap filters | 61 | -- define the line-wrap filters |
| 53 | mime.wrapt['text'] = function(length) | 62 | mime.wrapt['text'] = function(length) |
| 54 | length = length or 76 | 63 | length = length or 76 |
diff --git a/test/mimetest.lua b/test/mimetest.lua index 2f6b7a8..f52a351 100644 --- a/test/mimetest.lua +++ b/test/mimetest.lua | |||
| @@ -39,9 +39,13 @@ local mao = [[ | |||
| 39 | local function random(handle, io_err) | 39 | local function random(handle, io_err) |
| 40 | if handle then | 40 | if handle then |
| 41 | return function() | 41 | return function() |
| 42 | if not handle then error("source is empty!", 2) end | ||
| 42 | local len = math.random(0, 1024) | 43 | local len = math.random(0, 1024) |
| 43 | local chunk = handle:read(len) | 44 | local chunk = handle:read(len) |
| 44 | if not chunk then handle:close() end | 45 | if not chunk then |
| 46 | handle:close() | ||
| 47 | handle = nil | ||
| 48 | end | ||
| 45 | return chunk | 49 | return chunk |
| 46 | end | 50 | end |
| 47 | else return ltn12.source.empty(io_err or "unable to open file") end | 51 | else return ltn12.source.empty(io_err or "unable to open file") end |
| @@ -73,6 +77,7 @@ local function encode_qptest(mode) | |||
| 73 | end | 77 | end |
| 74 | 78 | ||
| 75 | local function compare_qptest() | 79 | local function compare_qptest() |
| 80 | io.write("testing qp encoding and wrap: ") | ||
| 76 | compare(qptest, dqptest) | 81 | compare(qptest, dqptest) |
| 77 | end | 82 | end |
| 78 | 83 | ||
| @@ -173,7 +178,6 @@ local function encode_b64test() | |||
| 173 | local sp2 = mime.wrap("base64", 30) | 178 | local sp2 = mime.wrap("base64", 30) |
| 174 | local sp1 = mime.wrap(27) | 179 | local sp1 = mime.wrap(27) |
| 175 | local chain = ltn12.filter.chain(e1, sp1, e2, sp2, e3, sp3, e4, sp4) | 180 | local chain = ltn12.filter.chain(e1, sp1, e2, sp2, e3, sp3, e4, sp4) |
| 176 | chain = socket.protect(chain) | ||
| 177 | transform(b64test, eb64test, chain) | 181 | transform(b64test, eb64test, chain) |
| 178 | end | 182 | end |
| 179 | 183 | ||
| @@ -193,10 +197,12 @@ local function cleanup_b64test() | |||
| 193 | end | 197 | end |
| 194 | 198 | ||
| 195 | local function compare_b64test() | 199 | local function compare_b64test() |
| 200 | io.write("testing b64 chained encode: ") | ||
| 196 | compare(b64test, db64test) | 201 | compare(b64test, db64test) |
| 197 | end | 202 | end |
| 198 | 203 | ||
| 199 | local function identity_test() | 204 | local function identity_test() |
| 205 | io.write("testing identity: ") | ||
| 200 | local chain = named(ltn12.filter.chain( | 206 | local chain = named(ltn12.filter.chain( |
| 201 | named(mime.encode("quoted-printable"), "1 eq"), | 207 | named(mime.encode("quoted-printable"), "1 eq"), |
| 202 | named(mime.encode("base64"), "2 eb"), | 208 | named(mime.encode("base64"), "2 eb"), |
| @@ -223,11 +229,12 @@ local function chunkcheck(original, encoded) | |||
| 223 | local b = string.sub(original, i+1) | 229 | local b = string.sub(original, i+1) |
| 224 | local e, r = mime.b64(a, b) | 230 | local e, r = mime.b64(a, b) |
| 225 | local f = (mime.b64(r)) | 231 | local f = (mime.b64(r)) |
| 226 | if (e .. f ~= encoded) then fail(e .. f) end | 232 | if (e .. (f or "") ~= encoded) then fail(e .. (f or "")) end |
| 227 | end | 233 | end |
| 228 | end | 234 | end |
| 229 | 235 | ||
| 230 | local function padding_b64test() | 236 | local function padding_b64test() |
| 237 | io.write("testing b64 padding: ") | ||
| 231 | padcheck("a", "YQ==") | 238 | padcheck("a", "YQ==") |
| 232 | padcheck("ab", "YWI=") | 239 | padcheck("ab", "YWI=") |
| 233 | padcheck("abc", "YWJj") | 240 | padcheck("abc", "YWJj") |
