Page MenuHomePhorge

No OneTemporary

Authored By
Unknown
Size
2 KB
Referenced Files
None
Subscribers
None
diff --git a/lib/tesla/middleware/tuples.ex b/lib/tesla/middleware/tuples.ex
index 174af88..63f5a3a 100644
--- a/lib/tesla/middleware/tuples.ex
+++ b/lib/tesla/middleware/tuples.ex
@@ -1,22 +1,48 @@
defmodule Tesla.Middleware.Tuples do
@moduledoc """
Return :ok/:error tuples for successful HTTP transations, i.e. when the request is completed
(no network errors etc) - but it can still be an application-level error (i.e. 404 or 500).
**NOTE**: This middleware must be included as the first in the stack (before other middleware)
## Example usage
defmodule MyClient do
use Tesla
plug Tesla.Middleware.Tuples
plug Tesla.Middleware.Json
end
+
+ The default behaviour is to rescue Tesla.Error exceptions but let other pass through.
+ It can be customized by passing a `rescue_error:` option:
+
+ ## Rescue other exceptions
+
+ plug Tesla.Middleware.Tuples, rescue_errors: [MyCustomError]
+
+ ## Rescue all exceptions
+
+ plug Tesla.Middleware.Tuples, rescue_errors: :all
+
"""
- def call(env, next, _opts) do
+ def call(env, next, opts) do
{:ok, Tesla.run(env, next)}
rescue
- ex in Tesla.Error -> {:error, ex}
+ ex in Tesla.Error ->
+ {:error, ex}
+ ex ->
+ case opts[:rescue_errors] do
+ nil ->
+ reraise ex, System.stacktrace()
+ :all ->
+ {:error, ex}
+ list ->
+ if ex.__struct__ in list do
+ {:error, ex}
+ else
+ reraise ex, System.stacktrace()
+ end
+ end
end
end
diff --git a/test/tesla/middleware/tuples_test.exs b/test/tesla/middleware/tuples_test.exs
index aa041d5..60549e1 100644
--- a/test/tesla/middleware/tuples_test.exs
+++ b/test/tesla/middleware/tuples_test.exs
@@ -1,25 +1,38 @@
defmodule TuplesTest do
use ExUnit.Case, async: false
+ defmodule Custom1, do: defexception message: "Custom 1"
+ defmodule Custom2, do: defexception message: "Custom 2"
+
defmodule Client do
use Tesla
- plug Tesla.Middleware.Tuples
+ plug Tesla.Middleware.Tuples, rescue_errors: [Custom1]
plug Tesla.Middleware.JSON
adapter fn env ->
case env.url do
"/ok" -> env
"/econnrefused" -> {:error, :econnrefused}
+ "/custom-1" -> raise %Custom1{}
+ "/custom-2" -> raise %Custom2{}
end
end
end
test "return {:ok, env} for successful transaction" do
assert {:ok, %Tesla.Env{}} = Client.get("/ok")
end
test "return {:error, reason} for unsuccessful transaction" do
assert {:error, %Tesla.Error{}} = Client.get("/econnrefused")
end
+
+ test "rescue listed custom exception" do
+ assert {:error, %Custom1{}} = Client.get("/custom-1")
+ end
+
+ test "do not rescue not-listed custom exception" do
+ assert catch_error(Client.get("/custom-2"))
+ end
end

File Metadata

Mime Type
text/x-diff
Expires
Thu, Oct 29, 4:23 AM (3 h, 39 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1797532
Default Alt Text
(2 KB)

Event Timeline