Class: Protocol::HTTP::Headers
- Inherits:
-
Object
- Object
- Protocol::HTTP::Headers
show all
- 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, Multiple, Split
Constant Summary
collapse
- MERGE_POLICY =
{
'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' => Split,
'via' => Split,
'x-forwarded-for' => Split,
'set-cookie' => Multiple,
'www-authenticate' => Multiple,
'proxy-authenticate' => Multiple
}.tap{|hash| hash.default = Split}
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(fields = nil, indexed = nil) ⇒ Headers
Returns a new instance of Headers.
61
62
63
64
65
66
67
68
69
70
71
72
73
|
# File 'lib/protocol/http/headers.rb', line 61
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
An array of ‘[key, value]` pairs.
80
81
82
|
# File 'lib/protocol/http/headers.rb', line 80
def fields
@fields
end
|
Class Method Details
.[](hash) ⇒ Object
57
58
59
|
# File 'lib/protocol/http/headers.rb', line 57
def self.[] hash
self.new(hash.to_a)
end
|
Instance Method Details
#==(other) ⇒ Object
233
234
235
236
237
238
239
240
241
242
|
# File 'lib/protocol/http/headers.rb', line 233
def == other
case other
when Hash
to_h == other
when Headers
@fields == other.fields
else
@fields == other
end
end
|
#[](key) ⇒ Object
216
217
218
|
# File 'lib/protocol/http/headers.rb', line 216
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.
142
143
144
145
146
147
148
|
# File 'lib/protocol/http/headers.rb', line 142
def []= key, value
if @indexed
merge_into(@indexed, key.downcase, value)
end
@fields << [key, value]
end
|
#add(key, value) ⇒ Object
123
124
125
|
# File 'lib/protocol/http/headers.rb', line 123
def add(key, value)
self[key] = value
end
|
#delete(key) ⇒ Object
Delete all headers with the given key, and return the merged value.
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
|
# File 'lib/protocol/http/headers.rb', line 179
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
75
76
77
|
# File 'lib/protocol/http/headers.rb', line 75
def dup
self.class.new(@fields, @indexed)
end
|
#each(&block) ⇒ Object
98
99
100
|
# File 'lib/protocol/http/headers.rb', line 98
def each(&block)
@fields.each(&block)
end
|
#empty? ⇒ Boolean
94
95
96
|
# File 'lib/protocol/http/headers.rb', line 94
def empty?
@fields.empty?
end
|
106
107
108
109
110
111
112
113
114
115
116
117
118
|
# File 'lib/protocol/http/headers.rb', line 106
def (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
82
83
84
85
86
87
88
89
90
91
92
|
# File 'lib/protocol/http/headers.rb', line 82
def freeze
return if frozen?
self.to_h
@fields.freeze
@indexed.freeze
super
end
|
#include?(key) ⇒ Boolean
102
103
104
|
# File 'lib/protocol/http/headers.rb', line 102
def include? key
self[key] != nil
end
|
#inspect ⇒ Object
229
230
231
|
# File 'lib/protocol/http/headers.rb', line 229
def inspect
"#<#{self.class} #{@fields.inspect}>"
end
|
#merge(headers) ⇒ Object
135
136
137
|
# File 'lib/protocol/http/headers.rb', line 135
def merge()
self.dup.merge!()
end
|
#merge!(headers) ⇒ Object
127
128
129
130
131
132
133
|
# File 'lib/protocol/http/headers.rb', line 127
def merge!()
.each do |key, value|
self[key] = value
end
return self
end
|
#to_h ⇒ Object
A hash table of ‘policy.map(values)`
221
222
223
224
225
226
227
|
# File 'lib/protocol/http/headers.rb', line 221
def to_h
@indexed ||= @fields.inject({}) do |hash, (key, value)|
merge_into(hash, key.downcase, value)
hash
end
end
|