Class: Seahorse::Client::NetHttp::ConnectionPool Private

Inherits:
Object
  • Object
show all
Defined in:
lib/seahorse/client/net_http/connection_pool.rb

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

Defined Under Namespace

Classes: ExtendedSession

Constant Summary collapse

OPTIONS =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

{
  http_proxy: nil,
  http_open_timeout: 15,
  http_read_timeout: 60,
  http_idle_timeout: 5,
  http_continue_timeout: 1,
  http_wire_trace: false,
  logger: nil,
  ssl_verify_peer: true,
  ssl_ca_bundle: nil,
  ssl_ca_directory: nil,
  ssl_ca_store: nil,
  ssl_timeout: nil,
  ssl_cert: nil,
  ssl_key: nil
}

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ ConnectionPool

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of ConnectionPool.



43
44
45
46
47
48
49
50
# File 'lib/seahorse/client/net_http/connection_pool.rb', line 43

def initialize(options = {})
  OPTIONS.each_pair do |opt_name, default_value|
    value = options[opt_name].nil? ? default_value : options[opt_name]
    instance_variable_set("@#{opt_name}", value)
  end
  @pool_mutex = Mutex.new
  @pool = {}
end

Class Method Details

.for(options = {}) ⇒ ConnectionPool

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a connection pool constructed from the given options. Calling this method twice with the same options will return the same pool.

Parameters:

  • options (Hash) (defaults to: {})

    a customizable set of options

Options Hash (options):

  • :http_proxy (URI::HTTP, String)

    A proxy to send requests through. Formatted like ‘proxy.com:123’.

  • :http_open_timeout (Float) — default: 15

    The number of seconds to wait when opening an HTTP session before raising a ‘Timeout::Error`.

  • :http_read_timeout (Float) — default: 60

    The default number of seconds to wait for response data. This value can be safely set per-request on the session yielded by #session_for.

  • :http_idle_timeout (Float) — default: 5

    The number of seconds a connection is allowed to sit idle before it is considered stale. Stale connections are closed and removed from the pool before making a request.

  • :http_continue_timeout (Float) — default: 1

    The number of seconds to wait for a 100-continue response before sending the request body. This option has no effect unless the request has “Expect” header set to “100-continue”. Defaults to ‘nil` which disables this behaviour. This value can safely be set per request on the session yielded by #session_for.

  • :ssl_timeout (Float) — default: nil

    Sets the SSL timeout in seconds.

  • :http_wire_trace (Boolean) — default: false

    When ‘true`, HTTP debug output will be sent to the `:logger`.

  • :logger (Logger)

    Where debug output is sent. Defaults to ‘nil` when `:http_wire_trace` is `false`. Defaults to `Logger.new($stdout)` when `:http_wire_trace` is `true`.

  • :ssl_verify_peer (Boolean) — default: true

    When ‘true`, SSL peer certificates are verified when establishing a connection.

  • :ssl_ca_bundle (String)

    Full path to the SSL certificate authority bundle file that should be used when verifying peer certificates. If you do not pass ‘:ssl_ca_bundle` or `:ssl_ca_directory` the system default will be used if available.

  • :ssl_ca_directory (String)

    Full path of the directory that contains the unbundled SSL certificate authority files for verifying peer certificates. If you do not pass ‘:ssl_ca_bundle` or `:ssl_ca_directory` the system default will be used if available.

Returns:



215
216
217
218
219
220
# File 'lib/seahorse/client/net_http/connection_pool.rb', line 215

def for options = {}
  options = pool_options(options)
  @pools_mutex.synchronize do
    @pools[options] ||= new(options)
  end
end

.poolsArray<ConnectionPool>

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a list of the constructed connection pools.

Returns:

  • (Array<ConnectionPool>)

    Returns a list of the constructed connection pools.



224
225
226
227
228
# File 'lib/seahorse/client/net_http/connection_pool.rb', line 224

def pools
  @pools_mutex.synchronize do
    @pools.values
  end
end

Instance Method Details

#clean!nil

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Removes stale http sessions from the pool (that have exceeded the idle timeout).

Returns:

  • (nil)


131
132
133
134
# File 'lib/seahorse/client/net_http/connection_pool.rb', line 131

def clean!
  @pool_mutex.synchronize { _clean }
  nil
end

#empty!nil

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Closes and removes all sessions from the pool. If empty! is called while there are outstanding requests they may get checked back into the pool, leaving the pool in a non-empty state.

Returns:

  • (nil)


141
142
143
144
145
146
147
# File 'lib/seahorse/client/net_http/connection_pool.rb', line 141

def empty!
  @pool_mutex.synchronize do
    @pool.values.flatten.map(&:finish)
    @pool.clear
  end
  nil
end

#request(endpoint, request) {|net_http_response| ... } ⇒ nil

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Makes an HTTP request, yielding a Net::HTTPResponse object.

pool.request(URI.parse('http://domain'), Net::HTTP::Get.new('/')) do |resp|
  puts resp.code # status code
  puts resp.to_h.inspect # dump the headers
  puts resp.body
end

Parameters:

  • endpoint (URI::HTTP, URI::HTTPS)

    The HTTP(S) endpoint to connect to (e.g. ‘domain.com’).

  • request (Net::HTTPRequest)

    The request to make. This can be any request object from Net::HTTP (e.g. Net::HTTP::Get, Net::HTTP::POST, etc).

Yield Parameters:

  • net_http_response (Net::HTTPResponse)

Returns:

  • (nil)


77
78
79
80
81
# File 'lib/seahorse/client/net_http/connection_pool.rb', line 77

def request(endpoint, request, &block)
  session_for(endpoint) do |http|
    yield(http.request(request))
  end
end

#session_for(endpoint) {|session| ... } ⇒ nil

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Parameters:

  • endpoint (URI::HTTP, URI::HTTPS)

    The HTTP(S) endpoint to connect to (e.g. ‘domain.com’).

Yield Parameters:

  • session (Net::HTTPSession)

Returns:

  • (nil)


89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/seahorse/client/net_http/connection_pool.rb', line 89

def session_for(endpoint, &block)
  endpoint = remove_path_and_query(endpoint)
  session = nil

  # attempt to recycle an already open session
  @pool_mutex.synchronize do
    _clean
    if @pool.key?(endpoint)
      session = @pool[endpoint].shift
    end
  end

  begin
    session ||= start_session(endpoint)
    session.read_timeout = http_read_timeout
    session.continue_timeout = http_continue_timeout if
      session.respond_to?(:continue_timeout=)
    yield(session)
  rescue
    session.finish if session
    raise
  else
    # No error raised? Good, check the session into the pool.
    @pool_mutex.synchronize do
      @pool[endpoint] = [] unless @pool.key?(endpoint)
      @pool[endpoint] << session
    end
  end
  nil
end

#sizeInteger

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns the count of sessions currently in the pool, not counting those currently in use.

Returns:

  • (Integer)

    Returns the count of sessions currently in the pool, not counting those currently in use.



122
123
124
125
126
# File 'lib/seahorse/client/net_http/connection_pool.rb', line 122

def size
  @pool_mutex.synchronize do
    @pool.values.flatten.size
  end
end