aboutsummaryrefslogtreecommitdiff
path: root/src/mime.lua
blob: 86b3af20acf8245153c1ddb4c111e990560926ed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
-- make sure LuaSocket is loaded
if not LUASOCKET_LIBNAME then error('module requires LuaSocket') end
-- get LuaSocket namespace
local socket = _G[LUASOCKET_LIBNAME] 
if not socket then error('module requires LuaSocket') end
-- create code namespace inside LuaSocket namespace
local mime = socket.mime or {}
socket.mime = mime
-- make all module globals fall into mime namespace
setmetatable(mime, { __index = _G })
setfenv(1, mime)

base64 = {}
qprint = {}

function base64.encode()
    local unfinished = ""
    return function(chunk)
        local done
        done, unfinished = b64(unfinished, chunk)
        return done
    end
end

function base64.decode()
    local unfinished = ""
    return function(chunk)
        local done
        done, unfinished = unb64(unfinished, chunk)
        return done
    end
end

function qprint.encode(mode)
    mode = (mode == "binary") and "=0D=0A" or "\13\10" 
    local unfinished = ""
    return function(chunk)
        local done
        done, unfinished = qp(unfinished, chunk, mode)
        return done
    end
end

function qprint.decode()
    local unfinished = ""
    return function(chunk)
        local done
        done, unfinished = unqp(unfinished, chunk)
        return done
    end
end

function split(length, marker)
    length = length or 76
    local left = length
    return function(chunk)
        local done
        done, left = fmt(chunk, length, left, marker)
        return done
    end
end

function qprint.split(length)
    length = length or 76
    local left = length
    return function(chunk)
        local done
        done, left = qpfmt(chunk, length, left)
        return done
    end
end

function canonic(marker)
    local unfinished = ""
    return function(chunk)
        local done
        done, unfinished = eol(unfinished, chunk, marker)
        return done
    end
end

function chain(...)
    local layers = table.getn(arg)
    return function (chunk)
        if not chunk then
            local parts = {}
            for i = 1, layers do
                for j = i, layers do
                    chunk = arg[j](chunk)
                end
                table.insert(parts, chunk)
                chunk = nil
            end
            return table.concat(parts)
        else
            for j = 1, layers do
                chunk = arg[j](chunk)
            end
            return chunk
        end
    end
end

return code