Skip to content

Commit a173a47

Browse files
authored
feat: add retry_count opt in the retry middleware (#686)
1 parent ec423d7 commit a173a47

File tree

3 files changed

+27
-5
lines changed

3 files changed

+27
-5
lines changed

lib/tesla/middleware/retry.ex

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,18 @@ defmodule Tesla.Middleware.Retry do
8686
defp retry(env, next, %{max_retries: 0}), do: Tesla.run(env, next)
8787

8888
# If we're on our last retry then just run and don't handle the error
89-
defp retry(env, next, %{max_retries: max, retries: max}) do
90-
Tesla.run(env, next)
89+
defp retry(env, next, %{max_retries: max, retries: max} = context) do
90+
env
91+
|> put_retry_count_opt(context)
92+
|> Tesla.run(next)
9193
end
9294

9395
# Otherwise we retry if we get a retriable error
9496
defp retry(env, next, context) do
95-
res = Tesla.run(env, next)
97+
res =
98+
env
99+
|> put_retry_count_opt(context)
100+
|> Tesla.run(next)
96101

97102
{:arity, should_retry_arity} = :erlang.fun_info(context.should_retry, :arity)
98103

@@ -129,6 +134,15 @@ defmodule Tesla.Middleware.Retry do
129134
:timer.sleep(delay)
130135
end
131136

137+
defp put_retry_count_opt(env, %{retries: 0} = _context) do
138+
env
139+
end
140+
141+
defp put_retry_count_opt(env, context) do
142+
opts = Keyword.put(env.opts, :retry_count, context.retries)
143+
%{env | opts: opts}
144+
end
145+
132146
defp integer_opt!(opts, key, min) do
133147
case Keyword.fetch(opts, key) do
134148
{:ok, value} when is_integer(value) and value >= min -> value

mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ defmodule Tesla.Mixfile do
22
use Mix.Project
33

44
@source_url "https://github.com/teamon/tesla"
5-
@version "1.10.3"
5+
@version "1.11.0"
66

77
def project do
88
[

test/tesla/middleware/retry_test.exs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,15 @@ defmodule Tesla.Middleware.RetryTest do
7575
end
7676

7777
test "finally pass on laggy request" do
78-
assert {:ok, %Tesla.Env{url: "/maybe", method: :get}} = Client.get("/maybe")
78+
assert {:ok, %Tesla.Env{url: "/maybe", method: :get}} = Client.get("/maybe") |> dbg()
79+
end
80+
81+
test "pass retry_count opt" do
82+
assert {:ok, env} = Client.get("/maybe")
83+
assert env.opts[:retry_count] == 5
84+
85+
assert {:ok, env} = Client.get("/ok")
86+
assert env.opts[:retry_count] == nil
7987
end
8088

8189
test "raise if max_retries is exceeded" do

0 commit comments

Comments
 (0)