Class: AmexTokenizationClient::Request

Inherits:
Object
  • Object
show all
Defined in:
lib/amex_tokenization_client/request.rb

Defined Under Namespace

Classes: UnexpectedHttpResponse

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(method, path, headers, logger:) ⇒ Request

Returns a new instance of Request.



10
11
12
13
14
15
16
# File 'lib/amex_tokenization_client/request.rb', line 10

def initialize(method, path, headers, logger:)
  @logger = logger
  @uri = URI(path)
  @request = Net::HTTP.const_get(method.capitalize).new(uri)
  @headers = headers
  headers.each_pair { |k, v| request[k] = v }
end

Instance Attribute Details

#headersObject (readonly)

Returns the value of attribute headers.



7
8
9
# File 'lib/amex_tokenization_client/request.rb', line 7

def headers
  @headers
end

#loggerObject (readonly)

Returns the value of attribute logger.



8
9
10
# File 'lib/amex_tokenization_client/request.rb', line 8

def logger
  @logger
end

#requestObject (readonly)

Returns the value of attribute request.



6
7
8
# File 'lib/amex_tokenization_client/request.rb', line 6

def request
  @request
end

#uriObject (readonly)

Returns the value of attribute uri.



6
7
8
# File 'lib/amex_tokenization_client/request.rb', line 6

def uri
  @uri
end

Instance Method Details

#fail_unless_expected_response(response, *allowed_responses) ⇒ Object



64
65
66
67
68
69
70
# File 'lib/amex_tokenization_client/request.rb', line 64

def fail_unless_expected_response(response, *allowed_responses)
  unless allowed_responses.any? { |allowed| response.is_a?(allowed) }
    logger.error "#{response.inspect}: #{response.body}"
    raise UnexpectedHttpResponse, response
  end
  response
end

#https(uri) ⇒ Object



30
31
32
33
34
# File 'lib/amex_tokenization_client/request.rb', line 30

def https(uri)
  Net::HTTP.new(uri.host, uri.port).tap do |http|
    http.use_ssl = true
  end
end

#log_request_response(data = nil) ⇒ Object

Log URI, method, data Start timer. Yield URI, method, data. Log response and time taken.



40
41
42
43
44
45
46
47
48
49
# File 'lib/amex_tokenization_client/request.rb', line 40

def log_request_response(data = nil)
  logger.info "[#{self.class.name}] request = #{request.method} #{uri}#{data ? '?' + data : ''}"
  logger.info "[#{self.class.name}] request_id = #{headers['x-amex-request-id']}"
  response = nil
  tms = Benchmark.measure do
    response = yield
  end
  logger.info("[#{self.class.name}] response (#{ms(tms)}ms): #{response.inspect} #{response.body}")
  response
end

#ms(tms) ⇒ Object



51
52
53
# File 'lib/amex_tokenization_client/request.rb', line 51

def ms(tms)
  (tms.real*1000).round(3)
end

#send(data = nil) ⇒ Object

Create HTTP request with provided headers. Invoke request over HTTPS. Return response on success or log failure and throw error.



21
22
23
24
25
26
27
28
# File 'lib/amex_tokenization_client/request.rb', line 21

def send(data = nil)
  request.body = data if data
  response = log_request_response(data) do
    https(uri).request(request)
  end
  fail_unless_expected_response response, Net::HTTPSuccess
  response.body
end