class Seahorse::Client::NetHttp::Handler

The default HTTP handler for Seahorse::Client. This is based on the Ruby's `Net::HTTP`.

Constants

DNS_ERROR_MESSAGE

@api private

NETWORK_ERRORS

Public Instance Methods

call(context) click to toggle source

@param [RequestContext] context @return [Response]

# File lib/seahorse/client/net_http/handler.rb, line 24
def call(context)
  transmit(context.config, context.http_request, context.http_response)
  Response.new(context: context)
end
pool_for(config) click to toggle source

@param [Configuration] config @return [ConnectionPool]

# File lib/seahorse/client/net_http/handler.rb, line 31
def pool_for(config)
  ConnectionPool.for(pool_options(config))
end

Private Instance Methods

build_net_request(request) click to toggle source

Constructs and returns a Net::HTTP::Request object from a {Http::Request}. @param [Http::Request] request @return [Net::HTTP::Request]

# File lib/seahorse/client/net_http/handler.rb, line 95
def build_net_request(request)
  request_class = net_http_request_class(request)
  req = request_class.new(request.endpoint.request_uri, headers(request))
  req.body_stream = request.body
  req
end
error_message(req, error) click to toggle source
# File lib/seahorse/client/net_http/handler.rb, line 37
def error_message(req, error)
  if error.is_a?(SocketError) && error.message == DNS_ERROR_MESSAGE
    host = req.endpoint.host
    "unable to connect to `#{host}`; SocketError: #{error.message}"
  else
    error.message
  end
end
extract_headers(response) click to toggle source

@param [Net::HTTP::Response] response @return [Hash<String, String>]

# File lib/seahorse/client/net_http/handler.rb, line 127
def extract_headers(response)
  response.to_hash.inject({}) do |headers, (k, v)|
    headers[k] = v.first
    headers
  end
end
headers(request) click to toggle source

@param [Http::Request] request @return [Hash] Returns a vanilla hash of headers to send with the

HTTP request.
# File lib/seahorse/client/net_http/handler.rb, line 116
def headers(request)
  # setting these to stop net/http from providing defaults
  headers = { 'content-type' => '', 'accept-encoding' => '' }
  request.headers.each_pair do |key, value|
    headers[key] = value
  end
  headers
end
net_http_request_class(request) click to toggle source

@param [Http::Request] request @raise [InvalidHttpVerbError] @return Returns a base `Net::HTTP::Request` class, e.g.,

`Net::HTTP::Get`, `Net::HTTP::Post`, etc.
# File lib/seahorse/client/net_http/handler.rb, line 106
def net_http_request_class(request)
  Net::HTTP.const_get(request.http_method.capitalize)
rescue NameError
  msg = "`#{request.http_method}` is not a valid http verb"
  raise InvalidHttpVerbError, msg
end
pool_options(config) click to toggle source

Extracts the {ConnectionPool} configuration options. @param [Configuration] config @return [Hash]

# File lib/seahorse/client/net_http/handler.rb, line 84
def pool_options(config)
  ConnectionPool::OPTIONS.keys.inject({}) do |opts,opt|
    opts[opt] = config.send(opt)
    opts
  end
end
session(config, req) { |http| ... } click to toggle source
# File lib/seahorse/client/net_http/handler.rb, line 74
def session(config, req, &block)
  pool_for(config).session_for(req.endpoint) do |http|
    http.read_timeout = config.http_read_timeout
    yield(http)
  end
end
transmit(config, req, resp) click to toggle source

@param [Configuration] config @param [Http::Request] req @param [Http::Response] resp @return [void]

# File lib/seahorse/client/net_http/handler.rb, line 50
def transmit(config, req, resp)
  session(config, req) do |http|
    http.request(build_net_request(req)) do |net_resp|

      status_code = net_resp.code.to_i
      headers = extract_headers(net_resp)

      resp.signal_headers(status_code, headers)
      net_resp.read_body do |chunk|
        resp.signal_data(chunk)
      end
      resp.signal_done

    end
  end
rescue *NETWORK_ERRORS => error
  # these are retryable
  error = NetworkingError.new(error, error_message(req, error))
  resp.signal_error(error)
rescue => error
  # not retryable
  resp.signal_error(error)
end