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.
85
86
87
|
# File 'lib/protocol/http/headers.rb', line 85
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
238
239
240
241
242
243
244
245
246
247
|
# File 'lib/protocol/http/headers.rb', line 238
def == other
case other
when Hash
to_h == other
when Headers
@fields == other.fields
else
@fields == other
end
end
|
#[](key) ⇒ Object
221
222
223
|
# File 'lib/protocol/http/headers.rb', line 221
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.
147
148
149
150
151
152
153
|
# File 'lib/protocol/http/headers.rb', line 147
def []= key, value
if @indexed
merge_into(@indexed, key.downcase, value)
end
@fields << [key, value]
end
|
#add(key, value) ⇒ Object
128
129
130
|
# File 'lib/protocol/http/headers.rb', line 128
def add(key, value)
self[key] = value
end
|
#clear ⇒ Object
79
80
81
82
|
# File 'lib/protocol/http/headers.rb', line 79
def clear
@fields.clear
@indexed = nil
end
|
#delete(key) ⇒ Object
Delete all headers with the given key, and return the merged value.
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
|
# File 'lib/protocol/http/headers.rb', line 184
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
103
104
105
|
# File 'lib/protocol/http/headers.rb', line 103
def each(&block)
@fields.each(&block)
end
|
#empty? ⇒ Boolean
99
100
101
|
# File 'lib/protocol/http/headers.rb', line 99
def empty?
@fields.empty?
end
|
111
112
113
114
115
116
117
118
119
120
121
122
123
|
# File 'lib/protocol/http/headers.rb', line 111
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
87
88
89
90
91
92
93
94
95
96
97
|
# File 'lib/protocol/http/headers.rb', line 87
def freeze
return if frozen?
self.to_h
@fields.freeze
@indexed.freeze
super
end
|
#include?(key) ⇒ Boolean
107
108
109
|
# File 'lib/protocol/http/headers.rb', line 107
def include? key
self[key] != nil
end
|
#inspect ⇒ Object
234
235
236
|
# File 'lib/protocol/http/headers.rb', line 234
def inspect
"#<#{self.class} #{@fields.inspect}>"
end
|
#merge(headers) ⇒ Object
140
141
142
|
# File 'lib/protocol/http/headers.rb', line 140
def merge()
self.dup.merge!()
end
|
#merge!(headers) ⇒ Object
132
133
134
135
136
137
138
|
# File 'lib/protocol/http/headers.rb', line 132
def merge!()
.each do |key, value|
self[key] = value
end
return self
end
|
#to_h ⇒ Object
A hash table of ‘policy.map(values)`
226
227
228
229
230
231
232
|
# File 'lib/protocol/http/headers.rb', line 226
def to_h
@indexed ||= @fields.inject({}) do |hash, (key, value)|
merge_into(hash, key.downcase, value)
hash
end
end
|