Class: Stripe::StripeResponseHeaders

Inherits:
Object
  • Object
show all
Defined in:
lib/stripe/stripe_response.rb

Overview

Headers provides an access wrapper to an API response’s header data. It mainly exists so that we don’t need to expose the entire ‘Net::HTTPResponse` object while still getting some of its benefits like case-insensitive access to header names and flattening of header values.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(hash) ⇒ StripeResponseHeaders

‘hash` is expected to be a hash mapping header names to arrays of header values. This is the default format generated by calling `#to_hash` on a `Net::HTTPResponse` object because headers can be repeated multiple times. Using `#[]` will collapse values down to just the first.



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/stripe/stripe_response.rb', line 19

def initialize(hash)
  if !hash.is_a?(Hash) ||
     !hash.keys.all? { |n| n.is_a?(String) } ||
     !hash.values.all? { |a| a.is_a?(Array) } ||
     !hash.values.all? { |a| a.all? { |v| v.is_a?(String) } }
    raise ArgumentError,
          "expect hash to be a map of string header names to arrays of " \
          "header values"
  end

  @hash = {}

  # This shouldn't be strictly necessary because `Net::HTTPResponse` will
  # produce a hash with all headers downcased, but do it anyway just in
  # case an object of this class was constructed manually.
  #
  # Also has the effect of duplicating the hash, which is desirable for a
  # little extra object safety.
  hash.each do |k, v|
    @hash[k.downcase] = v
  end
end

Class Method Details

.from_net_http(resp) ⇒ Object

Initializes a Headers object from a Net::HTTP::HTTPResponse object.



10
11
12
# File 'lib/stripe/stripe_response.rb', line 10

def self.from_net_http(resp)
  new(resp.to_hash)
end

Instance Method Details

#[](name) ⇒ Object



42
43
44
45
46
# File 'lib/stripe/stripe_response.rb', line 42

def [](name)
  values = @hash[name.downcase]
  warn("Duplicate header values for `#{name}`; returning only first") if values && values.count > 1
  values ? values.first : nil
end