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 437

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 458

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 465

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 470

attr_reader :metas

#status (rw)

returns an Array that consists of status code and message.

[ GitHub ]

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

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 549

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 566

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 534

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 512

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 503

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 498

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 491

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 472

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