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 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

def request(*args, &block)

def request(*args, &block)
	@connections.acquire do |connection|
		response = connection.send_request(@authority, *args)
		
		begin
			yield response if block_given?
		ensure
			# This forces the stream to complete reading.
			response.finish
		end
		
		return response
	end
end