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, # Cache validations: 'if-match' => Header::ETags, 'if-none-match' => Header::ETags, # 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.
42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/protocol/http/headers.rb', line 42 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.
66 67 68 |
# File 'lib/protocol/http/headers.rb', line 66 def fields @fields end |
Class Method Details
.[](hash) ⇒ Object
38 39 40 |
# File 'lib/protocol/http/headers.rb', line 38 def self.[] hash self.new(hash.to_a) end |
Instance Method Details
#==(other) ⇒ Object
240 241 242 243 244 245 246 247 248 249 |
# File 'lib/protocol/http/headers.rb', line 240 def == other case other when Hash to_h == other when Headers @fields == other.fields else @fields == other end end |
#[](key) ⇒ Object
223 224 225 |
# File 'lib/protocol/http/headers.rb', line 223 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.
140 141 142 143 144 145 146 |
# File 'lib/protocol/http/headers.rb', line 140 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.
112 113 114 |
# File 'lib/protocol/http/headers.rb', line 112 def add(key, value) self[key] = value end |
#clear ⇒ Object
60 61 62 63 |
# File 'lib/protocol/http/headers.rb', line 60 def clear @fields.clear @indexed = nil end |
#delete(key) ⇒ Object
Delete all headers with the given key, and return the merged value.
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 |
# File 'lib/protocol/http/headers.rb', line 186 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
56 57 58 |
# File 'lib/protocol/http/headers.rb', line 56 def dup self.class.new(@fields, @indexed) end |
#each(&block) ⇒ Object
84 85 86 |
# File 'lib/protocol/http/headers.rb', line 84 def each(&block) @fields.each(&block) end |
#empty? ⇒ Boolean
80 81 82 |
# File 'lib/protocol/http/headers.rb', line 80 def empty? @fields.empty? end |
#extract(keys) ⇒ Object Also known as: slice!
92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/protocol/http/headers.rb', line 92 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
68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/protocol/http/headers.rb', line 68 def freeze return if frozen? # Ensure @indexed is generated: self.to_h @fields.freeze @indexed.freeze super end |
#include?(key) ⇒ Boolean
88 89 90 |
# File 'lib/protocol/http/headers.rb', line 88 def include? key self[key] != nil end |
#inspect ⇒ Object
236 237 238 |
# File 'lib/protocol/http/headers.rb', line 236 def inspect "#<#{self.class} #{@fields.inspect}>" end |
#merge(headers) ⇒ Object
133 134 135 |
# File 'lib/protocol/http/headers.rb', line 133 def merge(headers) self.dup.merge!(headers) end |
#merge!(headers) ⇒ Object
125 126 127 128 129 130 131 |
# File 'lib/protocol/http/headers.rb', line 125 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.
119 120 121 122 123 |
# File 'lib/protocol/http/headers.rb', line 119 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)`
228 229 230 231 232 233 234 |
# File 'lib/protocol/http/headers.rb', line 228 def to_h @indexed ||= @fields.inject({}) do |hash, (key, value)| merge_into(hash, key.downcase, value) hash end end |