diff options
| author | Diego Nehab <diego@tecgraf.puc-rio.br> | 2002-12-02 23:34:41 +0000 |
|---|---|---|
| committer | Diego Nehab <diego@tecgraf.puc-rio.br> | 2002-12-02 23:34:41 +0000 |
| commit | d7e80592a69c076991ed4f4cc15d5390e14d1f0b (patch) | |
| tree | 5fd9c99742b4a03e6a66f940a1f86f98d4db50c8 /src/mbox.lua | |
| parent | b796207ce06a66b04cce6686b3fa664c06703995 (diff) | |
| download | luasocket-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.lua | 113 |
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 @@ | |||
| 1 | local Public = {} | 1 | local Public = {} |
| 2 | 2 | ||
| 3 | parse = Public | 3 | mbox = Public |
| 4 | 4 | ||
| 5 | function Public.headers(headers_s) | 5 | function 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 "" | ||
| 17 | end | ||
| 18 | |||
| 19 | function 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 | ||
| 25 | end | ||
| 26 | |||
| 27 | function 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 | ||
| 32 | end | ||
| 33 | |||
| 34 | function 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 |
| 23 | end | 47 | end |
| 24 | 48 | ||
| 25 | function Public.message(message_s) | 49 | function 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 } | ||
| 32 | end | ||
| 33 | |||
| 34 | function 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 | ||
| 59 | end | ||
| 60 | |||
| 61 | function 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 | ||
| 73 | end | ||
| 74 | |||
| 75 | function 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 | ||
| 81 | end | ||
| 82 | |||
| 83 | function 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 | ||
| 45 | end | 88 | end |
