Class: HTTP::Headers
- Inherits:
-
Object
- Object
- HTTP::Headers
- Extended by:
- Forwardable
- Includes:
- Enumerable
- Defined in:
- lib/http/headers.rb,
lib/http/headers/mixin.rb
Overview
HTTP Headers container.
Defined Under Namespace
Modules: Mixin
Constant Summary collapse
- CANONICAL_HEADER =
Matches HTTP header names when in "Canonical-Http-Format"
/^[A-Z][a-z]*(-[A-Z][a-z]*)*$/
- HEADER_NAME_RE =
Matches valid header field name according to RFC.
/^[A-Za-z0-9!#\$%&'*+\-.^_`|~]+$/
Class Method Summary collapse
-
.coerce(object) ⇒ Headers
(also: [])
Coerces given
object
into Headers.
Instance Method Summary collapse
-
#==(other) ⇒ Boolean
Compares headers to another Headers or Array of key/value pairs.
-
#[](name) ⇒ nil, ...
Smart version of #get.
-
#add(name, value) ⇒ void
(also: #append)
Appends header.
-
#delete(name) ⇒ void
Removes header.
-
#each(&blk) ⇒ Enumerator, Headers
Calls the given block once for each key/value pair in headers container.
-
#empty? ⇒ Boolean
Returns
true
ifself
has no key/value pairs. -
#get(name) ⇒ Array<String>
Returns list of header values if any.
-
#hash ⇒ Fixnum
Compute a hash-code for this headers container.
-
#initialize ⇒ Headers
constructor
Class constructor.
-
#initialize_copy(orig) ⇒ Object
private
Properly clones internal key/value storage.
-
#inspect ⇒ String
Returns human-readable representation of
self
instance. -
#keys ⇒ Array<String>
Returns list of header names.
-
#merge(other) ⇒ Headers
Returns new instance with
other
headers merged in. -
#merge!(other) ⇒ void
Merges
other
headers intoself
. -
#set(name, value) ⇒ void
(also: #[]=)
Sets header.
-
#to_a ⇒ Array<[String, String]>
Returns headers key/value pairs.
-
#to_h ⇒ Hash
(also: #to_hash)
Returns Rack-compatible headers Hash.
Constructor Details
#initialize ⇒ Headers
Class constructor.
20 21 22 |
# File 'lib/http/headers.rb', line 20 def initialize @pile = [] end |
Class Method Details
.coerce(object) ⇒ Headers Also known as: []
Coerces given object
into Headers.
171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
# File 'lib/http/headers.rb', line 171 def coerce(object) unless object.is_a? self object = case when object.respond_to?(:to_hash) then object.to_hash when object.respond_to?(:to_h) then object.to_h when object.respond_to?(:to_a) then object.to_a else fail Error, "Can't coerce #{object.inspect} to Headers" end end headers = new object.each { |k, v| headers.add k, v } headers end |
Instance Method Details
#==(other) ⇒ Boolean
Compares headers to another Headers or Array of key/value pairs
111 112 113 114 |
# File 'lib/http/headers.rb', line 111 def ==(other) return false unless other.respond_to? :to_a @pile == other.to_a end |
#[](name) ⇒ nil, ...
Smart version of #get.
69 70 71 72 73 74 75 76 77 |
# File 'lib/http/headers.rb', line 69 def [](name) values = get(name) case values.count when 0 then nil when 1 then values.first else values end end |
#add(name, value) ⇒ void Also known as: append
This method returns an undefined value.
Appends header.
48 49 50 51 |
# File 'lib/http/headers.rb', line 48 def add(name, value) name = normalize_header name.to_s Array(value).each { |v| @pile << [name, v.to_s] } end |
#delete(name) ⇒ void
This method returns an undefined value.
Removes header.
38 39 40 41 |
# File 'lib/http/headers.rb', line 38 def delete(name) name = normalize_header name.to_s @pile.delete_if { |k, _| k == name } end |
#each(&blk) ⇒ Enumerator, Headers
Calls the given block once for each key/value pair in headers container.
120 121 122 123 124 125 |
# File 'lib/http/headers.rb', line 120 def each(&blk) return @pile.each unless blk @pile.each(&blk) self end |
#empty? ⇒ Boolean
Returns true
if self
has no key/value pairs
131 |
# File 'lib/http/headers.rb', line 131 def_delegator :@pile, :empty? |
#get(name) ⇒ Array<String>
Returns list of header values if any.
59 60 61 62 |
# File 'lib/http/headers.rb', line 59 def get(name) name = normalize_header name.to_s @pile.select { |k, _| k == name }.map { |_, v| v } end |
#hash ⇒ Fixnum
Compute a hash-code for this headers container. Two conatiners with the same content will have the same hash code.
139 |
# File 'lib/http/headers.rb', line 139 def_delegator :@pile, :hash |
#initialize_copy(orig) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Properly clones internal key/value storage.
144 145 146 147 |
# File 'lib/http/headers.rb', line 144 def initialize_copy(orig) super @pile = to_a end |
#inspect ⇒ String
Returns human-readable representation of self
instance.
97 98 99 |
# File 'lib/http/headers.rb', line 97 def inspect "#<#{self.class} #{to_h.inspect}>" end |
#keys ⇒ Array<String>
Returns list of header names.
104 105 106 |
# File 'lib/http/headers.rb', line 104 def keys @pile.map { |k, _| k }.uniq end |
#merge(other) ⇒ Headers
Returns new instance with other
headers merged in.
161 162 163 |
# File 'lib/http/headers.rb', line 161 def merge(other) dup.tap { |dupped| dupped.merge! other } end |
#merge!(other) ⇒ void
This method returns an undefined value.
Merges other
headers into self
.
153 154 155 |
# File 'lib/http/headers.rb', line 153 def merge!(other) self.class.coerce(other).to_h.each { |name, values| set name, values } end |
#set(name, value) ⇒ void Also known as: []=
This method returns an undefined value.
Sets header.
28 29 30 31 |
# File 'lib/http/headers.rb', line 28 def set(name, value) delete(name) add(name, value) end |
#to_a ⇒ Array<[String, String]>
Returns headers key/value pairs.
90 91 92 |
# File 'lib/http/headers.rb', line 90 def to_a @pile.map { |pair| pair.map(&:dup) } end |
#to_h ⇒ Hash Also known as: to_hash
Returns Rack-compatible headers Hash
82 83 84 |
# File 'lib/http/headers.rb', line 82 def to_h Hash[keys.map { |k| [k, self[k]] }] end |