Page MenuHomePhorge

No OneTemporary

Size
4 KB
Referenced Files
None
Subscribers
None
diff --git a/lib/tesla/middleware/retry.ex b/lib/tesla/middleware/retry.ex
index 6e0571c..a7ca616 100644
--- a/lib/tesla/middleware/retry.ex
+++ b/lib/tesla/middleware/retry.ex
@@ -1,58 +1,59 @@
defmodule Tesla.Middleware.Retry do
@behaviour Tesla.Middleware
@moduledoc """
Retry the HTTP call in case of connection error by default (`nxdomain`, `connrefused` etc).
Application error checking for retry can be customized through should_retry options by
providing a function in returning a boolean.
### Example
```
defmodule MyClient do
use Tesla
plug Tesla.Middleware.Retry,
delay: 500,
max_retries: 10,
should_retry: fn
{:ok, %{status: status}} when status in [400, 500] -> true
{:ok, _} -> false
{:error, _} -> true
end
end
```
### Options
- `:delay` - number of milliseconds to wait before retrying (defaults to 1000)
- `:max_retries` - maximum number of retries (defaults to 5)
- `:should_retry` - function to determine if request should be retried
"""
@defaults [
delay: 1000,
max_retries: 5
]
@doc false
def call(env, next, opts) do
opts = opts || []
delay = Keyword.get(opts, :delay, @defaults[:delay])
max_retries = Keyword.get(opts, :max_retries, @defaults[:max_retries])
should_retry = Keyword.get(opts, :should_retry, &match?({:error, _}, &1))
retry(env, next, delay, max_retries, should_retry)
end
defp retry(env, next, _delay, retries, _should_retry) when retries <= 1 do
Tesla.run(env, next)
end
defp retry(env, next, delay, retries, should_retry) do
- if should_retry.(Tesla.run(env, next)) do
+ res = Tesla.run(env, next)
+ if should_retry.(res) do
:timer.sleep(delay)
retry(env, next, delay, retries - 1, should_retry)
else
- {:ok, env}
+ res
end
end
end
diff --git a/test/tesla/middleware/retry_test.exs b/test/tesla/middleware/retry_test.exs
index 04f3638..84a49e8 100644
--- a/test/tesla/middleware/retry_test.exs
+++ b/test/tesla/middleware/retry_test.exs
@@ -1,88 +1,81 @@
defmodule Tesla.Middleware.RetryTest do
use ExUnit.Case, async: false
defmodule LaggyAdapter do
def start_link, do: Agent.start_link(fn -> 0 end, name: __MODULE__)
def call(env, _opts) do
Agent.get_and_update(__MODULE__, fn retries ->
response =
case env.url do
"/ok" -> {:ok, env}
"/maybe" when retries < 5 -> {:error, :econnrefused}
"/maybe" -> {:ok, env}
"/nope" -> {:error, :econnrefused}
- "/retry_status" -> {:ok, %{status: 500}}
+ "/retry_status" when retries < 5 -> {:ok, %{env | status: 500}}
+ "/retry_status" -> {:ok, %{env | status: 200}}
end
{response, retries + 1}
end)
end
end
defmodule Client do
use Tesla
plug Tesla.Middleware.Retry,
delay: 10,
max_retries: 10
adapter LaggyAdapter
end
defmodule ClientWithShouldRetryFunction do
use Tesla
plug Tesla.Middleware.Retry,
delay: 10,
max_retries: 10,
should_retry: fn
- {:ok, %{status: status}} when status in [400, 500] ->
- assert true
- true
-
- {:ok, _} ->
- assert false
- false
-
- {:error, _} ->
- assert false
- true
+ {:ok, %{status: status}} when status in [400, 500] -> true
+ {:ok, _} -> false
+ {:error, _} -> true
end
adapter LaggyAdapter
end
setup do
{:ok, _} = LaggyAdapter.start_link()
:ok
end
test "pass on successful request" do
assert {:ok, %Tesla.Env{url: "/ok", method: :get}} = Client.get("/ok")
end
test "finally pass on laggy request" do
assert {:ok, %Tesla.Env{url: "/maybe", method: :get}} = Client.get("/maybe")
end
test "raise if max_retries is exceeded" do
assert {:error, :econnrefused} = Client.get("/nope")
end
test "use custom retry determination function" do
- assert {:ok, %{status: 500}} = ClientWithShouldRetryFunction.get("/retry_status")
+ assert {:ok, %Tesla.Env{url: "/retry_status", method: :get, status: 200}} = ClientWithShouldRetryFunction.get("/retry_status")
end
defmodule DefunctClient do
use Tesla
plug Tesla.Middleware.Retry
adapter fn _ -> raise "runtime-error" end
end
test "raise in case or unexpected error" do
assert_raise RuntimeError, fn -> DefunctClient.get("/blow") end
end
end

File Metadata

Mime Type
text/x-diff
Expires
Sat, Sep 19, 7:44 AM (1 d, 18 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1766281
Default Alt Text
(4 KB)

Event Timeline