class Hibp::Request

Hibp::Request

Used to make requests to the hibp API

@see https://haveibeenpwned.com/API/v3

Attributes

headers[R]

Public Class Methods

new(endpoint:, parser: Parsers::Json.new) click to toggle source

@param parser [Hibp::Parser] -

A tool to parse and convert data into appropriate models

@param endpoint [String] -

A specific API endpoint to call appropriate method
# File lib/hibp/request.rb, line 19
def initialize(endpoint:, parser: Parsers::Json.new)
  @endpoint = endpoint
  @parser = parser

  @headers = {
    'Content-Type' => 'application/json',
    'User-Agent' => "Ruby HIBP-Client #{Hibp::VERSION}"
  }
end

Public Instance Methods

get(params: nil, headers: nil) click to toggle source

Perform a GET request

@param params [Hash] -

Additional query params

@param headers [Hash] -

Additional HTTP headers

@raise [Hibp::ServiceError]

# File lib/hibp/request.rb, line 39
def get(params: nil, headers: nil)
  response = rest_client.get(@endpoint) do |request|
    configure_request(request: request, params: params, headers: headers)
  end

  @parser ? @parser.parse_response(response) : response.body
rescue Faraday::ResourceNotFound
  nil
rescue StandardError => e
  handle_error(e)
end

Private Instance Methods

configure_request(request: nil, params: nil, headers: nil, body: nil) click to toggle source
# File lib/hibp/request.rb, line 62
def configure_request(request: nil, params: nil, headers: nil, body: nil)
  return if request.nil?

  request.params.merge!(params) if params
  request.headers.merge!(headers) if headers
  request.body = body if body
end
handle_error(error) click to toggle source
# File lib/hibp/request.rb, line 70
def handle_error(error)
  error_params = parsable_error?(error) ? parse_error(error) : {}

  error_to_raise = ServiceError.new(error.message, error_params)

  raise error_to_raise
end
parsable_error?(error) click to toggle source
# File lib/hibp/request.rb, line 78
def parsable_error?(error)
  error.is_a?(Faraday::ClientError) && error.response
end
parse_error(error) click to toggle source
# File lib/hibp/request.rb, line 82
def parse_error(error)
  error_params = {
    status_code: error.response[:status],
    raw_body: error.response[:body]
  }

  begin
    parsed_response = Oj.load(error.response[:body], {})

    return error_params unless parsed_response

    error_params[:body] = parsed_response

    %w[title detail].each do |section|
      next if parsed_response[section].nil?

      error_params[section.to_sym] = parsed_response[section]
    end
  rescue Oj::ParseError
  end

  error_params
end
rest_client() click to toggle source
# File lib/hibp/request.rb, line 53
def rest_client
  Faraday.new do |faraday|
    faraday.headers = @headers

    faraday.response(:raise_error)
    faraday.adapter(Faraday.default_adapter)
  end
end