faraday_middleware-request-retry 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +2 -0
- data/README.md +14 -0
- data/lib/faraday_middleware-request-retry/retry.rb +39 -19
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0ca0587453305189b8a204f3d68cb995c9570854
|
4
|
+
data.tar.gz: 9865555586b7328f99d5980f7cecbe6b6f1b90a3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1af7393a7fdef619daba5a1c088e33786cf45922a214bdd3423e1f3edf4f585c62264bf12020e081c49896e5412ed2d4ac315e63baf207dc6ed5ce24abc24dee
|
7
|
+
data.tar.gz: 37a0981c817b5f2d4a01d77889d21acd4b52bb24498a9f2b0cb46e240b442a79491911898846deb5fa6181488e314ecf567ded441a0bd5d9d3dedfb6b0bc608f
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -61,6 +61,20 @@ Options include:
|
|
61
61
|
| `:retry_after` | Default retry seconds | optional | `10` seconds |
|
62
62
|
| `:error_codes` | Array of error codes, e.g. `[429, 503, 504]` | optional | `[429, 503]` |
|
63
63
|
|
64
|
+
### External Use
|
65
|
+
|
66
|
+
The core retry functionality can be used separately from Faraday when necessary. For example, when requests cannot be replayed, e.g. when `Faraday::UploadIO` is used.
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
res = faraday_client.get '/my_url'
|
70
|
+
|
71
|
+
retry_util = FaradayMiddleware::Request::RetryUtil.new
|
72
|
+
|
73
|
+
# The following will return `true` for retry, `false` for don't,
|
74
|
+
# while sleeping when necessary
|
75
|
+
want_retry = retry_util.retry_status res.status, res.headers['Retry-After']
|
76
|
+
```
|
77
|
+
|
64
78
|
## Change Log
|
65
79
|
|
66
80
|
See [CHANGELOG.md](CHANGELOG.md)
|
@@ -4,34 +4,20 @@ module FaradayMiddleware
|
|
4
4
|
module Request
|
5
5
|
# Faraday middleware to handle HTTP Status 429 (rate limiting) / 503 (maintenance)
|
6
6
|
class Retry < Faraday::Middleware
|
7
|
-
|
8
|
-
ERROR_CODES = [429, 503]
|
9
|
-
|
10
|
-
attr_reader :error_codes
|
11
|
-
attr_reader :retry_after
|
7
|
+
attr_reader :retry_util
|
12
8
|
|
13
|
-
def initialize(app,
|
9
|
+
def initialize(app, opts = {})
|
14
10
|
super app
|
15
|
-
@
|
16
|
-
@error_codes = options[:error_codes] || ERROR_CODES
|
17
|
-
@retry_after = options[:retry_after] || DEFAULT_RETRY_AFTER
|
11
|
+
@retry_util = FaradayMiddleware::Request::RetryUtil.new opts
|
18
12
|
end
|
19
13
|
|
20
14
|
def call(env)
|
21
15
|
original_env = env.dup
|
22
16
|
response = @app.call env
|
23
17
|
|
24
|
-
|
25
|
-
seconds_left = (response.env[:response_headers][:retry_after] || @retry_after).to_i
|
26
|
-
@logger.warn "You have been rate limited. Retrying in #{seconds_left} seconds..." if @logger
|
18
|
+
retry_status = @retry_util.retry_status response.env[:status], response.env[:response_headers][:retry_after]
|
27
19
|
|
28
|
-
|
29
|
-
sleep 1
|
30
|
-
time_left = seconds_left - i
|
31
|
-
@logger.warn "#{time_left}..." if time_left > 0 && time_left % 5 == 0 && @logger
|
32
|
-
end
|
33
|
-
|
34
|
-
@logger.warn 'Retrying...' if @logger
|
20
|
+
if retry_status
|
35
21
|
@app.call original_env
|
36
22
|
else
|
37
23
|
response
|
@@ -40,3 +26,37 @@ module FaradayMiddleware
|
|
40
26
|
end
|
41
27
|
end
|
42
28
|
end
|
29
|
+
|
30
|
+
module FaradayMiddleware
|
31
|
+
module Request
|
32
|
+
# Standalone HTTP request retry utility class
|
33
|
+
# Can be used outside of FaradayMiddleware, e.g.
|
34
|
+
# when Faraday::UploadIO is used
|
35
|
+
class RetryUtil
|
36
|
+
DEFAULT_ERROR_CODES = [429, 503].freeze
|
37
|
+
DEFAULT_RETRY_AFTER = 10
|
38
|
+
|
39
|
+
attr_accessor :error_codes
|
40
|
+
attr_accessor :retry_after
|
41
|
+
|
42
|
+
def initialize(opts = {})
|
43
|
+
@error_codes = opts[:error_codes] || DEFAULT_ERROR_CODES
|
44
|
+
@retry_after = opts[:retry_after] || DEFAULT_RETRY_AFTER
|
45
|
+
@logger = opts[:logger]
|
46
|
+
end
|
47
|
+
|
48
|
+
def retry_status(status, this_retry_after = nil)
|
49
|
+
return false unless @error_codes.include? status
|
50
|
+
seconds_left = (this_retry_after || @retry_after).to_i
|
51
|
+
@logger.warn "You have been rate limited. Retrying in #{seconds_left} seconds..." if @logger
|
52
|
+
seconds_left.times do |i|
|
53
|
+
sleep 1
|
54
|
+
time_left = seconds_left - i
|
55
|
+
@logger.warn "#{time_left}..." if time_left > 0 && time_left % 5 == 0 && @logger
|
56
|
+
end
|
57
|
+
@logger.warn 'Retrying...' if @logger
|
58
|
+
true
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: faraday_middleware-request-retry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Wang
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-12-
|
11
|
+
date: 2016-12-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|