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