Sha256: 221beb59a7028dadd97e20ef697b04ed7515dcc53ee2024053cc42f4a66233df

Contents?: true

Size: 1.83 KB

Versions: 37

Compression:

Stored size: 1.83 KB

Contents

module Ridley
  # Catches exceptions and retries each request a limited number of times.
  #
  # @example
  #
  #   Faraday.new do |conn|
  #     conn.request :retry, max: 2, interval: 0.05, exceptions: [CustomException, Faraday::Timeout::Error]
  #     conn.adapter ...
  #   end
  #
  # @note Borrowed and modified from: {https://github.com/lostisland/faraday/blob/master/lib/faraday/request/retry.rb}
  #   use the Faraday official middleware after the release of 0.9.x
  class Middleware::Retry < Faraday::Middleware
    # @option options [Integer] :max
    #   maximum number of retries
    # @option options [Float] :interval
    #   pause in seconds between retries
    # @option options [Array] :exceptions
    #   the list of exceptions to handle
    def initialize(app, options = {})
      super(app)
      @options  = options.slice(:max, :interval, :exceptions)
      @errmatch = build_exception_matcher(@options[:exceptions])
    end

    def call(env)
      retries = @options[:max]
      begin
        @app.call(env)
      rescue @errmatch
        if retries > 0
          retries -= 1
          sleep @options[:interval] if @options[:interval] > 0
          retry
        end
        raise
      end
    end

    # construct an exception matcher object.
    #
    # An exception matcher for the rescue clause can usually be any object that
    # responds to `===`, but for Ruby 1.8 it has to be a Class or Module.
    def build_exception_matcher(exceptions)
      matcher = Module.new
      (class << matcher; self; end).class_eval do
        define_method(:===) do |error|
          exceptions.any? do |ex|
            if ex.is_a? Module then error.is_a? ex
            else error.class.to_s == ex.to_s
            end
          end
        end
      end
      matcher
    end
  end
end

Faraday.register_middleware(:request, retry: Ridley::Middleware::Retry)

Version data entries

37 entries across 37 versions & 1 rubygems

Version Path
ridley-2.5.1 lib/ridley/middleware/retry.rb
ridley-2.5.0 lib/ridley/middleware/retry.rb
ridley-2.4.4 lib/ridley/middleware/retry.rb
ridley-2.4.3 lib/ridley/middleware/retry.rb
ridley-2.4.2 lib/ridley/middleware/retry.rb
ridley-2.4.1 lib/ridley/middleware/retry.rb
ridley-2.4.0 lib/ridley/middleware/retry.rb
ridley-2.3.0 lib/ridley/middleware/retry.rb
ridley-2.2.0 lib/ridley/middleware/retry.rb
ridley-2.1.0 lib/ridley/middleware/retry.rb
ridley-2.0.0 lib/ridley/middleware/retry.rb
ridley-1.7.1 lib/ridley/middleware/retry.rb
ridley-1.7.0 lib/ridley/middleware/retry.rb
ridley-1.6.0 lib/ridley/middleware/retry.rb
ridley-1.5.3 lib/ridley/middleware/retry.rb
ridley-1.2.6 lib/ridley/middleware/retry.rb
ridley-1.5.2 lib/ridley/middleware/retry.rb
ridley-1.5.1 lib/ridley/middleware/retry.rb
ridley-1.5.0 lib/ridley/middleware/retry.rb
ridley-1.2.5 lib/ridley/middleware/retry.rb