class Async::HTTP::Internet

Attributes

clients[R]

A cache of clients. @attribute [Hash(URI, Client)]

Public Class Methods

new(**options) click to toggle source
# File lib/async/http/internet.rb, line 33
def initialize(**options)
        @clients = Hash.new
        @options = options
end

Public Instance Methods

call(method, url, headers = nil, body = nil) click to toggle source
# File lib/async/http/internet.rb, line 50
def call(method, url, headers = nil, body = nil)
        endpoint = Endpoint.parse(url)
        client = self.client_for(endpoint)
        
        body = Body::Buffered.wrap(body)
        headers = ::Protocol::HTTP::Headers[headers]
        
        request = ::Protocol::HTTP::Request.new(endpoint.scheme, endpoint.authority, method, endpoint.path, nil, headers, body)
        
        return client.call(request)
end
client_for(endpoint) click to toggle source
# File lib/async/http/internet.rb, line 42
def client_for(endpoint)
        key = host_key(endpoint)
        
        @clients.fetch(key) do
                @clients[key] = self.make_client(endpoint)
        end
end
close() click to toggle source
# File lib/async/http/internet.rb, line 62
def close
        # The order of operations here is to avoid a race condition between iterating over clients (#close may yield) and creating new clients.
        clients = @clients.values
        @clients.clear
        
        clients.each(&:close)
end

Protected Instance Methods

host_key(endpoint) click to toggle source
# File lib/async/http/internet.rb, line 84
def host_key(endpoint)
        url = endpoint.url.dup
        
        url.path = ""
        url.fragment = nil
        url.query = nil
        
        return url
end
make_client(endpoint) click to toggle source
# File lib/async/http/internet.rb, line 78
def make_client(endpoint)
        ::Protocol::HTTP::AcceptEncoding.new(
                Client.new(endpoint, **@options)
        )
end