class Iterable::Request

@!visibility private

Constants

DEFAULT_HEADERS
DEFAULT_OPTIONS

Public Class Methods

new(config, path, params = {}) click to toggle source
# File lib/iterable/request.rb, line 18
def initialize(config, path, params = {})
  @config = config
  @uri = build_uri(path, params)
  @net = net_http
  setup_http(@net)
end

Public Instance Methods

delete(body = {}, headers = {}) click to toggle source
# File lib/iterable/request.rb, line 41
def delete(body = {}, headers = {})
  execute :delete, body, headers
end
get(headers = {}) click to toggle source
# File lib/iterable/request.rb, line 25
def get(headers = {})
  execute :get, {}, headers
end
patch(body = {}, headers = {}) click to toggle source
# File lib/iterable/request.rb, line 37
def patch(body = {}, headers = {})
  execute :patch, body, headers
end
post(body = {}, headers = {}) click to toggle source
# File lib/iterable/request.rb, line 29
def post(body = {}, headers = {})
  execute :post, body, headers
end
put(body = {}, headers = {}) click to toggle source
# File lib/iterable/request.rb, line 33
def put(body = {}, headers = {})
  execute :put, body, headers
end

Private Instance Methods

build_uri(path, params = {}) click to toggle source
# File lib/iterable/request.rb, line 67
def build_uri(path, params = {})
  uri = @config.uri
  uri.path += path
  params['api_key'] = @config.token
  uri.query = URI.encode_www_form(params)
  uri
end
connection(verb, body = {}, headers = {}) click to toggle source
# File lib/iterable/request.rb, line 53
def connection(verb, body = {}, headers = {})
  conn_headers = DEFAULT_HEADERS.merge(headers)
  req = Net::HTTP.const_get(verb.to_s.capitalize, false).new(@uri, conn_headers)
  req.body = JSON.dump(body)
  req
end
execute(verb, body = {}, headers = {}) click to toggle source
# File lib/iterable/request.rb, line 47
def execute(verb, body = {}, headers = {})
  http = connection(verb, body, headers)
  setup_http(http)
  transmit http
end
handle_response(response) click to toggle source
# File lib/iterable/request.rb, line 87
def handle_response(response)
  redirected = response.is_a?(Net::HTTPRedirection) || response.code == '303'
  if redirected && response['location']
    Response.new Net::HTTP.get_response(uri_for_redirect(response))
  else
    Response.new response
  end
end
net_http() click to toggle source
# File lib/iterable/request.rb, line 75
def net_http
  Net::HTTP.new(@uri.hostname, @uri.port, nil, nil, nil, nil)
end
setup_http(http) click to toggle source
# File lib/iterable/request.rb, line 60
def setup_http(http)
  DEFAULT_OPTIONS.dup.each do |option, value|
    setter = "#{option.to_sym}="
    http.send(setter, value) if http.respond_to?(setter)
  end
end
transmit(req) click to toggle source
# File lib/iterable/request.rb, line 79
def transmit(req)
  response = nil
  @net.start do |http|
    response = http.request(req, nil, &:read_body)
  end
  handle_response response
end
uri_for_redirect(response) click to toggle source
# File lib/iterable/request.rb, line 96
def uri_for_redirect(response)
  uri = @config.uri
  redirect_uri = URI(response['location'])
  uri.path = redirect_uri.path
  uri.query = redirect_uri.query
  uri
end