Module: OpenURI::Meta
- Defined in:
- lib/open-uri.rb
Overview
Mixin for holding meta-information.
Instance Attribute Summary collapse
-
#base_uri ⇒ Object
returns a URI that is the base of relative URIs in the data.
-
#meta ⇒ Object
readonly
returns a Hash that represents header fields.
-
#metas ⇒ Object
readonly
returns a Hash that represents header fields.
-
#status ⇒ Object
returns an Array that consists of status code and message.
Class Method Summary collapse
-
.init(obj, src = nil) ⇒ Object
:nodoc:.
Instance Method Summary collapse
-
#charset ⇒ Object
returns a charset parameter in Content-Type field.
-
#content_encoding ⇒ Object
Returns a list of encodings in Content-Encoding field as an array of strings.
-
#content_type ⇒ Object
returns “type/subtype” which is MIME Content-Type.
-
#content_type_parse ⇒ Object
:nodoc:.
-
#last_modified ⇒ Object
returns a Time that represents the Last-Modified field.
-
#meta_add_field(name, value) ⇒ Object
:nodoc:.
-
#meta_add_field2(name, values) ⇒ Object
:nodoc:.
-
#meta_setup_encoding ⇒ Object
:nodoc:.
Instance Attribute Details
#base_uri ⇒ Object
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.
475 476 477 |
# File 'lib/open-uri.rb', line 475 def base_uri @base_uri end |
#meta ⇒ Object (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.
482 483 484 |
# File 'lib/open-uri.rb', line 482 def @meta end |
#metas ⇒ Object (readonly)
returns a Hash that represents header fields. The Hash keys are downcased for canonicalization. The Hash value are an array of field values.
487 488 489 |
# File 'lib/open-uri.rb', line 487 def @metas end |
#status ⇒ Object
returns an Array that consists of status code and message.
471 472 473 |
# File 'lib/open-uri.rb', line 471 def status @status end |
Class Method Details
.init(obj, src = nil) ⇒ Object
:nodoc:
454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 |
# File 'lib/open-uri.rb', line 454 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..each {|name, values| obj.(name, values) } end end |
Instance Method Details
#charset ⇒ Object
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
566 567 568 569 570 571 572 573 574 575 576 577 |
# File 'lib/open-uri.rb', line 566 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 ⇒ Object
Returns a list of encodings in Content-Encoding field as an array of strings.
The encodings are downcased for canonicalization.
583 584 585 586 587 588 589 590 |
# File 'lib/open-uri.rb', line 583 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 ⇒ Object
returns “type/subtype” which is MIME Content-Type. It is downcased for canonicalization. Content-Type parameters are stripped.
551 552 553 554 |
# File 'lib/open-uri.rb', line 551 def content_type type, *_ = content_type_parse type || 'application/octet-stream' end |
#content_type_parse ⇒ Object
:nodoc:
529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 |
# File 'lib/open-uri.rb', line 529 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 ⇒ Object
returns a Time that represents the Last-Modified field.
520 521 522 523 524 525 526 527 |
# File 'lib/open-uri.rb', line 520 def last_modified if vs = @metas['last-modified'] v = vs.join(', ') Time.httpdate(v) else nil end end |
#meta_add_field(name, value) ⇒ Object
:nodoc:
515 516 517 |
# File 'lib/open-uri.rb', line 515 def (name, value) # :nodoc: (name, [value]) end |
#meta_add_field2(name, values) ⇒ Object
:nodoc:
508 509 510 511 512 513 |
# File 'lib/open-uri.rb', line 508 def (name, values) # :nodoc: name = name.downcase @metas[name] = values @meta[name] = values.join(', ') if name == 'content-type' end |
#meta_setup_encoding ⇒ Object
:nodoc:
489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 |
# File 'lib/open-uri.rb', line 489 def # :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 |