123456789_123456789_123456789_123456789_123456789_

Module: OpenURI::Meta

Relationships & Source Files
Defined in: lib/open-uri.rb

Overview

Mixin for holding meta-information.

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)

This method is for internal use only.
[ GitHub ]

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

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 448

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 455

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 460

attr_reader :metas

#status (rw)

returns an Array that consists of status code and message.

[ GitHub ]

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

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 539

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 556

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 524

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

#content_type_parse

This method is for internal use only.
[ GitHub ]

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

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 493

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

#meta_add_field(name, value)

This method is for internal use only.
[ GitHub ]

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

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

#meta_add_field2(name, values)

This method is for internal use only.
[ GitHub ]

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

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

This method is for internal use only.
[ GitHub ]

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

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