class Rubycent::Request

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