azure-storage 0.10.0.preview → 0.10.1.preview
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/azure/storage/autoload.rb +2 -4
- data/lib/azure/storage/blob/blob_service.rb +2 -5
- data/lib/azure/storage/blob/container.rb +5 -1
- data/lib/azure/storage/client.rb +4 -4
- data/lib/azure/storage/{core/client_options.rb → client_options.rb} +1 -2
- data/lib/azure/storage/{core/client_options_error.rb → client_options_error.rb} +2 -2
- data/lib/azure/storage/core.rb +1 -1
- data/lib/azure/storage/core/auth/shared_access_signature.rb +3 -2
- data/lib/azure/storage/core/auth/shared_access_signature_generator.rb +31 -18
- data/lib/azure/storage/core/auth/shared_access_signature_signer.rb +1 -1
- data/lib/azure/storage/core/auth/shared_key.rb +4 -72
- data/lib/azure/storage/core/autoload.rb +17 -8
- data/lib/azure/storage/core/error.rb +2 -8
- data/lib/azure/storage/core/filter/exponential_retry_filter.rb +62 -0
- data/lib/azure/storage/core/{auth/shared_key_lite.rb → filter/linear_retry_filter.rb} +27 -29
- data/lib/azure/storage/core/filter/retry_filter.rb +172 -0
- data/lib/azure/storage/core/http_client.rb +1 -1
- data/lib/azure/storage/core/utility.rb +2 -10
- data/lib/azure/storage/{core/constants.rb → default.rb} +0 -0
- data/lib/azure/storage/service/storage_service.rb +7 -2
- data/lib/azure/storage/table/auth/shared_key.rb +2 -2
- data/lib/azure/storage/table/batch.rb +1 -1
- data/lib/azure/storage/table/table_service.rb +11 -11
- data/lib/azure/storage/version.rb +1 -1
- metadata +24 -18
- data/lib/azure/storage/core/auth/signer.rb +0 -60
- data/lib/azure/storage/core/filtered_service.rb +0 -54
- data/lib/azure/storage/core/http/debug_filter.rb +0 -45
- data/lib/azure/storage/core/http/http_error.rb +0 -95
- data/lib/azure/storage/core/http/http_filter.rb +0 -62
- data/lib/azure/storage/core/http/http_request.rb +0 -182
- data/lib/azure/storage/core/http/http_response.rb +0 -105
- data/lib/azure/storage/core/http/retry_policy.rb +0 -83
- data/lib/azure/storage/core/http/signer_filter.rb +0 -42
- data/lib/azure/storage/core/service.rb +0 -55
- data/lib/azure/storage/core/signed_service.rb +0 -54
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 68f699e6dbd6ceed52d8c35694a78d9c852ea5a0
|
4
|
+
data.tar.gz: 21e079f0fab409af5260dd228e1a3ec7e05d180c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c15b3eb7927d1856e98f0a36cfd543885d5bfedc6d4986d01147a234f0b016169683a66974126aa1b22bf9341547ad6f89708c4b848526d128666c5222433701
|
7
|
+
data.tar.gz: 4f9cf1548ad8e0761671dfba0835a71367544e3018c02b06b44ccd185af42ff0056a181f029aa291a8c79fe4e6b555a227cc85ca882618b1a0777873f4cc8caa
|
@@ -29,15 +29,13 @@ module Azure
|
|
29
29
|
autoload :Storage, 'azure/storage/core'
|
30
30
|
|
31
31
|
module Storage
|
32
|
-
autoload :Default, 'azure/storage/
|
32
|
+
autoload :Default, 'azure/storage/default'
|
33
33
|
autoload :Configurable, 'azure/storage/configurable'
|
34
34
|
autoload :Client, 'azure/storage/client'
|
35
|
-
autoload :ClientOptions, 'azure/storage/
|
35
|
+
autoload :ClientOptions, 'azure/storage/client_options'
|
36
36
|
|
37
37
|
module Auth
|
38
38
|
autoload :SharedAccessSignature, 'azure/storage/core/auth/shared_access_signature'
|
39
|
-
autoload :SharedKey, 'azure/storage/core/auth/shared_key'
|
40
|
-
autoload :SharedKeyLite, 'azure/storage/core/auth/shared_key_lite'
|
41
39
|
end
|
42
40
|
|
43
41
|
module Service
|
@@ -30,17 +30,14 @@ require 'azure/storage/blob/append'
|
|
30
30
|
|
31
31
|
module Azure::Storage
|
32
32
|
include Service
|
33
|
+
|
33
34
|
module Blob
|
34
35
|
class BlobService < StorageService
|
35
36
|
include Azure::Storage::Blob
|
36
37
|
include Azure::Storage::Blob::Container
|
37
38
|
|
38
39
|
def initialize(options = {})
|
39
|
-
|
40
|
-
signer = options[:signer] || Auth::SharedKey.new(
|
41
|
-
client_config.storage_account_name,
|
42
|
-
client_config.storage_access_key)
|
43
|
-
super(signer, client_config.storage_account_name, options)
|
40
|
+
super(nil, nil, options)
|
44
41
|
@host = client.storage_blob_host
|
45
42
|
end
|
46
43
|
|
@@ -545,7 +545,11 @@ module Azure::Storage::Blob
|
|
545
545
|
response = call(:get, uri)
|
546
546
|
|
547
547
|
# Result
|
548
|
-
|
548
|
+
if response.success?
|
549
|
+
Serialization.blob_enumeration_results_from_xml(response.body)
|
550
|
+
else
|
551
|
+
response.exception
|
552
|
+
end
|
549
553
|
end
|
550
554
|
|
551
555
|
end
|
data/lib/azure/storage/client.rb
CHANGED
@@ -22,10 +22,10 @@
|
|
22
22
|
# THE SOFTWARE.
|
23
23
|
#--------------------------------------------------------------------------
|
24
24
|
|
25
|
+
require 'azure/storage/core'
|
25
26
|
require 'azure/storage/core/http_client'
|
26
27
|
|
27
|
-
require 'azure/storage/
|
28
|
-
require 'azure/storage/core/client_options'
|
28
|
+
require 'azure/storage/client_options'
|
29
29
|
|
30
30
|
require 'azure/storage/blob/blob_service'
|
31
31
|
require 'azure/storage/table/table_service'
|
@@ -35,7 +35,7 @@ module Azure::Storage
|
|
35
35
|
class Client
|
36
36
|
include Azure::Storage::Configurable
|
37
37
|
include Azure::Storage::ClientOptions
|
38
|
-
include Azure::Core::HttpClient
|
38
|
+
include Azure::Storage::Core::HttpClient
|
39
39
|
|
40
40
|
# Public: Creates an instance of [Azure::Storage::Client]
|
41
41
|
#
|
@@ -178,7 +178,7 @@ module Azure::Storage
|
|
178
178
|
private
|
179
179
|
|
180
180
|
def default_client(opts)
|
181
|
-
{client:
|
181
|
+
!opts.empty? ? {client: Azure::Storage.client(opts)} : {client: self}
|
182
182
|
end
|
183
183
|
|
184
184
|
end
|
@@ -23,8 +23,7 @@
|
|
23
23
|
#--------------------------------------------------------------------------
|
24
24
|
|
25
25
|
require 'uri'
|
26
|
-
require 'azure/storage/
|
27
|
-
require 'azure/storage/core/client_options_error'
|
26
|
+
require 'azure/storage/client_options_error'
|
28
27
|
|
29
28
|
module Azure::Storage
|
30
29
|
module ClientOptions
|
@@ -24,13 +24,13 @@
|
|
24
24
|
|
25
25
|
module Azure::Storage
|
26
26
|
|
27
|
-
class InvalidConnectionStringError < StorageError
|
27
|
+
class InvalidConnectionStringError < Core::StorageError
|
28
28
|
def initialize(message = SR::INVALID_CONNECTION_STRING)
|
29
29
|
super(message)
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
class InvalidOptionsError < StorageError
|
33
|
+
class InvalidOptionsError < Core::StorageError
|
34
34
|
def initialize(message = SR::INVALID_CLIENT_OPTIONS)
|
35
35
|
super(message)
|
36
36
|
end
|
data/lib/azure/storage/core.rb
CHANGED
@@ -22,6 +22,7 @@
|
|
22
22
|
# THE SOFTWARE.
|
23
23
|
#--------------------------------------------------------------------------
|
24
24
|
|
25
|
-
|
26
25
|
require 'azure/storage/core/auth/shared_access_signature_generator'
|
27
|
-
require 'azure/storage/core/auth/shared_access_signature_signer'
|
26
|
+
require 'azure/storage/core/auth/shared_access_signature_signer'
|
27
|
+
|
28
|
+
include Azure::Storage::Auth
|
@@ -23,8 +23,8 @@
|
|
23
23
|
#--------------------------------------------------------------------------
|
24
24
|
|
25
25
|
require 'azure/storage/core'
|
26
|
-
require 'azure/storage/
|
27
|
-
require 'azure/
|
26
|
+
require 'azure/storage/client_options_error'
|
27
|
+
require 'azure/core/auth/signer'
|
28
28
|
require 'time'
|
29
29
|
require 'uri'
|
30
30
|
|
@@ -104,47 +104,60 @@ module Azure::Storage
|
|
104
104
|
service_type = options[:service_type] || Azure::Storage::ServiceType::BLOB
|
105
105
|
options.delete(:service_type) if options.key?(:service_type)
|
106
106
|
|
107
|
+
options[:start] = Time.parse(options[:start]).utc.iso8601 if options[:start]
|
108
|
+
options[:expiry] = Time.parse(options[:expiry]).utc.iso8601 if options[:expiry]
|
107
109
|
options[:expiry] ||= (Time.now + 60*30).utc.iso8601
|
108
110
|
|
109
111
|
raise InvalidOptionsError,"SAS version cannot be set" if options[:version]
|
110
112
|
|
111
|
-
|
113
|
+
options = DEFAULTS.merge(options)
|
112
114
|
valid_mappings = KEY_MAPPINGS
|
113
115
|
if service_type == Azure::Storage::ServiceType::BLOB
|
114
|
-
|
116
|
+
options.merge!(resource: 'b')
|
115
117
|
valid_mappings.merge!(BLOB_KEY_MAPPINGS)
|
116
118
|
elsif service_type == Azure::Storage::ServiceType::TABLE
|
117
|
-
|
119
|
+
options.merge!(tablename: path)
|
118
120
|
valid_mappings.merge!(TABLE_KEY_MAPPINGS)
|
119
121
|
end
|
120
122
|
|
121
123
|
invalid_options = options.reject { |k,v| valid_mappings.key?(k) }
|
122
124
|
raise InvalidOptionsError,"invalid options #{invalid_options} provided for SAS token generate" if invalid_options.length > 0
|
123
125
|
|
124
|
-
options.
|
125
|
-
|
126
|
+
query_hash = Hash[options.map { |k, v| [KEY_MAPPINGS[k], v] }]
|
127
|
+
.reject { |k, v| OPTIONAL_QUERY_PARAMS.include?(k) && v.to_s == '' }
|
128
|
+
.merge( sig: @signer.sign(signable_string(service_type, path, options)) )
|
129
|
+
|
130
|
+
sas_params = URI.encode_www_form(query_hash)
|
131
|
+
end
|
132
|
+
|
133
|
+
# Construct the plaintext to the spec required for signatures
|
134
|
+
# @return [String]
|
135
|
+
def signable_string(service_type, path, options)
|
126
136
|
# Order is significant
|
127
137
|
# The newlines from empty strings here are required
|
138
|
+
options[:start] = Time.parse(options[:start]).utc.iso8601 if options[:start]
|
139
|
+
options[:expiry] = Time.parse(options[:expiry]).utc.iso8601 if options[:expiry]
|
140
|
+
|
128
141
|
signable_string =
|
129
142
|
[
|
130
143
|
options[:permissions],
|
131
144
|
options[:start],
|
132
145
|
options[:expiry],
|
133
|
-
|
146
|
+
canonicalized_resource(service_type, path),
|
134
147
|
options[:identifier],
|
135
|
-
|
148
|
+
Azure::Storage::Default::STG_VERSION,
|
136
149
|
options[:cache_control],
|
137
150
|
options[:content_disposition],
|
138
151
|
options[:content_encoding],
|
139
152
|
options[:content_language],
|
140
153
|
options[:content_type]
|
141
154
|
].join("\n")
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
155
|
+
end
|
156
|
+
|
157
|
+
# Return the cononicalized resource representation of the blob resource
|
158
|
+
# @return [String]
|
159
|
+
def canonicalized_resource(service_type, path)
|
160
|
+
"/#{service_type}/#{account_name}#{path.start_with?('/') ? '' : '/'}#{path}"
|
148
161
|
end
|
149
162
|
|
150
163
|
# A customised URI reflecting options for the resource signed with Shared Access Signature
|
@@ -172,14 +185,14 @@ module Azure::Storage
|
|
172
185
|
# * +:endpk+ - String. The end partition key of a specified partition key range. Optional but endpk must accompany endrk.
|
173
186
|
# * +:startrk+ - String. The start row key of a specified row key range. Optional.
|
174
187
|
# * +:endrk+ - String. The end row key of a specified row key range. Optional.
|
175
|
-
def
|
188
|
+
def signed_uri(uri, options)
|
176
189
|
parsed_query = CGI::parse(uri.query || '').inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
|
177
|
-
|
190
|
+
|
178
191
|
if parsed_query.has_key?(:restype)
|
179
192
|
options[:resource] = parsed_query[:restype].first == 'container' ? 'c' : 'b'
|
180
193
|
end
|
181
194
|
|
182
|
-
if options[:service_type] == nil
|
195
|
+
if options[:service_type] == nil and uri.host != nil
|
183
196
|
host_splits = uri.host.split('.')
|
184
197
|
options[:service_type] = host_splits[1] if host_splits.length > 1 && host_splits[0] == account_name
|
185
198
|
end
|
@@ -22,53 +22,11 @@
|
|
22
22
|
# THE SOFTWARE.
|
23
23
|
#--------------------------------------------------------------------------
|
24
24
|
require 'cgi'
|
25
|
-
require 'azure/
|
25
|
+
require 'azure/core/auth/signer'
|
26
26
|
|
27
|
-
module Azure::Storage
|
27
|
+
module Azure::Storage::Core
|
28
28
|
module Auth
|
29
|
-
class SharedKey < Azure::Core::Auth::
|
30
|
-
# The Azure account's name.
|
31
|
-
attr :account_name
|
32
|
-
|
33
|
-
# Initialize the Signer.
|
34
|
-
#
|
35
|
-
# @param account_name [String] The account name. Defaults to the one in the
|
36
|
-
# global configuration.
|
37
|
-
# @param access_key [String] The access_key encoded in Base64. Defaults to the
|
38
|
-
# one in the global configuration.
|
39
|
-
def initialize(account_name=Azure::Storage.config.storage_account_name, access_key=Azure::Storage.config.storage_access_key)
|
40
|
-
@account_name = account_name
|
41
|
-
super(access_key)
|
42
|
-
end
|
43
|
-
|
44
|
-
# The name of the strategy.
|
45
|
-
#
|
46
|
-
# @return [String]
|
47
|
-
def name
|
48
|
-
'SharedKey'
|
49
|
-
end
|
50
|
-
|
51
|
-
# Create the signature for the request parameters
|
52
|
-
#
|
53
|
-
# @param method [Symbol] HTTP request method.
|
54
|
-
# @param uri [URI] URI of the request we're signing.
|
55
|
-
# @param headers [Hash] HTTP request headers.
|
56
|
-
#
|
57
|
-
# @return [String] base64 encoded signature
|
58
|
-
def sign(method, uri, headers)
|
59
|
-
"#{account_name}:#{super(signable_string(method, uri, headers))}"
|
60
|
-
end
|
61
|
-
|
62
|
-
# Sign the request
|
63
|
-
#
|
64
|
-
# @param req [Azure::Core::Http::HttpRequest] HTTP request to sign
|
65
|
-
#
|
66
|
-
# @return [Azure::Core::Http::HttpRequest]
|
67
|
-
def sign_request(req)
|
68
|
-
req.headers['Authorization'] = "#{name} #{sign(req.method, req.uri, req.headers)}"
|
69
|
-
req
|
70
|
-
end
|
71
|
-
|
29
|
+
class SharedKey < Azure::Core::Auth::SharedKey
|
72
30
|
# Generate the string to sign.
|
73
31
|
#
|
74
32
|
# @param method [Symbol] HTTP request method.
|
@@ -94,32 +52,6 @@ module Azure::Storage
|
|
94
52
|
canonicalized_resource(uri)
|
95
53
|
].join("\n")
|
96
54
|
end
|
97
|
-
|
98
|
-
# Calculate the Canonicalized Headers string for a request.
|
99
|
-
#
|
100
|
-
# @param headers [Hash] HTTP request headers.
|
101
|
-
#
|
102
|
-
# @return [String] a string with the canonicalized headers.
|
103
|
-
def canonicalized_headers(headers)
|
104
|
-
headers = headers.map { |k,v| [k.to_s.downcase, v] }
|
105
|
-
headers.select! { |k,v| k =~ /^x-ms-/ }
|
106
|
-
headers.sort_by! { |(k,v)| k }
|
107
|
-
headers.map! { |k,v| '%s:%s' % [k, v] }
|
108
|
-
headers.map! { |h| h.gsub(/\s+/, ' ') }.join("\n")
|
109
|
-
end
|
110
|
-
|
111
|
-
# Calculate the Canonicalized Resource string for a request.
|
112
|
-
#
|
113
|
-
# @param uri [URI] URI of the request we're signing.
|
114
|
-
#
|
115
|
-
# @return [String] a string with the canonicalized resource.
|
116
|
-
def canonicalized_resource(uri)
|
117
|
-
resource = '/' + account_name + (uri.path.empty? ? '/' : uri.path)
|
118
|
-
params = CGI.parse(uri.query.to_s).map { |k,v| [k.downcase, v] }
|
119
|
-
params.sort_by! { |k,v| k }
|
120
|
-
params.map! { |k,v| '%s:%s' % [k, v.map(&:strip).sort.join(',')] }
|
121
|
-
[resource, *params].join("\n")
|
122
|
-
end
|
123
55
|
end
|
124
56
|
end
|
125
|
-
end
|
57
|
+
end
|
@@ -23,13 +23,22 @@
|
|
23
23
|
#--------------------------------------------------------------------------
|
24
24
|
|
25
25
|
module Azure
|
26
|
-
module
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
26
|
+
module Storage
|
27
|
+
module Core
|
28
|
+
autoload :HttpClient, 'azure/storage/core/http_client'
|
29
|
+
autoload :Utility, 'azure/storage/core/utility'
|
30
|
+
autoload :Logger, 'azure/storage/core/utility'
|
31
|
+
autoload :Error, 'azure/storage/core/error'
|
32
|
+
|
33
|
+
module Auth
|
34
|
+
autoload :SharedKey, 'azure/storage/core/auth/shared_key.rb'
|
35
|
+
end
|
36
|
+
|
37
|
+
module Filter
|
38
|
+
autoload :RetryPolicyFilter, 'azure/storage/core/filter/retry_filter'
|
39
|
+
autoload :LinearRetryPolicyFilter, 'azure/storage/core/filter/linear_retry_filter'
|
40
|
+
autoload :ExponentialRetryPolicyFilter, 'azure/storage/core/filter/exponential_retry_filter'
|
41
|
+
end
|
42
|
+
end
|
34
43
|
end
|
35
44
|
end
|
@@ -21,15 +21,9 @@
|
|
21
21
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
22
|
# THE SOFTWARE.
|
23
23
|
#--------------------------------------------------------------------------
|
24
|
-
|
25
|
-
module Core
|
26
|
-
# Superclass for errors generated from this library, so people can
|
27
|
-
# just rescue this for generic error handling
|
28
|
-
class Error < StandardError;end
|
29
|
-
end
|
30
|
-
end
|
24
|
+
require 'azure/core'
|
31
25
|
|
32
|
-
module Azure::Storage
|
26
|
+
module Azure::Storage::Core
|
33
27
|
# Superclass for errors generated from this library, so people can
|
34
28
|
# just rescue this for generic error handling
|
35
29
|
class StorageError < StandardError
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#-------------------------------------------------------------------------
|
2
|
+
# # Copyright (c) Microsoft and contributors. All rights reserved.
|
3
|
+
#
|
4
|
+
# The MIT License(MIT)
|
5
|
+
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
# of this software and associated documentation files(the "Software"), to deal
|
8
|
+
# in the Software without restriction, including without limitation the rights
|
9
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
|
10
|
+
# copies of the Software, and to permit persons to whom the Software is
|
11
|
+
# furnished to do so, subject to the following conditions :
|
12
|
+
|
13
|
+
# The above copyright notice and this permission notice shall be included in
|
14
|
+
# all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
|
19
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
+
# THE SOFTWARE.
|
23
|
+
#--------------------------------------------------------------------------
|
24
|
+
require 'azure/core'
|
25
|
+
require 'azure/core/http/retry_policy'
|
26
|
+
|
27
|
+
module Azure::Storage::Core::Filter
|
28
|
+
class ExponentialRetryPolicyFilter < RetryPolicyFilter
|
29
|
+
def initialize(retry_count=nil, min_retry_interval=nil, max_retry_interval=nil)
|
30
|
+
@retry_count = retry_count || ExponentialRetryPolicyFilter::DEFAULT_RETRY_COUNT
|
31
|
+
@min_retry_interval = min_retry_interval || ExponentialRetryPolicyFilter::DEFAULT_MIN_RETRY_INTERVAL
|
32
|
+
@max_retry_interval = max_retry_interval || ExponentialRetryPolicyFilter::DEFAULT_MAX_RETRY_INTERVAL
|
33
|
+
|
34
|
+
super @retry_count, @min_retry_interval
|
35
|
+
end
|
36
|
+
|
37
|
+
attr_reader :min_retry_interval,
|
38
|
+
:max_retry_interval
|
39
|
+
|
40
|
+
DEFAULT_RETRY_COUNT = 3
|
41
|
+
DEFAULT_MIN_RETRY_INTERVAL = 10
|
42
|
+
DEFAULT_MAX_RETRY_INTERVAL = 90
|
43
|
+
|
44
|
+
# Overrides the base class implementation of call to determine
|
45
|
+
# how the HTTP request should continue retrying
|
46
|
+
#
|
47
|
+
# retry_data - Hash. Stores stateful retry data
|
48
|
+
#
|
49
|
+
# The retry_data is a Hash which can be used to store
|
50
|
+
# stateful data about the request execution context (such as an
|
51
|
+
# incrementing counter, timestamp, etc). The retry_data object
|
52
|
+
# will be the same instance throughout the lifetime of the request
|
53
|
+
def apply_retry_policy(retry_data)
|
54
|
+
# Adjust retry count
|
55
|
+
retry_data[:count] = retry_data[:count] === nil ? 1 : retry_data[:count] + 1
|
56
|
+
|
57
|
+
# Adjust retry interval
|
58
|
+
increment_delta = (@max_retry_interval - @min_retry_interval).fdiv(2 ** (@retry_count - 1)) * (2 ** (retry_data[:count] - 1));
|
59
|
+
retry_data[:interval] = retry_data[:interval] === nil ? @min_retry_interval : [@min_retry_interval + increment_delta, @max_retry_interval].min;
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|