diff options
Diffstat (limited to 'vendor/luasocket/src/mbox.lua')
-rw-r--r-- | vendor/luasocket/src/mbox.lua | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/vendor/luasocket/src/mbox.lua b/vendor/luasocket/src/mbox.lua new file mode 100644 index 00000000..12823b0a --- /dev/null +++ b/vendor/luasocket/src/mbox.lua | |||
@@ -0,0 +1,93 @@ | |||
1 | local _M = {} | ||
2 | |||
3 | if module then | ||
4 | mbox = _M -- luacheck: ignore | ||
5 | end | ||
6 | |||
7 | function _M.split_message(message_s) | ||
8 | local message = {} | ||
9 | message_s = string.gsub(message_s, "\r\n", "\n") | ||
10 | string.gsub(message_s, "^(.-\n)\n", function (h) message.headers = h end) | ||
11 | string.gsub(message_s, "^.-\n\n(.*)", function (b) message.body = b end) | ||
12 | if not message.body then | ||
13 | string.gsub(message_s, "^\n(.*)", function (b) message.body = b end) | ||
14 | end | ||
15 | if not message.headers and not message.body then | ||
16 | message.headers = message_s | ||
17 | end | ||
18 | return message.headers or "", message.body or "" | ||
19 | end | ||
20 | |||
21 | function _M.split_headers(headers_s) | ||
22 | local headers = {} | ||
23 | headers_s = string.gsub(headers_s, "\r\n", "\n") | ||
24 | headers_s = string.gsub(headers_s, "\n[ ]+", " ") | ||
25 | string.gsub("\n" .. headers_s, "\n([^\n]+)", function (h) table.insert(headers, h) end) | ||
26 | return headers | ||
27 | end | ||
28 | |||
29 | function _M.parse_header(header_s) | ||
30 | header_s = string.gsub(header_s, "\n[ ]+", " ") | ||
31 | header_s = string.gsub(header_s, "\n+", "") | ||
32 | local _, _, name, value = string.find(header_s, "([^%s:]-):%s*(.*)") | ||
33 | return name, value | ||
34 | end | ||
35 | |||
36 | function _M.parse_headers(headers_s) | ||
37 | local headers_t = _M.split_headers(headers_s) | ||
38 | local headers = {} | ||
39 | for i = 1, #headers_t do | ||
40 | local name, value = _M.parse_header(headers_t[i]) | ||
41 | if name then | ||
42 | name = string.lower(name) | ||
43 | if headers[name] then | ||
44 | headers[name] = headers[name] .. ", " .. value | ||
45 | else headers[name] = value end | ||
46 | end | ||
47 | end | ||
48 | return headers | ||
49 | end | ||
50 | |||
51 | function _M.parse_from(from) | ||
52 | local _, _, name, address = string.find(from, "^%s*(.-)%s*%<(.-)%>") | ||
53 | if not address then | ||
54 | _, _, address = string.find(from, "%s*(.+)%s*") | ||
55 | end | ||
56 | name = name or "" | ||
57 | address = address or "" | ||
58 | if name == "" then name = address end | ||
59 | name = string.gsub(name, '"', "") | ||
60 | return name, address | ||
61 | end | ||
62 | |||
63 | function _M.split_mbox(mbox_s) | ||
64 | local mbox = {} | ||
65 | mbox_s = string.gsub(mbox_s, "\r\n", "\n") .."\n\nFrom \n" | ||
66 | local nj, i | ||
67 | local j = 1 | ||
68 | while 1 do | ||
69 | i, nj = string.find(mbox_s, "\n\nFrom .-\n", j) | ||
70 | if not i then break end | ||
71 | local message = string.sub(mbox_s, j, i-1) | ||
72 | table.insert(mbox, message) | ||
73 | j = nj+1 | ||
74 | end | ||
75 | return mbox | ||
76 | end | ||
77 | |||
78 | function _M.parse(mbox_s) | ||
79 | local mbox = _M.split_mbox(mbox_s) | ||
80 | for i = 1, #mbox do | ||
81 | mbox[i] = _M.parse_message(mbox[i]) | ||
82 | end | ||
83 | return mbox | ||
84 | end | ||
85 | |||
86 | function _M.parse_message(message_s) | ||
87 | local message = {} | ||
88 | message.headers, message.body = _M.split_message(message_s) | ||
89 | message.headers = _M.parse_headers(message.headers) | ||
90 | return message | ||
91 | end | ||
92 | |||
93 | return _M | ||