class Algorithmia::Requester

Public Class Methods

new(client) click to toggle source
# File lib/algorithmia/requester.rb, line 7
def initialize(client)
  self.class.base_uri client.api_address
  @client = client
  @default_headers = {
    'User-Agent' => 'Algorithmia Ruby Client'
  }
  unless @client.api_key.nil?
    @default_headers['Authorization'] = @client.api_key
  end
end

Public Instance Methods

delete(endpoint, query: {}) click to toggle source
# File lib/algorithmia/requester.rb, line 70
def delete(endpoint, query: {})
  response = self.class.delete(endpoint, query: query, headers: @default_headers)
  check_for_errors(response)
  response
end
get(endpoint, query: {}, headers: {}) click to toggle source
# File lib/algorithmia/requester.rb, line 18
def get(endpoint, query: {}, headers: {})
  headers = merge_headers(headers)
  headers.delete('Content-Type')   # No content, can break request parsing
  response = self.class.get(endpoint, query: query, headers: headers)
  check_for_errors(response)
  response
end
head(endpoint) click to toggle source
# File lib/algorithmia/requester.rb, line 62
def head(endpoint)
  headers = merge_headers({})
  headers.delete('Content-Type')   # No content, can break request parsing
  response = self.class.head(endpoint, headers: headers)
  check_for_errors(response)
  response
end
post(endpoint, body, query: {}, headers: {}, timeout: 60) click to toggle source
# File lib/algorithmia/requester.rb, line 26
def post(endpoint, body, query: {}, headers: {}, timeout: 60)
  headers = merge_headers(headers)

  headers['Content-Type'] ||= case
    when body.kind_of?(String) && body.encoding == Encoding::ASCII_8BIT
      'application/octet-stream'
    when body.kind_of?(String)
      'text/plain'
    else
      body = body.to_json
      'application/json'
  end

  response = self.class.post(endpoint, body: body, query: query, headers: headers, timeout: timeout)
  check_for_errors(response)
  response
end
put(endpoint, body, query: {}, headers: {}) click to toggle source
# File lib/algorithmia/requester.rb, line 44
def put(endpoint, body, query: {}, headers: {})
  headers = merge_headers(headers)

  headers['Content-Type'] ||= case
    when body.kind_of?(String) && body.encoding == Encoding::ASCII_8BIT
      'application/octet-stream'
    when body.kind_of?(String)
      'text/plain'
    else
      body = body.to_json
      'application/json'
  end

  response = self.class.put(endpoint, body: body, query: query, headers: headers)
  check_for_errors(response)
  response
end

Private Instance Methods

check_for_errors(response) click to toggle source
# File lib/algorithmia/requester.rb, line 78
def check_for_errors(response)
  if response.code >= 200 && response.code < 300
    if response.respond_to?(:has_key?) and response['error']
      error = response['error']
      raise Errors::AlgorithmError.new(error["message"], response, error["stacktrace"])
    end
    return
  end

  message = response.dig("error", "message") if response.is_a?(Hash)

  case response.code
  when 401
    message ||= "The request you are making requires authorization. Please check that you have permissions & that you've set your API key."
    raise Errors::UnauthorizedError.new(message, response)
  when 404
    message ||= "The URI requested is invalid or the resource requested does not exist."
    raise Errors::NotFoundError.new(message, response)
  when 500..599
    message ||= "Whoops! Something is broken."
    raise Errors::InternalServerError.new(message, response)
  else
    message ||= "#{response.code} - an unknown error occurred"
    raise Errors::ApiError.new(message, response)
  end
end
merge_headers(headers = {}) click to toggle source
# File lib/algorithmia/requester.rb, line 105
def merge_headers(headers = {})
  @default_headers.merge(headers)
end