class Kampainer::HttpRequest

Generic Net::HTTP wrapper that logs the request and response.

Attributes

headers[R]
logger[R]
request[R]
uri[R]

Public Class Methods

new(method, path, headers, logger) click to toggle source
# File lib/kampainer/http_request.rb, line 12
def initialize(method, path, headers, logger)
  @headers = headers
  @logger = logger
  @uri = URI(path)
  @request = Net::HTTP.const_get(method.capitalize).new(uri)
end

Public Instance Methods

fail_unless_expected_response(response, *allowed_responses) click to toggle source
# File lib/kampainer/http_request.rb, line 67
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) click to toggle source
# File lib/kampainer/http_request.rb, line 32
def https(uri)
  Net::HTTP.new(uri.host, uri.port).tap do |http|
    http.use_ssl = true
  end
end
log_request_response(data = nil) { || ... } click to toggle source

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

# File lib/kampainer/http_request.rb, line 42
def log_request_response(data = nil)
  logger.info "[#{self.class.name}] request = #{request.method} #{uri}"
  logger.info "[#{self.class.name}] headers = #{headers.inspect}"
  logger.info "[#{self.class.name}] data = #{data}"
  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) click to toggle source
# File lib/kampainer/http_request.rb, line 54
def ms(tms)
  (tms.real*1000).round(3)
end
send(action_name, data) click to toggle source

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

# File lib/kampainer/http_request.rb, line 22
def send(action_name, data)
  headers.each { |k, v| request[k] = v }
  request.body = data
  response = log_request_response(data) do
    https(uri).request(request)
  end
  fail_unless_expected_response response, Net::HTTPSuccess
  response.body
end