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