class Http::Agent

Attributes

authorized[R]
logger[RW]
options[RW]

Public Class Methods

new(_options = {}) click to toggle source
# File lib/allegro/http.rb, line 8
def initialize(_options = {})
  @logger = Logger.new(STDOUT)
  @options = _options
end

Public Instance Methods

fetch(uri, params = {}) click to toggle source

TODO: split to more atomic methods fe: handle_error, prepare request, etc.

# File lib/allegro/http.rb, line 14
def fetch(uri, params = {})
  uri = URI(uri)
  body = []
  begin
    session = Net::HTTP.new(uri.host, uri.port)
    session.use_ssl = uri.scheme == 'https'
    response = session.start do |http|
      request = build_request(uri, params)
      begin
        http.request(request) do |resp|
          resp.read_body do |segment|
            body << segment
          end
        end
      rescue StandardError => e
        logger.error e.message
      ensure
        body = body.join('')
      end
    end
    case response
    when Net::HTTPSuccess
      body = parse_body(body, response.content_type)
    when Net::HTTPRedirection
      raise StandardError, response.message
    else
      body = parse_body(body, response.content_type)
      return body if body.is_a?(Hash)

      raise StandardError, response.message
    end
  rescue StandardError => e
    logger.error e.message
    body = []
    raise e
  end
  body
end

Protected Instance Methods

build_request(uri, params) click to toggle source
# File lib/allegro/http.rb, line 55
def build_request(uri, params)
  method = params[:method]
  request_params = params.reject { |k, _v| %i[method headers].include?(k) }
  headers = params[:headers]
  request = if method == :get
              uri.query = URI.encode_www_form(params)
              Net::HTTP::Get.new(uri.request_uri)
            elsif method == :post
              request = Net::HTTP::Post.new(uri.path)
              request.set_form_data(request_params)
              request
  end
  headers.each { |k, v| request[k.to_s] = v }
  request
end
json?(content_type) click to toggle source
# File lib/allegro/http.rb, line 75
def json?(content_type)
  !!content_type.match(%r{application/(vnd\.allegro\.public\.v\d+\+json|json)})
end
parse_body(body, content_type) click to toggle source
# File lib/allegro/http.rb, line 71
def parse_body(body, content_type)
  json?(content_type) ? JSON.parse(body) : body
end