123456789_123456789_123456789_123456789_123456789_

Module: OpenURI::Meta

Do not use. This module is for internal use only.
Relationships & Source Files
Defined in: lib/open-uri.rb

Overview

Mixin for holding meta-information.

Constant Summary

Class Method Summary

Instance Attribute Summary

  • #base_uri rw

    returns a ::URI that is the base of relative URIs in the data.

  • #meta readonly

    returns a Hash that represents header fields.

  • #metas readonly

    returns a Hash that represents header fields.

  • #status rw

    returns an Array that consists of status code and message.

Instance Method Summary

Class Method Details

.init(obj, src = nil)

[ GitHub ]

  
# File 'lib/open-uri.rb', line 428

def Meta.init(obj, src=nil) # :nodoc:
  obj.extend Meta
  obj.instance_eval {
    @base_uri = nil
    @meta = {} # name to string.  legacy.
    @metas = {} # name to array of strings.
  }
  if src
    obj.status = src.status
    obj.base_uri = src.base_uri
    src.metas.each {|name, values|
      obj.meta_add_field2(name, values)
    }
  end
end

Instance Attribute Details

#base_uri (rw)

returns a ::URI that is the base of relative URIs in the data. It may differ from the ::URI supplied by a user due to redirection.

[ GitHub ]

  
# File 'lib/open-uri.rb', line 449

attr_accessor :base_uri

#meta (readonly)

returns a Hash that represents header fields. The Hash keys are downcased for canonicalization. The Hash values are a field body. If there are multiple field with same field name, the field values are concatenated with a comma.

[ GitHub ]

  
# File 'lib/open-uri.rb', line 456

attr_reader :meta

#metas (readonly)

returns a Hash that represents header fields. The Hash keys are downcased for canonicalization. The Hash value are an array of field values.

[ GitHub ]

  
# File 'lib/open-uri.rb', line 461

attr_reader :metas

#status (rw)

returns an Array that consists of status code and message.

[ GitHub ]

  
# File 'lib/open-uri.rb', line 445

attr_accessor :status

Instance Method Details

#charset

returns a charset parameter in Content-Type field. It is downcased for canonicalization.

If charset parameter is not given but a block is given, the block is called and its result is returned. It can be used to guess charset.

If charset parameter and block is not given, nil is returned except text type in HTTP. In that case, “iso-8859-1” is returned as defined by RFC2616 3.7.1.

[ GitHub ]

  
# File 'lib/open-uri.rb', line 547

def charset
  type, *parameters = content_type_parse
  if pair = parameters.assoc('charset')
    pair.last.downcase
  elsif block_given?
    yield
  elsif type && %r{\Atext/} =~ type &&
        @base_uri && /\Ahttp\z/i =~ @base_uri.scheme
    "iso-8859-1" # RFC2616 3.7.1
  else
    nil
  end
end

#content_encoding

Returns a list of encodings in Content-Encoding field as an array of strings.

The encodings are downcased for canonicalization.

[ GitHub ]

  
# File 'lib/open-uri.rb', line 565

def content_encoding
  vs = @metas['content-encoding']
  if vs && %r{\A#{RE_LWS}?#{RE_TOKEN}#{RE_LWS}?(?:,#{RE_LWS}?#{RE_TOKEN}#{RE_LWS}?)*}o =~ (v = vs.join(', '))
    v.scan(RE_TOKEN).map {|content_coding| content_coding.downcase}
  else
    []
  end
end

#content_type

returns “type/subtype” which is MIME Content-Type. It is downcased for canonicalization. Content-Type parameters are stripped.

[ GitHub ]

  
# File 'lib/open-uri.rb', line 532

def content_type
  type, *_ = content_type_parse
  type || 'application/octet-stream'
end

#content_type_parse

[ GitHub ]

  
# File 'lib/open-uri.rb', line 510

def content_type_parse # :nodoc:
  vs = @metas['content-type']
  # The last (?:;#{RE_LWS}?)? matches extra ";" which violates RFC2045.
  if vs && %r{\A#{RE_LWS}?(#{RE_TOKEN})#{RE_LWS}?/(#{RE_TOKEN})#{RE_LWS}?(#{RE_PARAMETERS})(?:;#{RE_LWS}?)?\z}no =~ vs.join(', ')
    type = $1.downcase
    subtype = $2.downcase
    parameters = []
    $3.scan(/;#{RE_LWS}?(#{RE_TOKEN})#{RE_LWS}?=#{RE_LWS}?(?:(#{RE_TOKEN})|(#{RE_QUOTED_STRING}))/no) {|att, val, qval|
      if qval
        val = qval[1...-1].gsub(/[\r\n\t !#-\[\]-~\x80-\xff]+|(\\[\x00-\x7f])/n) { $1 ? $1[1,1] : $& }
      end
      parameters << [att.downcase, val]
    }
    ["#{type}/#{subtype}", *parameters]
  else
    nil
  end
end

#last_modified

returns a Time that represents the Last-Modified field.

[ GitHub ]

  
# File 'lib/open-uri.rb', line 494

def last_modified
  if vs = @metas['last-modified']
    v = vs.join(', ')
    Time.httpdate(v)
  else
    nil
  end
end

#meta_add_field(name, value)

[ GitHub ]

  
# File 'lib/open-uri.rb', line 489

def meta_add_field(name, value) # :nodoc:
  meta_add_field2(name, [value])
end

#meta_add_field2(name, values)

[ GitHub ]

  
# File 'lib/open-uri.rb', line 482

def meta_add_field2(name, values) # :nodoc:
  name = name.downcase
  @metas[name] = values
  @meta[name] = values.join(', ')
  meta_setup_encoding if name == 'content-type'
end

#meta_setup_encoding

[ GitHub ]

  
# File 'lib/open-uri.rb', line 463

def meta_setup_encoding # :nodoc:
  charset = self.charset
  enc = nil
  if charset
    begin
      enc = Encoding.find(charset)
    rescue ArgumentError
    end
  end
  enc = Encoding::ASCII_8BIT unless enc
  if self.respond_to? :force_encoding
    self.force_encoding(enc)
  elsif self.respond_to? :string
    self.string.force_encoding(enc)
  else # Tempfile
    self.set_encoding enc
  end
end