Class: HTTPX::Pool
Instance Method Summary collapse
- #close(connections = @connections) ⇒ Object
- #empty? ⇒ Boolean
-
#find_connection(uri, options) ⇒ Object
opens a connection to the IP reachable through
uri
. - #init_connection(connection, _options) ⇒ Object
-
#initialize ⇒ Pool
constructor
A new instance of Pool.
- #next_tick ⇒ Object
Constructor Details
Instance Method Details
#close(connections = @connections) ⇒ Object
42 43 44 45 46 47 48 49 50 |
# File 'lib/httpx/pool.rb', line 42 def close(connections = @connections) @timers.cancel connections = connections.reject(&:inflight?) connections.each(&:close) next_tick until connections.none? { |c| @connections.include?(c) } @resolvers.each_value do |resolver| resolver.close unless resolver.closed? end if @connections.empty? end |
#empty? ⇒ Boolean
24 25 26 |
# File 'lib/httpx/pool.rb', line 24 def empty? @connections.empty? end |
#find_connection(uri, options) ⇒ Object
opens a connection to the IP reachable through uri
. Many hostnames are reachable through the same IP, so we try to maximize pipelining by opening as few connections as possible.
68 69 70 71 72 |
# File 'lib/httpx/pool.rb', line 68 def find_connection(uri, ) @connections.find do |connection| connection.match?(uri, ) end end |
#init_connection(connection, _options) ⇒ Object
52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/httpx/pool.rb', line 52 def init_connection(connection, ) resolve_connection(connection) connection.on(:open) do @connected_connections += 1 end connection.on(:unreachable) do resolver = find_resolver_for(connection) resolver.uncache(connection) if resolver resolve_connection(connection) end end |
#next_tick ⇒ Object
28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/httpx/pool.rb', line 28 def next_tick catch(:jump_tick) do @selector.select(next_timeout || @timers.wait_interval) do |monitor| monitor.io.call monitor.interests = monitor.io.interests end @timers.fire end rescue StandardError => ex @connections.each do |connection| connection.emit(:error, ex) end end |