class HTTPI::Adapter::HTTP

HTTPI::Adapter::HTTP

Adapter for the http.rb client. github.com/httprb/http.rb

Attributes

client[R]

Public Class Methods

new(request) click to toggle source
# File lib/httpi/adapter/http.rb, line 15
def initialize(request)
  if request.auth.digest?
    raise NotSupportedError, "http.rb does not support HTTP digest authentication"
  end
  if request.auth.ntlm?
    raise NotSupportedError, "http.rb does not support NTLM digest authentication"
  end

  @request = request
  @client = create_client
end

Public Instance Methods

request(method) click to toggle source

Executes arbitrary HTTP requests. @see HTTPI.request

# File lib/httpi/adapter/http.rb, line 31
def request(method)
  unless ::HTTP::Request::METHODS.include? method
    raise NotSupportedError, "http.rb does not support custom HTTP methods"
  end
  response = begin
    @client.send(method, @request.url, :body => @request.body)
  rescue OpenSSL::SSL::SSLError
    raise SSLError
  end

  Response.new(response.code, response.headers.to_h, response.body.to_s)
end

Private Instance Methods

create_client() click to toggle source
# File lib/httpi/adapter/http.rb, line 46
def create_client
  if @request.ssl?
    context = OpenSSL::SSL::SSLContext.new

    context.options = OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:options]

    if @request.auth.ssl.ca_cert_file != nil
      context.ca_file = @request.auth.ssl.ca_cert_file
    else
      context.cert_store = OpenSSL::SSL::SSLContext::DEFAULT_CERT_STORE
    end

    context.cert        = @request.auth.ssl.cert
    context.key         = @request.auth.ssl.cert_key
    context.ssl_version = @request.auth.ssl.ssl_version if @request.auth.ssl.ssl_version != nil
    context.min_version = @request.auth.ssl.min_version if @request.auth.ssl.min_version != nil
    context.max_version = @request.auth.ssl.max_version if @request.auth.ssl.max_version != nil
    context.verify_mode = @request.auth.ssl.openssl_verify_mode
    context.ciphers     = @request.auth.ssl.ciphers if @request.auth.ssl.ciphers

    client = ::HTTP::Client.new(:ssl_context => context)
  else
    client = ::HTTP
  end

  if @request.auth.basic?
    client = client.basic_auth(:user => @request.auth.credentials[0], :pass => @request.auth.credentials[1])
  end

  if @request.proxy != nil
    client = client.via(@request.proxy.host, @request.proxy.port, @request.proxy.user, @request.proxy.password)
  end

  timeouts = {}
  timeouts[:connect] = @request.open_timeout if @request.open_timeout
  timeouts[:read] = @request.read_timeout if @request.read_timeout
  timeouts[:write] = @request.write_timeout if @request.write_timeout
  client = client.timeout(timeouts) if timeouts.any?

  client.headers(@request.headers)
end