class AWS::Core::Http::HTTPartyHandler

Makes HTTP requests using HTTParty. This is the default handler, so you don't need to do anything special to configure it. However, you can directly instantiate this class in order to send extra options to HTTParty, for example to enable an HTTP proxy:

AWS.config(
  :http_handler => AWS::Http::HTTPartyHandler.new(
    :http_proxyaddr => "http://myproxy.com",
    :http_proxyport => 80
  )
)

Attributes

default_request_options[R]

@return [Hash] The default options to send to HTTParty on each

request.

Public Class Methods

new(options = {}) click to toggle source

Constructs a new HTTP handler using HTTParty.

@param [Hash] options Default options to send to HTTParty on

each request.  These options will be sent to +get+, +post+,
+head+, +put+, or +delete+ when a request is made.  Note
that +:body+, +:headers+, +:parser+, and +:ssl_ca_file+ are
ignored.  If you need to set the CA file, you should use the
+:ssl_ca_file+ option to {AWS.config} or
{Configuration} instead.
# File lib/aws/core/http/httparty_handler.rb, line 48
def initialize options = {}
  @default_request_options = options
end

Public Instance Methods

handle(request, response) click to toggle source
# File lib/aws/core/http/httparty_handler.rb, line 58
def handle(request, response)

  opts = default_request_options.merge({
    :body => request.body,
    :parser => NoOpParser
  })

  if request.proxy_uri
    opts[:http_proxyaddr] = request.proxy_uri.host
    opts[:http_proxyport] = request.proxy_uri.port
  end

  if request.use_ssl?
    protocol = 'https'
    opts[:ssl_ca_file] = request.ssl_ca_file if request.ssl_verify_peer?
  else
    protocol = 'http'
  end

  url = "#{protocol}://#{request.host}:#{request.port}#{request.uri}"

  # get, post, put, delete, head
  method = request.http_method.downcase

  # Net::HTTP adds this header for us when the body is
  # provided, but it messes up signing
  headers = { 'content-type' => '' }

  # headers must have string values (net http calls .strip on them)
  request.headers.each_pair do |key,value|
    headers[key] = value.to_s
  end

  opts[:headers] = headers

  begin
    http_response = self.class.send(method, url, opts)
    unless http_response.nil?
      response.body = http_response.body
      response.status = http_response.code.to_i
      response.headers = http_response.to_hash
    end
  rescue Timeout::Error, Errno::ETIMEDOUT => e
    response.timeout = true
  end
end