Class: CloudFS::RestAdapter::Connection
- Inherits:
-
Object
- Object
- CloudFS::RestAdapter::Connection
- Defined in:
- lib/cloudfs/client/connection.rb
Overview
Provides RESTful interface
Maintains a persistent instance of class HTTPClient, since HTTPClient instance is MT-safe and can be called from several threads without synchronization after setting up an instance, same behaviour is expected from Connection class.
Instance Method Summary collapse
-
#initialize(**params) ⇒ Connection
constructor
Creates Connection instance.
-
#request(method, uri, **params, &block) ⇒ Hash
Sends request to specified url, calls HTTPClient#request, retries http 500 level errors with exponential delay upto max retries.
-
#unlink ⇒ Object
Disconnects all keep alive connections and intenal sessions.
Constructor Details
#initialize(**params) ⇒ Connection
Creates Connection instance
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/cloudfs/client/connection.rb', line 39
def initialize(** params)
@persistent_conn = HTTPClient.new
@persistent_conn.cookie_manager = nil
connect_timeout, send_timeout, receive_timeout,
max_retries, debug_dev, agent_name =
params.values_at(:connect_timeout, :send_timeout, :receive_timeout,
:max_retries, :debug_dev, :agent_name)
@persistent_conn.connect_timeout = connect_timeout if connect_timeout
@persistent_conn.send_timeout = send_timeout if send_timeout
@persistent_conn.receive_timeout = receive_timeout if receive_timeout
@persistent_conn.debug_dev = debug_dev if debug_dev.respond_to?(:<<)
@persistent_conn.agent_name = agent_name
@max_retries = max_retries ? max_retries : 0
end
|
Instance Method Details
#request(method, uri, **params, &block) ⇒ Hash
Sends request to specified url, calls HTTPClient#request, retries http 500 level errors with exponential delay upto max retries
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/cloudfs/client/connection.rb', line 88
def request(method, uri, ** params, &block)
method = method.to_s.downcase.to_sym
req_params = params.reject { |_, v| Utils.is_blank?(v) }
if method == :get && !params[:header].has_key?(Constants::HEADER_REDIRECT)
req_params = req_params.merge({follow_redirect: true})
end
resp = request_with_retry(method, uri, req_params, &block)
status = resp.status.to_i
response = {code: status}
response[:content] = resp.content
response[:content_type] = resp.header['Content-Type'].first
if status < 200 || status >=400 || (resp.redirect? && status != 302)
message = Utils.is_blank?(resp.content) ? resp.reason : resp.content
request = set_error_request_context(method, uri, req_params)
fail Errors::ServerError.new(message, status, response, request)
end
response
rescue HTTPClient::TimeoutError
request = set_error_request_context(method, uri, req_params)
raise Errors::TimeoutError.new($!, request)
rescue HTTPClient::BadResponseError
request = set_error_request_context(method, uri, req_params)
raise Errors::ClientError.new($!, request)
rescue Errno::ECONNREFUSED, EOFError, SocketError
request = set_error_request_context(method, uri, req_params)
raise Errors::ConnectionFailed.new($!, request)
end
|
#unlink ⇒ Object
Disconnects all keep alive connections and intenal sessions
56 57 58 |
# File 'lib/cloudfs/client/connection.rb', line 56
def unlink
@persistent_conn.reset_all
end
|