Class: HttpMimic::Headers

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/http_mimic/headers.rb

Overview

Case-insensitive HTTP Headers wrapper that preserves original casing

Instance Method Summary collapse

Constructor Details

#initialize(headers_hash = {}) ⇒ Headers

Returns a new instance of Headers.



8
9
10
11
12
13
14
15
16
# File 'lib/http_mimic/headers.rb', line 8

def initialize(headers_hash = {})
  @headers = {}
  @names = {}
  @multi_values = {}

  headers_hash.each do |key, val|
    self[key] = val
  end
end

Instance Method Details

#[](key) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/http_mimic/headers.rb', line 18

def [](key)
  return nil if key.nil?
  canonical = @names[normalize_key(key)]
  return nil unless canonical

  norm_key = normalize_key(key)
  if norm_key == 'set-cookie' && @multi_values.key?(norm_key)
    # For Set-Cookie, return an Array if multiple values exist
    @multi_values[norm_key].size > 1 ? @multi_values[norm_key] : @multi_values[norm_key].first
  else
    @headers[canonical]
  end
end

#[]=(key, value) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/http_mimic/headers.rb', line 32

def []=(key, value)
  return if key.nil?
  norm = normalize_key(key)
  if existing_key = @names[norm]
    @headers.delete(existing_key)
  end
  orig_key = key.to_s
  @names[norm] = orig_key
  @headers[orig_key] = value

  @multi_values[norm] = value.is_a?(Array) ? value.dup : [value]
end

#add(key, value) ⇒ Object

Add header (supports duplicate headers with the same name, e.g., multiple Set-Cookie entries)



46
47
48
49
50
51
52
53
54
55
56
# File 'lib/http_mimic/headers.rb', line 46

def add(key, value)
  return if key.nil?
  norm = normalize_key(key)
  orig_key = @names[norm] || key.to_s
  @names[norm] = orig_key

  @multi_values[norm] ||= []
  @multi_values[norm] << value

  @headers[orig_key] = value
end

#each(&block) ⇒ Object



70
71
72
# File 'lib/http_mimic/headers.rb', line 70

def each(&block)
  @headers.each(&block)
end

#get_all(key) ⇒ Object



58
59
60
61
# File 'lib/http_mimic/headers.rb', line 58

def get_all(key)
  return [] if key.nil?
  @multi_values[normalize_key(key)] || []
end

#inspectObject



87
88
89
# File 'lib/http_mimic/headers.rb', line 87

def inspect
  "#<#{self.class.name} #{@headers.inspect}>"
end

#key?(key) ⇒ Boolean Also known as: has_key?, include?

Returns:

  • (Boolean)


63
64
65
66
# File 'lib/http_mimic/headers.rb', line 63

def key?(key)
  return false if key.nil?
  @names.key?(normalize_key(key))
end

#keysObject



74
75
76
# File 'lib/http_mimic/headers.rb', line 74

def keys
  @headers.keys
end

#to_hObject Also known as: to_hash



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

def to_h
  @headers.dup
end

#to_sObject



91
92
93
# File 'lib/http_mimic/headers.rb', line 91

def to_s
  @headers.to_s
end

#valuesObject



78
79
80
# File 'lib/http_mimic/headers.rb', line 78

def values
  @headers.values
end