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 438

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 459

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 466

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 471

attr_reader :metas

#status (rw)

returns an Array that consists of status code and message.

[ GitHub ]

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

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 that case, “utf-8” is returned as defined by RFC6838 4.2.1

[ GitHub ]

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

def charset
  type, *parameters = content_type_parse
  if pair = parameters.assoc('charset')
    pair.last.downcase
  elsif block_given?
    yield
  elsif type && %r{\Atext/} =~ type
    "utf-8" # RFC6838 4.2.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 574

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 542

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

#content_type_parse

[ GitHub ]

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

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 504

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 499

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 492

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 473

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