Class: Protocol::HTTP::Headers
- Inherits:
-
Object
- Object
- Protocol::HTTP::Headers
- Defined in:
- lib/protocol/http/headers.rb
Overview
Headers are an array of key-value pairs. Some header keys represent multiple values.
Defined Under Namespace
Classes: Merged
Constant Summary collapse
- Split =
Header::Split
- Multiple =
Header::Multiple
- MERGE_POLICY =
{ # Headers which may only be specified once. 'content-type' => false, 'content-disposition' => false, 'content-length' => false, 'user-agent' => false, 'referer' => false, 'host' => false, 'authorization' => false, 'proxy-authorization' => false, 'if-modified-since' => false, 'if-unmodified-since' => false, 'from' => false, 'location' => false, 'max-forwards' => false, 'connection' => Header::Connection, 'cache-control' => Header::CacheControl, # Headers specifically for proxies: 'via' => Split, 'x-forwarded-for' => Split, # Headers which may be specified multiple times, but which can't be concatenated: 'www-authenticate' => Multiple, 'proxy-authenticate' => Multiple, # Custom headers: 'set-cookie' => Header::SetCookie, 'cookie' => Header::Cookie, }.tap{|hash| hash.default = Split}
Instance Attribute Summary collapse
-
#fields ⇒ Object
readonly
An array of ‘[key, value]` pairs.
Class Method Summary collapse
Instance Method Summary collapse
- #==(other) ⇒ Object
- #[](key) ⇒ Object
-
#[]=(key, value) ⇒ Object
Append the value to the given key.
- #add(key, value) ⇒ Object
- #clear ⇒ Object
-
#delete(key) ⇒ Object
Delete all headers with the given key, and return the merged value.
- #dup ⇒ Object
- #each(&block) ⇒ Object
- #empty? ⇒ Boolean
- #extract(keys) ⇒ Object (also: #slice!)
- #freeze ⇒ Object
- #include?(key) ⇒ Boolean
-
#initialize(fields = nil, indexed = nil) ⇒ Headers
constructor
A new instance of Headers.
- #inspect ⇒ Object
- #merge(headers) ⇒ Object
- #merge!(headers) ⇒ Object
-
#to_h ⇒ Object
A hash table of ‘policy.map(values)`.
Constructor Details
#initialize(fields = nil, indexed = nil) ⇒ Headers
Returns a new instance of Headers.
40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/protocol/http/headers.rb', line 40 def initialize(fields = nil, indexed = nil) if fields @fields = fields.dup else @fields = [] end if indexed @indexed = indexed.dup else @indexed = nil end end |
Instance Attribute Details
#fields ⇒ Object (readonly)
An array of ‘[key, value]` pairs.
64 65 66 |
# File 'lib/protocol/http/headers.rb', line 64 def fields @fields end |
Class Method Details
.[](hash) ⇒ Object
36 37 38 |
# File 'lib/protocol/http/headers.rb', line 36 def self.[] hash self.new(hash.to_a) end |
Instance Method Details
#==(other) ⇒ Object
221 222 223 224 225 226 227 228 229 230 |
# File 'lib/protocol/http/headers.rb', line 221 def == other case other when Hash to_h == other when Headers @fields == other.fields else @fields == other end end |
#[](key) ⇒ Object
204 205 206 |
# File 'lib/protocol/http/headers.rb', line 204 def [] key to_h[key] end |
#[]=(key, value) ⇒ Object
Append the value to the given key. Some values can be appended multiple times, others can only be set once.
126 127 128 129 130 131 132 |
# File 'lib/protocol/http/headers.rb', line 126 def []= key, value if @indexed merge_into(@indexed, key.downcase, value) end @fields << [key, value] end |
#add(key, value) ⇒ Object
107 108 109 |
# File 'lib/protocol/http/headers.rb', line 107 def add(key, value) self[key] = value end |
#clear ⇒ Object
58 59 60 61 |
# File 'lib/protocol/http/headers.rb', line 58 def clear @fields.clear @indexed = nil end |
#delete(key) ⇒ Object
Delete all headers with the given key, and return the merged value.
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
# File 'lib/protocol/http/headers.rb', line 167 def delete(key) deleted, @fields = @fields.partition do |field| field.first.downcase == key end if deleted.empty? return nil end if @indexed return @indexed.delete(key) elsif policy = MERGE_POLICY[key] (key, value), *tail = deleted merged = policy.new(value) tail.each{|k,v| merged << v} return merged else key, value = deleted.last return value end end |
#dup ⇒ Object
54 55 56 |
# File 'lib/protocol/http/headers.rb', line 54 def dup self.class.new(@fields, @indexed) end |
#each(&block) ⇒ Object
82 83 84 |
# File 'lib/protocol/http/headers.rb', line 82 def each(&block) @fields.each(&block) end |
#empty? ⇒ Boolean
78 79 80 |
# File 'lib/protocol/http/headers.rb', line 78 def empty? @fields.empty? end |
#extract(keys) ⇒ Object Also known as: slice!
90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/protocol/http/headers.rb', line 90 def extract(keys) deleted, @fields = @fields.partition do |field| keys.include?(field.first.downcase) end if @indexed keys.each do |key| @indexed.delete(key) end end return deleted end |
#freeze ⇒ Object
66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/protocol/http/headers.rb', line 66 def freeze return if frozen? # Ensure @indexed is generated: self.to_h @fields.freeze @indexed.freeze super end |
#include?(key) ⇒ Boolean
86 87 88 |
# File 'lib/protocol/http/headers.rb', line 86 def include? key self[key] != nil end |
#inspect ⇒ Object
217 218 219 |
# File 'lib/protocol/http/headers.rb', line 217 def inspect "#<#{self.class} #{@fields.inspect}>" end |
#merge(headers) ⇒ Object
119 120 121 |
# File 'lib/protocol/http/headers.rb', line 119 def merge(headers) self.dup.merge!(headers) end |
#merge!(headers) ⇒ Object
111 112 113 114 115 116 117 |
# File 'lib/protocol/http/headers.rb', line 111 def merge!(headers) headers.each do |key, value| self[key] = value end return self end |
#to_h ⇒ Object
A hash table of ‘policy.map(values)`
209 210 211 212 213 214 215 |
# File 'lib/protocol/http/headers.rb', line 209 def to_h @indexed ||= @fields.inject({}) do |hash, (key, value)| merge_into(hash, key.downcase, value) hash end end |