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, 'vary' => Header::Vary, # 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
Add the specified header key value pair.
- #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
-
#set(key, value) ⇒ Object
Set the specified header key to the specified value, replacing any existing header keys with the same name.
-
#to_h ⇒ Object
A hash table of ‘policy.map(values)`.
Constructor Details
#initialize(fields = nil, indexed = nil) ⇒ Headers
Returns a new instance of Headers.
41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/protocol/http/headers.rb', line 41 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.
65 66 67 |
# File 'lib/protocol/http/headers.rb', line 65 def fields @fields end |
Class Method Details
.[](hash) ⇒ Object
37 38 39 |
# File 'lib/protocol/http/headers.rb', line 37 def self.[] hash self.new(hash.to_a) end |
Instance Method Details
#==(other) ⇒ Object
235 236 237 238 239 240 241 242 243 244 |
# File 'lib/protocol/http/headers.rb', line 235 def == other case other when Hash to_h == other when Headers @fields == other.fields else @fields == other end end |
#[](key) ⇒ Object
218 219 220 |
# File 'lib/protocol/http/headers.rb', line 218 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.
139 140 141 142 143 144 145 |
# File 'lib/protocol/http/headers.rb', line 139 def []= key, value if @indexed merge_into(@indexed, key.downcase, value) end @fields << [key, value] end |
#add(key, value) ⇒ Object
Add the specified header key value pair.
111 112 113 |
# File 'lib/protocol/http/headers.rb', line 111 def add(key, value) self[key] = value end |
#clear ⇒ Object
59 60 61 62 |
# File 'lib/protocol/http/headers.rb', line 59 def clear @fields.clear @indexed = nil end |
#delete(key) ⇒ Object
Delete all headers with the given key, and return the merged value.
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 |
# File 'lib/protocol/http/headers.rb', line 181 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
55 56 57 |
# File 'lib/protocol/http/headers.rb', line 55 def dup self.class.new(@fields, @indexed) end |
#each(&block) ⇒ Object
83 84 85 |
# File 'lib/protocol/http/headers.rb', line 83 def each(&block) @fields.each(&block) end |
#empty? ⇒ Boolean
79 80 81 |
# File 'lib/protocol/http/headers.rb', line 79 def empty? @fields.empty? end |
#extract(keys) ⇒ Object Also known as: slice!
91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/protocol/http/headers.rb', line 91 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
67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/protocol/http/headers.rb', line 67 def freeze return if frozen? # Ensure @indexed is generated: self.to_h @fields.freeze @indexed.freeze super end |
#include?(key) ⇒ Boolean
87 88 89 |
# File 'lib/protocol/http/headers.rb', line 87 def include? key self[key] != nil end |
#inspect ⇒ Object
231 232 233 |
# File 'lib/protocol/http/headers.rb', line 231 def inspect "#<#{self.class} #{@fields.inspect}>" end |
#merge(headers) ⇒ Object
132 133 134 |
# File 'lib/protocol/http/headers.rb', line 132 def merge(headers) self.dup.merge!(headers) end |
#merge!(headers) ⇒ Object
124 125 126 127 128 129 130 |
# File 'lib/protocol/http/headers.rb', line 124 def merge!(headers) headers.each do |key, value| self[key] = value end return self end |
#set(key, value) ⇒ Object
Set the specified header key to the specified value, replacing any existing header keys with the same name.
118 119 120 121 122 |
# File 'lib/protocol/http/headers.rb', line 118 def set(key, value) # TODO This could be a bit more efficient: self.delete(key) self.add(key, value) end |
#to_h ⇒ Object
A hash table of ‘policy.map(values)`
223 224 225 226 227 228 229 |
# File 'lib/protocol/http/headers.rb', line 223 def to_h @indexed ||= @fields.inject({}) do |hash, (key, value)| merge_into(hash, key.downcase, value) hash end end |