1 require "sup/mbox/loader"
2 require "sup/mbox/ssh-file"
3 require "sup/mbox/ssh-loader"
8 ## some utility functions. actually these are not mbox-specific at all
9 ## and should be moved somewhere else.
11 ## TODO: move functionality to somewhere better, like message.rb
13 BREAK_RE = /^From \S+/
14 HEADER_RE = /\s*(.*?\S)\s*/
20 ## i do it in this weird way because i am trying to speed things up
21 ## when scanning over large mbox files.
24 when /^(From):#{HEADER_RE}$/i,
25 /^(To):#{HEADER_RE}$/i,
26 /^(Cc):#{HEADER_RE}$/i,
27 /^(Bcc):#{HEADER_RE}$/i,
28 /^(Subject):#{HEADER_RE}$/i,
29 /^(Date):#{HEADER_RE}$/i,
30 /^(References):#{HEADER_RE}$/i,
31 /^(In-Reply-To):#{HEADER_RE}$/i,
32 /^(Reply-To):#{HEADER_RE}$/i,
33 /^(List-Post):#{HEADER_RE}$/i,
34 /^(List-Subscribe):#{HEADER_RE}$/i,
35 /^(List-Unsubscribe):#{HEADER_RE}$/i,
36 /^(Status):#{HEADER_RE}$/i: header[last = $1] = $2
37 when /^(Message-Id):#{HEADER_RE}$/i: header[mid_field = last = $1] = $2
39 ## these next three can occur multiple times, and we want the
41 when /^(Delivered-To):#{HEADER_RE}$/i,
42 /^(X-Original-To):#{HEADER_RE}$/i,
43 /^(Envelope-To):#{HEADER_RE}$/i: header[last = $1] ||= $2
46 when /^\S+:/: last = nil # some other header we don't care about
48 header[last] += " " + line.chomp.gsub(/^\s+/, "") if last
52 if mid_field && header[mid_field] && header[mid_field] =~ /<(.*?)>/
53 header[mid_field] = $1
57 next unless Rfc2047.is_encoded? v
60 Rfc2047.decode_to $encoding, v
61 rescue Errno::EINVAL, Iconv::InvalidEncoding, Iconv::IllegalSequence => e
62 Redwood::log "warning: error decoding RFC 2047 header (#{e.class.name}): #{e.message}"
69 ## never actually called
73 break if l =~ BREAK_RE
79 module_function :read_header, :read_body