Sha256: 792395828f938050319211c94ddbf45a291c692a24ea9d69ca707852b0af7534

Contents?: true

Size: 1.64 KB

Versions: 7

Compression:

Stored size: 1.64 KB

Contents

require 'faraday'



module Saddle
  module Middleware
    module Request

      # Catches exceptions and retries each request a limited number of times.
      #
      # By default, it retries 2 times and performs exponential backoff, starting
      # at 50ms
      class Retry < Faraday::Middleware
        def initialize(app, ignored_exceptions=[])
          super(app)
          @ignored_exceptions = ignored_exceptions
        end

        def call(env)
          retries = env[:request][:num_retries] || 2
          backoff = env[:request][:retry_backoff] || 0.050 # in seconds
          begin
            @app.call(self.class.deep_copy(env))
          rescue => e
            # Only retry for GET or if the request is marked as idempotent
            if env[:method] == :get || env[:request][:idempotent]
              unless @ignored_exceptions.include?(e.class)
                # Retry a limited number of times
                if retries > 0
                  retries -= 1
                  sleep(backoff) if backoff > 0.0
                  backoff *= 2
                  retry
                end
              end
            end
            # Re-raise if we're out of retries or it's not handled
            raise
          end
        end

        def self.deep_copy(value)
          if value.is_a?(Hash)
            result = value.clone
            value.each{|k, v| result[k] = deep_copy(v)}
            result
          elsif value.is_a?(Array)
            result = value.clone
            result.clear
            value.each{|v| result << deep_copy(v)}
            result
          else
            value
          end
        end
      end

    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
saddle-0.0.36 lib/saddle/middleware/request/retry.rb
saddle-0.0.35 lib/saddle/middleware/request/retry.rb
saddle-0.0.34 lib/saddle/middleware/request/retry.rb
saddle-0.0.33 lib/saddle/middleware/request/retry.rb
saddle-0.0.32 lib/saddle/middleware/request/retry.rb
saddle-0.0.31 lib/saddle/middleware/request/retry.rb
saddle-0.0.30 lib/saddle/middleware/request/retry.rb