class Rubycent::Request
Holds request call and response handling logic
Attributes
body[RW]
endpoint[RW]
headers[RW]
params[RW]
Public Class Methods
new(endpoint, params, body = nil, headers = {})
click to toggle source
@param endpoint [String] Centrifugo API endpoint
@param params [Hash] Additional params to configure request.
@option params [Integer] :timeout
Number of seconds to wait for the connection to open.
@option params [Integer] :open_timeout
Number of seconds to wait for one block to be read.
@param body [String]
(default: nil) JSON string representing request parameters.
@param headers [Hash]
(default: {}) Additional HTTP headers(such as Content-Type and Authorization).
# File lib/rubycent/request.rb, line 29 def initialize(endpoint, params, body = nil, headers = {}) @endpoint = endpoint @params = params @body = body @headers = headers end
Public Instance Methods
post()
click to toggle source
Perform POST request to centrifugo API
@raise [Rubycent::Error, Rubycent::NetworkError
, Rubycent::RequestError
, Rubycent::ResponseError]
@return [Hash] Parsed response body
# File lib/rubycent/request.rb, line 42 def post response = rest_client.post(@endpoint) do |request| configure_request(request: request, body: body, headers: headers) end handle_response(response) rescue Faraday::ConnectionFailed => e handle_error(e) end
Private Instance Methods
configure_request(request: nil, headers: nil, body: nil)
click to toggle source
# File lib/rubycent/request.rb, line 61 def configure_request(request: nil, headers: nil, body: nil) return if request.nil? request.headers.merge!(headers) if headers request.body = body if body request.options.timeout = @params[:timeout] request.options.open_timeout = @params[:open_timeout] end
handle_error(error)
click to toggle source
# File lib/rubycent/request.rb, line 107 def handle_error(error) message = "#{error.message} (#{error.class})" wrapper = NetworkError.new(message).tap do |w| w.original_error = error end raise wrapper end
handle_response(response)
click to toggle source
# File lib/rubycent/request.rb, line 71 def handle_response(response) response.status == 200 ? parse_response(response) : raise_error(response) end
parse_response(response)
click to toggle source
# File lib/rubycent/request.rb, line 75 def parse_response(response) MultiJson.load(response.body).tap do |data| raise ResponseError, data['error'] if data.key?('error') end end
raise_error(response)
click to toggle source
# File lib/rubycent/request.rb, line 81 def raise_error(response) status_code = response.status body = response.body message = resolve_error_message(status_code, body) case status_code when 400..404 raise RequestError.new(message, status_code) else raise Error, message end end
resolve_error_message(status, additional_info = nil)
click to toggle source
# File lib/rubycent/request.rb, line 95 def resolve_error_message(status, additional_info = nil) error_messages = { 400 => "Bad request: #{additional_info}", 401 => 'Invalid API key', 404 => 'Route not found' } error_messages.fetch(status) do "Status: #{status}. Unknown error: #{additional_info}" end end
rest_client()
click to toggle source
# File lib/rubycent/request.rb, line 54 def rest_client Faraday.new do |faraday| faraday.adapter(Rubycent.request_adapter) faraday.headers = @headers end end