Class: HTTP::Headers

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Enumerable
Defined in:
lib/http/headers.rb,
lib/http/headers/mixin.rb

Overview

HTTP Headers container.

Defined Under Namespace

Modules: Mixin

Constant Summary collapse

CANONICAL_HEADER =

Matches HTTP header names when in "Canonical-Http-Format"

/^[A-Z][a-z]*(-[A-Z][a-z]*)*$/
HEADER_NAME_RE =

Matches valid header field name according to RFC.

/^[A-Za-z0-9!#\$%&'*+\-.^_`|~]+$/
"Set-Cookie".freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeHeaders

Class constructor.



23
24
25
# File 'lib/http/headers.rb', line 23

def initialize
  @pile = []
end

Class Method Details

.coerce(object) ⇒ Headers Also known as: []

Coerces given object into Headers.

Parameters:

Returns:

Raises:

  • (Error)

    if object can't be coerced



173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/http/headers.rb', line 173

def coerce(object)
  unless object.is_a? self
    object = case
             when object.respond_to?(:to_hash) then object.to_hash
             when object.respond_to?(:to_h)    then object.to_h
             when object.respond_to?(:to_a)    then object.to_a
             else fail Error, "Can't coerce #{object.inspect} to Headers"
             end
  end

  headers = new
  object.each { |k, v| headers.add k, v }
  headers
end

Instance Method Details

#==(other) ⇒ Boolean

Compares headers to another Headers or Array of key/value pairs

Returns:

  • (Boolean)


114
115
116
117
# File 'lib/http/headers.rb', line 114

def ==(other)
  return false unless other.respond_to? :to_a
  @pile == other.to_a
end

#[](name) ⇒ nil, ...

Smart version of #get.

Returns:

  • (nil)

    if header was not set

  • (String)

    if header has exactly one value

  • (Array<String>)

    if header has more than one value



72
73
74
75
76
77
78
79
80
# File 'lib/http/headers.rb', line 72

def [](name)
  values = get(name)

  case values.count
  when 0 then nil
  when 1 then values.first
  else        values
  end
end

#add(name, value) ⇒ void Also known as: append

This method returns an undefined value.

Appends header.

Parameters:

  • name (#to_s)

    header name

  • value (Array<#to_s>, #to_s)

    header value(s) to be appended



51
52
53
54
# File 'lib/http/headers.rb', line 51

def add(name, value)
  name  = normalize_header name.to_s
  Array(value).each { |v| @pile << [name, v.to_s] }
end

#delete(name) ⇒ void

This method returns an undefined value.

Removes header.

Parameters:

  • name (#to_s)

    header name



41
42
43
44
# File 'lib/http/headers.rb', line 41

def delete(name)
  name = normalize_header name.to_s
  @pile.delete_if { |k, _| k == name }
end

#eachEnumerator, Headers

Calls the given block once for each key/value pair in headers container.

Returns:

  • (Enumerator)

    if no block given

  • (Headers)

    self-reference



123
124
125
126
127
# File 'lib/http/headers.rb', line 123

def each
  return to_enum(__method__) unless block_given?
  @pile.each { |arr| yield(arr) }
  self
end

#empty?Boolean

Returns true if self has no key/value pairs

Returns:

  • (Boolean)


133
# File 'lib/http/headers.rb', line 133

def_delegator :@pile, :empty?

#get(name) ⇒ Array<String>

Returns list of header values if any.

Returns:

  • (Array<String>)


62
63
64
65
# File 'lib/http/headers.rb', line 62

def get(name)
  name = normalize_header name.to_s
  @pile.select { |k, _| k == name }.map { |_, v| v }
end

#hashFixnum

Compute a hash-code for this headers container. Two conatiners with the same content will have the same hash code.



141
# File 'lib/http/headers.rb', line 141

def_delegator :@pile, :hash

#initialize_copy(orig) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Properly clones internal key/value storage.



146
147
148
149
# File 'lib/http/headers.rb', line 146

def initialize_copy(orig)
  super
  @pile = to_a
end

#inspectString

Returns human-readable representation of self instance.

Returns:

  • (String)


100
101
102
# File 'lib/http/headers.rb', line 100

def inspect
  "#<#{self.class} #{to_h.inspect}>"
end

#keysArray<String>

Returns list of header names.

Returns:

  • (Array<String>)


107
108
109
# File 'lib/http/headers.rb', line 107

def keys
  @pile.map { |k, _| k }.uniq
end

#merge(other) ⇒ Headers

Returns new instance with other headers merged in.

Returns:

See Also:



163
164
165
# File 'lib/http/headers.rb', line 163

def merge(other)
  dup.tap { |dupped| dupped.merge! other }
end

#merge!(other) ⇒ void

This method returns an undefined value.

Merges other headers into self.

See Also:



155
156
157
# File 'lib/http/headers.rb', line 155

def merge!(other)
  self.class.coerce(other).to_h.each { |name, values| set name, values }
end

#set(name, value) ⇒ void Also known as: []=

This method returns an undefined value.

Sets header.

Parameters:

  • name (#to_s)

    header name

  • value (Array<#to_s>, #to_s)

    header value(s) to be appended



31
32
33
34
# File 'lib/http/headers.rb', line 31

def set(name, value)
  delete(name)
  add(name, value)
end

#to_aArray<[String, String]>

Returns headers key/value pairs.

Returns:

  • (Array<[String, String]>)


93
94
95
# File 'lib/http/headers.rb', line 93

def to_a
  @pile.map { |pair| pair.map(&:dup) }
end

#to_hHash Also known as: to_hash

Returns Rack-compatible headers Hash

Returns:

  • (Hash)


85
86
87
# File 'lib/http/headers.rb', line 85

def to_h
  Hash[keys.map { |k| [k, self[k]] }]
end