Class: Async::HTTP::Internet

Inherits:
Object
  • Object
show all
Extended by:
Thread::Local
Defined in:
lib/async/http/internet.rb,
lib/async/http/internet/instance.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(**options) ⇒ Internet

Returns a new instance of Internet.



33
34
35
36
# File 'lib/async/http/internet.rb', line 33

def initialize(**options)
	@clients = {}
	@options = options
end

Instance Attribute Details

#clientsObject

A cache of clients.



40
41
42
# File 'lib/async/http/internet.rb', line 40

def clients
  @clients
end

Instance Method Details

#call(method, url, headers = nil, body = nil) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/async/http/internet.rb', line 42

def call(method, url, headers = nil, body = nil)
	endpoint = Endpoint.parse(url)
	key = host_key(endpoint)
	
	client = @clients.fetch(key) do
		@clients[key] = self.client_for(endpoint)
	end
	
	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) ⇒ Object



58
59
60
61
62
# File 'lib/async/http/internet.rb', line 58

def client_for(endpoint)
	::Protocol::HTTP::AcceptEncoding.new(
		Client.new(endpoint, **@options)
	)
end

#closeObject



64
65
66
67
68
69
70
# File 'lib/async/http/internet.rb', line 64

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