Class: RestCore::Retry

Inherits:
Object
  • Object
show all
Includes:
Middleware
Defined in:
lib/rest-core/middleware/retry.rb

Constant Summary collapse

DefaultRetryExceptions =
[IOError, SystemCallError]

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.membersObject



6
# File 'lib/rest-core/middleware/retry.rb', line 6

def self.members; [:max_retries, :retry_exceptions]; end

Instance Method Details

#call(env, &k) ⇒ Object



11
12
13
14
15
16
17
# 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) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 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