23 def make_request(request)
24 uri = URI(request.url)
25
26 Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
27 if request.timeout
28 http.open_timeout = request.timeout
29 http.read_timeout = request.timeout
30 end
31
32 http_request = build_http_request(request, uri)
33
34 http.request(http_request) do |response|
35 body = if request.streaming
36 body_enum(response)
37 else
38 response.body
39 end
40
41 return Rager::Http::Response.new(
42 status: response.code.to_i,
43 headers: response.to_hash,
44 body: body
45 )
46 end
47 end
48 rescue SocketError => e
49 raise Rager::Errors::HttpError.new(
50 self,
51 request.url,
52 0,
53 body: nil,
54 details: "DNS resolution failed: #{e.message}"
55 )
56 rescue Errno::ECONNREFUSED => e
57 raise Rager::Errors::HttpError.new(
58 self,
59 request.url,
60 0,
61 body: nil,
62 details: "Connection refused: #{e.message}"
63 )
64 rescue Errno::EBUSY => e
65 raise Rager::Errors::HttpError.new(
66 self,
67 request.url,
68 0,
69 body: nil,
70 details: "Device or resource busy: #{e.message}"
71 )
72 rescue Net::OpenTimeout => e
73 raise Rager::Errors::HttpError.new(
74 self,
75 request.url,
76 0,
77 body: nil,
78 details: "Connection timed out: #{e.message}"
79 )
80 rescue Net::ReadTimeout => e
81 raise Rager::Errors::HttpError.new(
82 self,
83 request.url,
84 0,
85 body: nil,
86 details: "Read timed out: #{e.message}"
87 )
88 rescue EOFError => e
89 raise Rager::Errors::HttpError.new(
90 self,
91 request.url,
92 0,
93 body: nil,
94 details: "Connection closed unexpectedly: #{e.message}"
95 )
96 end