class Elasticsearch::Transport::Transport::HTTP::Curb

Alternative HTTP transport implementation, using the [Curb](rubygems.org/gems/curb) client.

@see Transport::Base

Public Instance Methods

__build_connection(host, options={}, block=nil) click to toggle source

Builds and returns a connection

@return [Connections::Connection]

# File lib/elasticsearch/transport/transport/http/curb.rb, line 84
def __build_connection(host, options={}, block=nil)
  client = ::Curl::Easy.new
  apply_headers(client, options)
  client.url = __full_url(host)

  if host[:user]
    client.http_auth_types = host[:auth_type] || :basic
    client.username = host[:user]
    client.password = host[:password]
  end

  client.instance_eval(&block) if block

  Connections::Connection.new :host => host, :connection => client
end
headers(connection) click to toggle source
# File lib/elasticsearch/transport/transport/http/curb.rb, line 66
def headers(connection)
  headers_string = connection.connection.header_str
  return nil if headers_string.nil?

  response_headers = headers_string&.split(/\\r\\n|\r\n/).reject(&:empty?)
  response_headers.shift # Removes HTTP status string
  processed_header = response_headers.flat_map { |s| s.scan(/^(\S+): (.+)/) }
  headers_hash = Hash[processed_header].transform_keys(&:downcase)
  if headers_hash['content-type']&.match?(/application\/json/)
    headers_hash['content-type'] = 'application/json'
  end
  headers_hash
end
host_unreachable_exceptions() click to toggle source

Returns an array of implementation specific connection errors.

@return [Array]

# File lib/elasticsearch/transport/transport/http/curb.rb, line 104
def host_unreachable_exceptions
  [
    ::Curl::Err::HostResolutionError,
    ::Curl::Err::ConnectionFailedError,
    ::Curl::Err::GotNothingError,
    ::Curl::Err::RecvError,
    ::Curl::Err::SendError,
    ::Curl::Err::TimeoutError
  ]
end
perform_request(method, path, params={}, body=nil, headers=nil, opts={}) click to toggle source

Performs the request by invoking {Transport::Base#perform_request} with a block.

@return [Response] @see Transport::Base#perform_request

# File lib/elasticsearch/transport/transport/http/curb.rb, line 35
def perform_request(method, path, params={}, body=nil, headers=nil, opts={})
  super do |connection, url|
    connection.connection.url = connection.full_url(path, params)

    case method
    when 'HEAD'
      connection.connection.set :nobody, true
    when 'GET', 'POST', 'PUT', 'DELETE'
      connection.connection.set :nobody, false
      connection.connection.put_data = __convert_to_json(body) if body
      if headers
        if connection.connection.headers
          connection.connection.headers.merge!(headers)
        else
          connection.connection.headers = headers
        end
      end
    else
      raise ArgumentError, "Unsupported HTTP method: #{method}"
    end

    connection.connection.http(method.to_sym)

    Response.new(
      connection.connection.response_code,
      decompress_response(connection.connection.body_str),
      headers(connection)
    )
  end
end

Private Instance Methods

user_agent_header(client) click to toggle source
# File lib/elasticsearch/transport/transport/http/curb.rb, line 117
def user_agent_header(client)
  @user_agent ||= begin
                    meta = ["RUBY_VERSION: #{RUBY_VERSION}"]
                    if RbConfig::CONFIG && RbConfig::CONFIG['host_os']
                      meta << "#{RbConfig::CONFIG['host_os'].split('_').first[/[a-z]+/i].downcase} #{RbConfig::CONFIG['target_cpu']}"
                    end
                    meta << "Curb #{Curl::CURB_VERSION}"
                    "elasticsearch-ruby/#{VERSION} (#{meta.join('; ')})"
                  end
end