28 def make_request(request)
29 response = wrap_if_timeout(request.timeout) do
30 @internet.call(
31 request.verb.serialize,
32 request.url,
33 request.headers.to_a,
34 request.body
35 )
36 end
37
38 body = if response.body.nil?
39 nil
40 elsif request.streaming
41 body_enum(response)
42 else
43 response.body.join
44 end
45
46 Response.new(
47 status: response.status,
48 headers: response.headers.to_h,
49 body: body
50 )
51 rescue SocketError => e
52 raise Rager::Errors::HttpError.new(
53 self,
54 request.url,
55 0,
56 body: nil,
57 details: "DNS resolution failed: #{e.message}"
58 )
59 rescue Errno::ECONNREFUSED => e
60 raise Rager::Errors::HttpError.new(
61 self,
62 request.url,
63 0,
64 body: nil,
65 details: "Connection refused: #{e.message}"
66 )
67 rescue Errno::ETIMEDOUT => e
68 raise Rager::Errors::HttpError.new(
69 self,
70 request.url,
71 0,
72 body: nil,
73 details: "Connection timed out: #{e.message}"
74 )
75 rescue Async::TimeoutError => e
76 raise Rager::Errors::HttpError.new(
77 self,
78 request.url,
79 0,
80 body: nil,
81 details: "Request timed out: #{e.message}"
82 )
83 rescue EOFError => e
84 raise Rager::Errors::HttpError.new(
85 self,
86 request.url,
87 0,
88 body: nil,
89 details: "Connection closed unexpectedly: #{e.message}"
90 )
91 end