lib/sup/mbox.rb in sup-0.0.8 vs lib/sup/mbox.rb in sup-0.1

- old
+ new

@@ -1,12 +1,16 @@ require "sup/mbox/loader" require "sup/mbox/ssh-file" require "sup/mbox/ssh-loader" +require "sup/rfc2047" module Redwood -## some utility functions +## some utility functions. actually these are not mbox-specific at all +## and should be moved somewhere else. +## +## TODO: move functionality to somewhere better, like message.rb module MBox BREAK_RE = /^From \S+/ def read_header f header = {} @@ -14,33 +18,48 @@ ## i do it in this weird way because i am trying to speed things up ## when scanning over large mbox files. while(line = f.gets) case line - when /^(From):\s+(.*)$/i, - /^(To):\s+(.*)$/i, - /^(Cc):\s+(.*)$/i, - /^(Bcc):\s+(.*)$/i, - /^(Subject):\s+(.*)$/i, - /^(Date):\s+(.*)$/i, - /^(Message-Id):\s+<(.*)>$/i, - /^(References):\s+(.*)$/i, - /^(In-Reply-To):\s+(.*)$/i, - /^(Reply-To):\s+(.*)$/i, - /^(List-Post):\s+(.*)$/i, - /^(Status):\s+(.*)$/i: header[last = $1] = $2 + when /^(From):\s+(.*?)\s*$/i, + /^(To):\s+(.*?)\s*$/i, + /^(Cc):\s+(.*?)\s*$/i, + /^(Bcc):\s+(.*?)\s*$/i, + /^(Subject):\s+(.*?)\s*$/i, + /^(Date):\s+(.*?)\s*$/i, + /^(References):\s+(.*?)\s*$/i, + /^(In-Reply-To):\s+(.*?)\s*$/i, + /^(Reply-To):\s+(.*?)\s*$/i, + /^(List-Post):\s+(.*?)\s*$/i, + /^(Status):\s+(.*?)\s*$/i: header[last = $1] = $2 + when /^(Message-Id):\s+(.*?)\s*$/i: header[mid_field = last = $1] = $2 ## these next three can occur multiple times, and we want the ## first one when /^(Delivered-To):\s+(.*)$/i, /^(X-Original-To):\s+(.*)$/i, - /^(Envelope-To):\s+(.*)$/i: header[last = $1.downcase] ||= $2 + /^(Envelope-To):\s+(.*)$/i: header[last = $1] ||= $2 when /^$/: break - when /:/: last = nil + when /:/: last = nil # some other header we don't care about else header[last] += " " + line.chomp.gsub(/^\s+/, "") if last end + end + + if mid_field && header[mid_field] && header[mid_field] =~ /<(.*?)>/ + header[mid_field] = $1 + end + + header.each do |k, v| + next unless Rfc2047.is_encoded? v + header[k] = + begin + Rfc2047.decode_to $encoding, v + rescue Errno::EINVAL, Iconv::InvalidEncoding, Iconv::IllegalSequence => e + Redwood::log "warning: error decoding RFC 2047 header: #{e.message}" + v + end end header end def read_body f