class BraintreeHttp::HttpClient

Attributes

encoder[RW]
environment[RW]

Public Class Methods

new(environment) click to toggle source
# File lib/braintreehttp/http_client.rb, line 10
def initialize(environment)
  @environment = environment
  @injectors = []
  @encoder = Encoder.new
end

Public Instance Methods

_parse_response(response) click to toggle source
# File lib/braintreehttp/http_client.rb, line 64
def _parse_response(response)
  status_code = response.code.to_i

  result = response.body
  headers = response.to_hash
  if result && !result.empty?
    deserialized = @encoder.deserialize_response(response.body, headers)
    if deserialized.is_a?(String) || deserialized.is_a?(Array)
      result = deserialized
    else
      result = _parse_values(deserialized)
    end
  else
    result = nil
  end

  obj = OpenStruct.new({
    :status_code => status_code,
    :result => result,
    :headers => response.to_hash,
  })

  if status_code >= 200 and status_code < 300
    return obj
  elsif
    raise HttpError.new(obj.status_code, obj.result, obj.headers)
  end
end
_parse_values(values) click to toggle source
# File lib/braintreehttp/http_client.rb, line 93
def _parse_values(values)
  obj = nil

  if values.is_a?(Array)
    obj = []
    values.each do |v|
      obj << _parse_values(v)
    end
  elsif values.is_a?(Hash)
    obj = OpenStruct.new()
    values.each do |k, v|
      obj[k] = _parse_values(v)
    end
  else
    obj = values
  end

  obj
end
add_injector(&block) click to toggle source
# File lib/braintreehttp/http_client.rb, line 20
def add_injector(&block)
  @injectors << block
end
execute(req) click to toggle source
# File lib/braintreehttp/http_client.rb, line 28
def execute(req)
  headers = req.headers || {}

  request = OpenStruct.new({
    :verb => req.verb,
    :path => req.path,
    :headers => headers.clone,
    :body => req.body,
  })

  if !request.headers
    request.headers = {}
  end

  @injectors.each do |injector|
    injector.call(request)
  end

  if !request.headers["User-Agent"] || request.headers["User-Agent"] == "Ruby"
    request.headers["User-Agent"] = user_agent
  end

  body = nil
  if has_body(request)
    body = @encoder.serialize_request(request)
  end

  http_request = Net::HTTPGenericRequest.new(request.verb, body != nil, true, request.path, request.headers)
  http_request.body = body

  uri = URI(@environment.base_url)
  Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
    _parse_response(http.request(http_request))
  end
end
has_body(request) click to toggle source
# File lib/braintreehttp/http_client.rb, line 24
def has_body(request)
  request.respond_to?(:body) and request.body
end
user_agent() click to toggle source
# File lib/braintreehttp/http_client.rb, line 16
def user_agent
  "BraintreeHttp-Ruby HTTP/1.1"
end