lib/async/http/client.rb in async-http-0.19.0 vs lib/async/http/client.rb in async-http-0.20.0

- old
+ new

@@ -57,37 +57,39 @@ end include Verbs def call(request) - connection = @connections.acquire - request.authority ||= @authority - response = connection.call(request) - # The connection won't be released until the body is completely read/released. - Body::Streamable.wrap(response) do - @connections.release(connection) + # As we cache connections, it's possible these connections go bad (e.g. closed by remote host). In this case, we need to try again. It's up to the caller to impose a timeout on this. + while true + connection = @connections.acquire + + if response = connection.call(request) + # The connection won't be released until the body is completely read/released. + Body::Streamable.wrap(response) do + @connections.release(connection) + end + + return response + else + # The connection failed for some reason, we close it. + connection.close + end end - - return response end protected def connect(connection_limit: nil) Pool.new(connection_limit) do Async.logger.debug(self) {"Making connection to #{@endpoint.inspect}"} - @endpoint.each do |endpoint| - peer = endpoint.connect - - peer.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) - - stream = IO::Stream.new(peer) - - break @protocol.client(stream) - end + peer = @endpoint.connect + peer.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) + + @protocol.client(IO::Stream.new(peer)) end end end end end