class Mail::UnstructuredField - mail-2.5.4 Documentation

# 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
      value.blank? ? 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 173
    def encode(value)
      value = [value].pack("M").gsub("=\n", '')
      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 184
    def encode_crlf(value)
      value.gsub!("\r", '=0D')
      value.gsub!("\n", '=0A')
      value
    end

normalized_encoding() click to toggle source

    # File lib/mail/fields/unstructured_field.rb, line 190
    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