class Mail::UnstructuredField

Provides access to an unstructured header field

Per RFC 2822:

2.2.1. Unstructured Header Field Bodies

   Some field bodies in this standard are defined simply as
   "unstructured" (which is specified below as any US-ASCII characters,
   except for CR and LF) with no further restrictions.  These are
   referred to as unstructured field bodies.  Semantically, unstructured
   field bodies are simply to be treated as a single line of characters
   with no further processing (except for header "folding" and
   "unfolding" as described in section 2.2.3).

Attributes

charset[RW]
errors[R]

Public Class Methods

new(name, value, charset = nil) click to toggle source
# File lib/mail/fields/unstructured_field.rb, line 24
def initialize(name, value, charset = nil)
  @errors = []

  if value.is_a?(Array)
    # Probably has arrived here from a failed parse of an AddressList Field
    value = value.join(', ')
  else
    # Ensure we are dealing with a string
    value = value.to_s
  end

  if charset
    self.charset = charset
  else
    if value.respond_to?(:encoding)
      self.charset = value.encoding
    else
      self.charset = $KCODE
    end
  end
  self.name = name
  self.value = value
  self
end

Public Instance Methods

decoded() click to toggle source
# File lib/mail/fields/unstructured_field.rb, line 53
def decoded
  do_decode
end
default() click to toggle source
# File lib/mail/fields/unstructured_field.rb, line 57
def default
  decoded
end
encoded() click to toggle source
# File lib/mail/fields/unstructured_field.rb, line 49
def encoded
  do_encode
end
parse() click to toggle source
# File lib/mail/fields/unstructured_field.rb, line 61
def parse # An unstructured field does not parse
  self
end

Private Instance Methods

do_decode() click to toggle source
# File lib/mail/fields/unstructured_field.rb, line 71
def do_decode
  Utilities.blank?(value) ? nil : Encodings.decode_encode(value, :decode)
end
do_encode() click to toggle source
# File lib/mail/fields/unstructured_field.rb, line 67
def do_encode
  value.nil? ? '' : "#{wrapped_value}\r\n"
end
encode(value) click to toggle source
# File lib/mail/fields/unstructured_field.rb, line 179
def encode(value)
  value = [value].pack(CAPITAL_M).gsub(EQUAL_LF, EMPTY)
  value.gsub!(/"/,  '=22')
  value.gsub!(/\(/, '=28')
  value.gsub!(/\)/, '=29')
  value.gsub!(/\?/, '=3F')
  value.gsub!(/_/,  '=5F')
  value.gsub!(/ /,  '_')
  value
end
encode_crlf(value) click to toggle source
# File lib/mail/fields/unstructured_field.rb, line 190
def encode_crlf(value)
  value.gsub!(CR, CR_ENCODED)
  value.gsub!(LF, LF_ENCODED)
  value
end
normalized_encoding() click to toggle source
# File lib/mail/fields/unstructured_field.rb, line 196
def normalized_encoding
  encoding = charset.to_s.upcase.gsub('_', '-')
  encoding = 'UTF-8' if encoding == 'UTF8' # Ruby 1.8.x and $KCODE == 'u'
  encoding
end
wrap_lines(name, folded_lines) click to toggle source

6.2. Display of 'encoded-word's

When displaying a particular header field that contains multiple
'encoded-word's, any 'linear-white-space' that separates a pair of
adjacent 'encoded-word's is ignored.  (This is to allow the use of
multiple 'encoded-word's to represent long strings of unencoded text,
without having to separate 'encoded-word's where spaces occur in the
unencoded text.)
# File lib/mail/fields/unstructured_field.rb, line 113
def wrap_lines(name, folded_lines)
  result = ["#{name}: #{folded_lines.shift}"]
  result.concat(folded_lines)
  result.join("\r\n\s")
end