class Puzzle::Request

Public Class Methods

delete(path, options = {}) click to toggle source
# File lib/puzzle/request.rb, line 10
def self.delete(path, options = {})
  options[:token] ||= Puzzle.configuration.token

  response = request.delete(uri(path, options))
  response.code.to_i == 200
end
get(path, options = {}) click to toggle source
# File lib/puzzle/request.rb, line 17
def self.get(path, options = {})
  token = Puzzle.configuration.token
  format = Puzzle.configuration.format

  unless token.nil?
    options[:token] ||= token
  end

  response = request.get(uri(path, options))

  case response.code.to_i
  when 200
    case format
    when "json"
      JSON.parse(response.body)
    when "xml"
      # TODO: Support XML format
    end
  else
    handle_error(response.body, format)
  end
end
handle_error(error_body, format = "json") click to toggle source
# File lib/puzzle/request.rb, line 64
def self.handle_error(error_body, format = "json")
  error = parse_error(error_body, format)
  case error.http_status_code
  when 400
    raise Puzzle::Exception::ParamError, error.message
  when 403
    case error.code
    when Puzzle::ErrorCode::LOGIN_FAIL
      raise Puzzle::Exception::LoginFail, error.message
    when Puzzle::ErrorCode::TOKEN_FAIL
      raise Puzzle::Exception::TokenFail, error.message
    end
  when 404
    raise Puzzle::Exception::ContactNotExist, error.message
  when 405
    case error.code
    when Puzzle::ErrorCode::CONTACT_NOT_OWNED
      raise Puzzle::Exception::ContactNotOwned, error.message
    when Puzzle::ErrorCode::PURCHASE_LOW_POINTS
      raise Puzzle::Exception::PurchaseLowPoints, error.message
    end
  when 500
    case error.code
    when Puzzle::ErrorCode::SEARCH_ERROR
      raise Puzzle::Exception::SearchError, error.message
    when Puzzle::ErrorCode::SYS_ERROR
      raise Puzzle::Exception::SysError, error.message
    end
  when 501
    raise Puzzle::Exception::NotImplemented, error.message
  when 503
    raise Puzzle::Exception::NotAvailable, error.message
  else
    raise StandardError, "Unknown Error"
  end
end
hash_to_query_string(hash) click to toggle source
# File lib/puzzle/request.rb, line 54
def self.hash_to_query_string(hash)
  hash.sort_by { |key, value|
    key.to_s
  }.delete_if { |key, value|
    value.to_s.empty?
  }.collect { |key, value|
    "#{CGI.escape(key.to_s).gsub(/%(5B|5D)/n) { [$1].pack("H*") }}=#{CGI.escape(value.to_s)}"
  }.join("&")
end
parse_error(error_data, format = "json") click to toggle source
# File lib/puzzle/request.rb, line 101
def self.parse_error(error_data, format = "json")
  error = nil
  case format
  when "json"
    parsed_error = JSON.parse(error_data)
    if parsed_error && parsed_error.length > 0
      error = Error.new(parsed_error[0])
    end
  when "xml"
    # TODO: Add xml support
  end
  error
end
request() click to toggle source
# File lib/puzzle/request.rb, line 40
def self.request
  http = Net::HTTP.new(Puzzle.configuration.host, Puzzle.configuration.port)
  http.verify_mode = Puzzle.configuration.verify_mode
  http.ca_path = Puzzle.configuration.ca_path
  http.ca_file = Puzzle.configuration.ca_file
  http.use_ssl = true
  http
end
uri(path, options = {}) click to toggle source
# File lib/puzzle/request.rb, line 49
def self.uri(path, options = {})
  format = Puzzle.configuration.format
  "/rest#{path}.#{format}?#{hash_to_query_string(options)}"
end