class RestCore::Retry

Constants

DefaultRetryExceptions

Public Class Methods

members() click to toggle source
# File lib/rest-core/middleware/retry.rb, line 6
def self.members; [:max_retries, :retry_exceptions]; end

Public Instance Methods

call(env, &k) click to toggle source
# File lib/rest-core/middleware/retry.rb, line 11
def call env, &k
  if env[DRY]
    app.call(env, &k)
  else
    app.call(env){ |res| process(res, k) }
  end
end
process(res, k) click to toggle source
# File lib/rest-core/middleware/retry.rb, line 19
def process res, k
  times = max_retries(res)
  return k.call(res) if times <= 0
  errors = retry_exceptions(res) || DefaultRetryExceptions

  if idx = res[FAIL].index{ |f| errors.find{ |e| f.kind_of?(e) } }
    err = res[FAIL].delete_at(idx)
    error_callback(res, err)
    env = res.merge('max_retries' => times - 1)
    event = Event::Retrying.new(nil, "(#{times}) for: #{err.inspect}")
    give_promise(call(log(env, event), &k))
  else
    k.call(res)
  end
end