module Totter::Transport::HTTP

Default HTTP API transport adapter

Private Instance Methods

boolean_from_response(*args) click to toggle source
# File lib/totter/transport/http.rb, line 107
def boolean_from_response(*args)
  response = request(*args)
  (200..299).include? response.code.to_i
end
build_request(method, uri) click to toggle source
# File lib/totter/transport/http.rb, line 53
def build_request(method, uri)
  case method
    when :get
      Net::HTTP::Get.new(uri.request_uri)
    when :post
      Net::HTTP::Post.new(uri.request_uri)
    when :put
      Net::HTTP::Put.new(uri.request_uri)
    when :delete
      Net::HTTP::Delete.new(uri.request_uri)
  end
end
can_post_data?(method) click to toggle source
# File lib/totter/transport/http.rb, line 112
def can_post_data?(method)
  [:post, :put].include?(method)
end
handle_error(response) click to toggle source
# File lib/totter/transport/http.rb, line 87
def handle_error(response)
  # Find error or return
  return unless error = Totter::ERROR_MAP[response.code.to_i]

  # Try to add a useful message
  message = nil
  begin
    message = MultiJson.load(response.body)['error_description']
  rescue MultiJson::DecodeError => e
  end

  # Raise error
  raise error.new(message)
end
http() click to toggle source
# File lib/totter/transport/http.rb, line 14
def http
  return @http if @http

  uri = URI.parse(self.base_url)
  @http = Net::HTTP.new(uri.host, uri.port)
  @http.use_ssl = self.ssl?
  @http
end
json_request(*args) click to toggle source
# File lib/totter/transport/http.rb, line 102
def json_request(*args)
  # Perform request, pass result format
  Response.new(request(*args), result_format)
end
param_for(key, value, parent = nil) click to toggle source
# File lib/totter/transport/http.rb, line 74
def param_for(key, value, parent = nil)
  if value.is_a?(Hash)
    params = []
    value.each_pair do |value_key, value_value|
      value_parent = parent ? parent + "[#{key}]" : key.to_s
      params << param_for(value_key, value_value, value_parent)
    end
    params
  else
    ["#{parent ? parent + "[#{key}]" : key.to_s}=#{CGI::escape(value.to_s)}"]
  end
end
request(method, path, params = nil) click to toggle source
# File lib/totter/transport/http.rb, line 23
def request(method, path, params = nil)
  uri = URI.parse("#{self.base_url}#{path}")

  # if the request requires parameters in the query string, merge them in
  if params and !can_post_data?(method)
    query_values = uri.query ? URI.decode_www_form(uri.query).inject({}) {|h,(k,v)| h[k]=v; h} : {}
    uri.query = to_url_params((query_values || {}).merge(params))
  end

  # Build request
  request = build_request(method, uri)

  # Add headers
  request['Authorization'] = "Bearer #{self.access_token}" if authenticated?
  request['X-Seesaw-Client-Token'] = @client_token if @client_token
  request['Content-Type'] = 'application/json'

  # Add params as JSON if they exist
  request.body = MultiJson.dump(params) if can_post_data?(method) and params

  # Request
  response = http.request(request)

  # Check for errors
  handle_error(response)

  # Return the raw response object
  response
end
to_url_params(hash) click to toggle source
# File lib/totter/transport/http.rb, line 66
def to_url_params(hash)
  params = []
  hash.each_pair do |key, value|
    params << param_for(key, value).flatten
  end
  params.sort.join('&')
end