class Async::HTTP::Client
def self.open(*args, &block)
def self.open(*args, &block) client = self.new(*args) return client unless block_given? begin yield client ensure client.close end end
def call(request)
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) end return response end
def close
def close @connections.close end
def connect(connection_limit: nil)
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 end end
def initialize(endpoint, protocol = nil, authority = nil, **options)
def initialize(endpoint, protocol = nil, authority = nil, **options) @endpoint = endpoint @protocol = protocol || endpoint.protocol @authority = authority || endpoint.hostname @connections = connect(**options) end