Skip to content

Commit 9ae04b8

Browse files
committed
Add Octokit::Middleware::Retry
Octokit::Middleware::Retry allows incorporating the retry logic without relying on the default middleware stack.
1 parent cca2d80 commit 9ae04b8

File tree

4 files changed

+47
-1
lines changed

4 files changed

+47
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,7 @@ traffic:
597597

598598
```ruby
599599
stack = Faraday::RackBuilder.new do |builder|
600-
builder.use Faraday::Retry::Middleware, exceptions: Faraday::Request::Retry::DEFAULT_EXCEPTIONS + [Octokit::ServerError] # or Faraday::Request::Retry for Faraday < 2.0
600+
builder.use Octokit::Middleware::Retry
601601
builder.use Octokit::Middleware::FollowRedirects
602602
builder.use Octokit::Response::RaiseError
603603
builder.use Octokit::Response::FeedParser

lib/octokit.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,12 @@ def method_missing(method_name, *args, &block)
7676
super
7777
end
7878
end
79+
80+
module Middleware
81+
# In Faraday 2.x, Faraday::Request::Retry was moved to a separate gem
82+
# so we use it only when requested.
83+
autoload :Retry, 'octokit/middleware/retry'
84+
end
7985
end
8086

8187
Octokit.setup

lib/octokit/middleware/retry.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# frozen_string_literal: true
2+
3+
module Octokit
4+
module Middleware
5+
base = if defined?(Faraday::Request::Retry)
6+
Faraday::Request::Retry
7+
else
8+
require 'faraday/retry'
9+
Faraday::Retry::Middleware
10+
end
11+
12+
# Public: Retries each request a limited number of times.
13+
class Retry < base
14+
def initialize(app, **kwargs)
15+
super(app, **kwargs, exceptions: DEFAULT_EXCEPTIONS + [Octokit::ServerError])
16+
end
17+
end
18+
end
19+
end

spec/octokit/client_spec.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,27 @@
514514
end
515515
end
516516

517+
describe 'retry' do
518+
it 'retries for 504 response' do
519+
client = oauth_client
520+
client.middleware.insert Octokit::Response::RaiseError, Octokit::Middleware::Retry
521+
522+
requested = false
523+
524+
request = stub_get('/foo').to_return do
525+
if requested
526+
{ status: 200 }
527+
else
528+
requested = true
529+
{ status: 504 }
530+
end
531+
end
532+
533+
client.get('/foo')
534+
assert_requested request, times: 2
535+
end
536+
end
537+
517538
describe 'redirect handling' do
518539
it 'follows redirect for 301 response' do
519540
client = oauth_client

0 commit comments

Comments
 (0)