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!#\$%&'*+\-.^_`|~]+$/

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeHeaders

Class constructor.



20
21
22
# File 'lib/http/headers.rb', line 20

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



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

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)


111
112
113
114
# File 'lib/http/headers.rb', line 111

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



69
70
71
72
73
74
75
76
77
# File 'lib/http/headers.rb', line 69

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



48
49
50
51
# File 'lib/http/headers.rb', line 48

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



38
39
40
41
# File 'lib/http/headers.rb', line 38

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

#each(&blk) ⇒ Enumerator, Headers

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

Returns:

  • (Enumerator)

    if no block given

  • (Headers)

    self-reference



120
121
122
123
124
125
# File 'lib/http/headers.rb', line 120

def each(&blk)
  return @pile.each unless blk

  @pile.each(&blk)
  self
end

#empty?Boolean

Returns true if self has no key/value pairs

Returns:

  • (Boolean)


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

def_delegator :@pile, :empty?

#get(name) ⇒ Array<String>

Returns list of header values if any.

Returns:

  • (Array<String>)


59
60
61
62
# File 'lib/http/headers.rb', line 59

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.



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

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.



144
145
146
147
# File 'lib/http/headers.rb', line 144

def initialize_copy(orig)
  super
  @pile = to_a
end

#inspectString

Returns human-readable representation of self instance.

Returns:

  • (String)


97
98
99
# File 'lib/http/headers.rb', line 97

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

#keysArray<String>

Returns list of header names.

Returns:

  • (Array<String>)


104
105
106
# File 'lib/http/headers.rb', line 104

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

#merge(other) ⇒ Headers

Returns new instance with other headers merged in.

Returns:

See Also:



161
162
163
# File 'lib/http/headers.rb', line 161

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:



153
154
155
# File 'lib/http/headers.rb', line 153

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



28
29
30
31
# File 'lib/http/headers.rb', line 28

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

#to_aArray<[String, String]>

Returns headers key/value pairs.

Returns:

  • (Array<[String, String]>)


90
91
92
# File 'lib/http/headers.rb', line 90

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

#to_hHash Also known as: to_hash

Returns Rack-compatible headers Hash

Returns:

  • (Hash)


82
83
84
# File 'lib/http/headers.rb', line 82

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