Class: Azure::Core::Http::RetryPolicy

Inherits:
HttpFilter
  • Object
show all
Defined in:
lib/azure/core/http/retry_policy.rb

Overview

A HttpFilter implementation that handles retrying based on a specific policy when HTTP layer errors occur

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(&block) ⇒ RetryPolicy

Returns a new instance of RetryPolicy.



25
26
27
28
# File 'lib/azure/core/http/retry_policy.rb', line 25

def initialize(&block)
  @block = block
  @retry_data = {}
end

Instance Attribute Details

#retry_dataObject

Returns the value of attribute retry_data.



30
31
32
# File 'lib/azure/core/http/retry_policy.rb', line 30

def retry_data
  @retry_data
end

Instance Method Details

#call(req, _next) ⇒ Object

Overrides the base class implementation of call to implement a retry loop that uses should_retry? to determine when to break the loop

req - HttpRequest. The HTTP request _next - HttpFilter. The next filter in the pipeline



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/azure/core/http/retry_policy.rb', line 38

def call(req, _next)
  response = nil
  retry_data = @retry_data.dup
  begin
    # URI could change in the retry, e.g. secondary endpoint
    unless retry_data[:uri].nil?
      req.uri = retry_data[:uri]
    end

    retry_data[:error] = nil
    response = _next.call
  rescue
    retry_data[:error] = $!
  end while should_retry?(response, retry_data)
  
  # Assign the error when HTTP error is not thrown from the previous filter
  retry_data[:error] = response.error if response && !response.success?
  if retry_data[:error].nil?
    response
  else
    raise retry_data[:error]
  end
end

#should_retry?(response, retry_data) ⇒ Boolean

Determines if the HTTP request should continue retrying

response - HttpResponse. The response from the active request retry_data - Hash. Stores stateful retry data

The retry_data is a Hash which can be used to store stateful data about the request execution context (such as an incrementing counter, timestamp, etc). The retry_data object will be the same instance throughout the lifetime of the request.

If an inline block was passed to the constructor, that block will be used here and should return true to retry the job, or false to stop exit. If an inline block was not passed to the constructor the method returns false.

Alternatively, a subclass could override this method.

Returns:

  • (Boolean)


78
79
80
# File 'lib/azure/core/http/retry_policy.rb', line 78

def should_retry?(response, retry_data)
  @block ? @block.call(response, retry_data) : false
end