21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
# File 'lib/exa/internal/transport/pooled_net_requester.rb', line 21
def execute(request)
url = request.fetch(:url)
deadline = request.fetch(:deadline)
pool_for(url).with(timeout: remaining(deadline)) do |conn|
req, body_closer = build_request(request) do
calibrate_socket_timeout(conn, deadline)
end
calibrate_socket_timeout(conn, deadline)
start_connection(conn)
calibrate_socket_timeout(conn, deadline)
enum = Enumerator.new do |y|
conn.request(req) do |resp|
y << [req, resp]
resp.read_body do |chunk|
y << chunk.force_encoding(Encoding::BINARY)
end
end
rescue Timeout::Error
raise Exa::Errors::APITimeoutError.new("Request timed out", url: url)
rescue StandardError => e
raise Exa::Errors::APIConnectionError.new(e.message, url: url)
ensure
body_closer&.call
end
_, response = enum.next
body_stream = Enumerator.new do |y|
loop do
begin
y << enum.next
rescue StopIteration
break
end
end
end
body = Exa::Internal::Util.fused_enum(body_stream)
[Integer(response.code), response, body]
end
end
|