module Airbrake::Response

Parses responses coming from the Airbrake API. Handles HTTP errors by logging them.

@api private @since v1.0.0

Constants

TOO_MANY_REQUESTS

@return [Integer] HTTP code returned when an IP sends over 10k/min notices

TRUNCATE_LIMIT

@return [Integer] the limit of the response body

Public Class Methods

parse(response, logger) click to toggle source

Parses HTTP responses from the Airbrake API.

@param [Net::HTTPResponse] response @param [Logger] logger @return [Hash{String=>String}] parsed response rubocop:disable Metrics/MethodLength

# File lib/airbrake-ruby/response.rb, line 24
def self.parse(response, logger)
  code = response.code.to_i
  body = response.body

  begin
    case code
    when 201
      parsed_body = JSON.parse(body)
      logger.debug("#{LOG_LABEL} #{parsed_body}")
      parsed_body
    when 400, 401, 403, 420
      parsed_body = JSON.parse(body)
      logger.error("#{LOG_LABEL} #{parsed_body['message']}")
      parsed_body
    when TOO_MANY_REQUESTS
      parsed_body = JSON.parse(body)
      msg = "#{LOG_LABEL} #{parsed_body['message']}"
      logger.error(msg)
      { 'error' => msg, 'rate_limit_reset' => rate_limit_reset(response) }
    else
      body_msg = truncated_body(body)
      logger.error("#{LOG_LABEL} unexpected code (#{code}). Body: #{body_msg}")
      { 'error' => body_msg }
    end
  rescue StandardError => ex
    body_msg = truncated_body(body)
    logger.error("#{LOG_LABEL} error while parsing body (#{ex}). Body: #{body_msg}")
    { 'error' => ex.inspect }
  end
end

Private Class Methods

rate_limit_reset(response) click to toggle source
# File lib/airbrake-ruby/response.rb, line 67
def self.rate_limit_reset(response)
  Time.now + response['X-RateLimit-Delay'].to_i
end
truncated_body(body) click to toggle source

rubocop:enable Metrics/MethodLength

# File lib/airbrake-ruby/response.rb, line 56
def self.truncated_body(body)
  if body.nil?
    '[EMPTY_BODY]'.freeze
  elsif body.length > TRUNCATE_LIMIT
    body[0..TRUNCATE_LIMIT] << '...'
  else
    body
  end
end