aboutsummaryrefslogtreecommitdiff
path: root/src/mbox.lua
diff options
context:
space:
mode:
authorDiego Nehab <diego@tecgraf.puc-rio.br>2002-12-02 23:34:41 +0000
committerDiego Nehab <diego@tecgraf.puc-rio.br>2002-12-02 23:34:41 +0000
commitd7e80592a69c076991ed4f4cc15d5390e14d1f0b (patch)
tree5fd9c99742b4a03e6a66f940a1f86f98d4db50c8 /src/mbox.lua
parentb796207ce06a66b04cce6686b3fa664c06703995 (diff)
downloadluasocket-d7e80592a69c076991ed4f4cc15d5390e14d1f0b.tar.gz
luasocket-d7e80592a69c076991ed4f4cc15d5390e14d1f0b.tar.bz2
luasocket-d7e80592a69c076991ed4f4cc15d5390e14d1f0b.zip
Already compiling and running for Lua 5.0 (alpha)
Diffstat (limited to 'src/mbox.lua')
-rw-r--r--src/mbox.lua113
1 files changed, 78 insertions, 35 deletions
diff --git a/src/mbox.lua b/src/mbox.lua
index 9cce9ff..2969111 100644
--- a/src/mbox.lua
+++ b/src/mbox.lua
@@ -1,45 +1,88 @@
1local Public = {} 1local Public = {}
2 2
3parse = Public 3mbox = Public
4 4
5function Public.headers(headers_s) 5function Public.split_message(message_s)
6 local message = {}
7 message_s = gsub(message_s, "\r\n", "\n")
8 gsub(message_s, "^(.-\n)\n", function (h) %message.headers = h end)
9 gsub(message_s, "^.-\n\n(.*)", function (b) %message.body = b end)
10 if not message.body then
11 gsub(message_s, "^\n(.*)", function (b) %message.body = b end)
12 end
13 if not message.headers and not message.body then
14 message.headers = message_s
15 end
16 return message.headers or "", message.body or ""
17end
18
19function Public.split_headers(headers_s)
20 local headers = {}
21 headers_s = gsub(headers_s, "\r\n", "\n")
22 headers_s = gsub(headers_s, "\n[ ]+", " ")
23 gsub("\n" .. headers_s, "\n([^\n]+)", function (h) tinsert(%headers, h) end)
24 return headers
25end
26
27function Public.parse_header(header_s)
28 header_s = gsub(header_s, "\n[ ]+", " ")
29 header_s = gsub(header_s, "\n+", "")
30 local _, __, name, value = strfind(header_s, "([^%s:]-):%s*(.*)")
31 return name, value
32end
33
34function Public.parse_headers(headers_s)
35 local headers_t = %Public.split_headers(headers_s)
6 local headers = {} 36 local headers = {}
7 headers_s = "\n" .. headers_s .. "$$$:\n" 37 for i = 1, getn(headers_t) do
8 local i, j = 1, 1 38 local name, value = %Public.parse_header(headers_t[i])
9 local name, value, _ 39 if name then
10 while 1 do 40 name = strlower(name)
11 j = strfind(headers_s, "\n%S-:", i+1) 41 if headers[name] then
12 if not j then break end 42 headers[name] = headers[name] .. ", " .. value
13 _,_, name, value = strfind(strsub(headers_s, i+1, j-1), "(%S-):%s?(.*)") 43 else headers[name] = value end
14 value = gsub(value or "", "\r\n", "\n") 44 end
15 value = gsub(value, "\n%s*", " ")
16 name = strlower(name)
17 if headers[name] then headers[name] = headers[name] .. ", " .. value
18 else headers[name] = value end
19 i, j = j, i
20 end 45 end
21 headers["$$$"] = nil
22 return headers 46 return headers
23end 47end
24 48
25function Public.message(message_s) 49function Public.parse_from(from)
26 message_s = gsub(message_s, "^.-\n", "") 50 local _, __, name, address = strfind(from, "^%s*(.-)%s*%<(.-)%>")
27 local _, headers_s, body 51 if not address then
28 _, _, headers_s, body = strfind(message_s, "^(.-\n)\n(.*)") 52 _, __, address = strfind(from, "%s*(.+)%s*")
29 headers_s = headers_s or ""
30 body = body or ""
31 return { headers = %Public.headers(headers_s), body = body }
32end
33
34function Public.mbox(mbox_s)
35 local mbox = {}
36 mbox_s = "\n" .. mbox_s .. "\nFrom "
37 local i, j = 1, 1
38 while 1 do
39 j = strfind(mbox_s, "\nFrom ", i + 1)
40 if not j then break end
41 tinsert(mbox, %Public.message(strsub(mbox_s, i + 1, j - 1)))
42 i, j = j, i
43 end 53 end
44 return mbox 54 name = name or ""
55 address = address or ""
56 if name == "" then name = address end
57 name = gsub(name, '"', "")
58 return name, address
59end
60
61function Public.split_mbox(mbox_s)
62 mbox = {}
63 mbox_s = gsub(mbox_s, "\r\n", "\n") .."\n\nFrom \n"
64 local nj, i, j = 1, 1, 1
65 while 1 do
66 i, nj = strfind(mbox_s, "\n\nFrom .-\n", j)
67 if not i then break end
68 local message = strsub(mbox_s, j, i-1)
69 tinsert(mbox, message)
70 j = nj+1
71 end
72 return mbox
73end
74
75function Public.parse_mbox(mbox_s)
76 local mbox = %Public.split_mbox(mbox_s)
77 for i = 1, getn(mbox) do
78 mbox[i] = %Public.parse_message(mbox[i])
79 end
80 return mbox
81end
82
83function Public.parse_message(message_s)
84 local message = {}
85 message.headers, message.body = %Public.split_message(message_s)
86 message.headers = %Public.parse_headers(message.headers)
87 return message
45end 88end