Skip to content

Commit ca6f113

Browse files
committed
Handle Mint.TransportError and additional logging
1 parent 521a83c commit ca6f113

File tree

2 files changed

+55
-19
lines changed

2 files changed

+55
-19
lines changed

lib/http_client/adapters/finch.ex

Lines changed: 53 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,29 +15,59 @@ defmodule HTTPClient.Adapters.Finch do
1515
Performs the request using `Finch`.
1616
"""
1717
def perform_request(request) do
18-
options = prepare_options(request.options)
19-
20-
request.method
21-
|> Finch.build(request.url, request.headers, request.body)
22-
|> Finch.request(request.private.finch_name, options)
23-
|> case do
24-
{:ok, %{status: status, body: body, headers: headers}} ->
25-
{request,
26-
Response.new(status: status, body: body, headers: headers, request_url: request.url)}
27-
28-
{:error, exception} ->
18+
{request, options} = prepare_options(request)
19+
20+
maybe_log_operation(request, "started")
21+
22+
try do
23+
request.method
24+
|> Finch.build(request.url, request.headers, request.body)
25+
|> Finch.request(request.private.finch_name, options)
26+
|> case do
27+
{:ok, %{status: status, body: body, headers: headers}} ->
28+
maybe_log_operation(request, "done")
29+
30+
{request,
31+
Response.new(status: status, body: body, headers: headers, request_url: request.url)}
32+
33+
{:error, exception} ->
34+
log_operation(request, Exception.format(:error, exception))
35+
{request, exception}
36+
end
37+
rescue
38+
exception ->
39+
log_operation(request, Exception.format(:error, exception))
2940
{request, exception}
3041
end
3142
end
3243

44+
def maybe_log_operation(request, message) do
45+
with true <- log_operation?() do
46+
log_operation(request, message)
47+
end
48+
end
49+
50+
def log_operation(request, message) do
51+
IO.inspect("proxy: #{Jason.encode!(request.private.proxy)}. #{message}",
52+
label: "#{request.private.finch_name} #{request.private.logger_context}"
53+
)
54+
end
55+
3356
@doc false
3457
def proxy(request) do
3558
tls_versions = Map.get(request.options, :tls_versions, [:"tlsv1.2", :"tlsv1.3"])
36-
Request.put_private(request, :finch_name, get_client(tls_versions))
59+
{finch_name, used_proxy} = get_client(tls_versions)
60+
61+
request
62+
|> Request.put_private(:finch_name, finch_name)
63+
|> Request.put_private(:proxy, used_proxy)
3764
end
3865

39-
defp prepare_options(options) do
40-
Enum.map(options, &normalize_option/1)
66+
defp prepare_options(request) do
67+
{logger_context, options} = Map.pop(request.options, :logger_context)
68+
69+
{Request.put_private(request, :logger_context, logger_context),
70+
Enum.map(options, &normalize_option/1)}
4171
end
4272

4373
defp normalize_option({:timeout, value}), do: {:pool_timeout, value}
@@ -50,7 +80,7 @@ defmodule HTTPClient.Adapters.Finch do
5080
|> get_client_name(tls_versions)
5181
end
5282

53-
defp get_client_name(nil, _tls_versions), do: HTTPClient.Finch
83+
defp get_client_name(nil, _tls_versions), do: {HTTPClient.Finch, {}}
5484

5585
defp get_client_name(proxies, tls_versions) when is_list(proxies) do
5686
proxies
@@ -60,11 +90,12 @@ defmodule HTTPClient.Adapters.Finch do
6090

6191
defp get_client_name(proxy, tls_versions) when is_map(proxy) do
6292
name = custom_pool_name(proxy)
93+
composed_proxy = compose_proxy(proxy)
6394

6495
pools = %{
6596
default: [
6697
conn_opts: [
67-
proxy: compose_proxy(proxy),
98+
proxy: composed_proxy,
6899
proxy_headers: compose_proxy_headers(proxy),
69100
transport_opts: [versions: tls_versions]
70101
]
@@ -74,8 +105,8 @@ defmodule HTTPClient.Adapters.Finch do
74105
child_spec = {Finch, name: name, pools: pools}
75106

76107
case DynamicSupervisor.start_child(HTTPClient.FinchSupervisor, child_spec) do
77-
{:ok, _} -> name
78-
{:error, {:already_started, _}} -> name
108+
{:ok, _} -> {name, composed_proxy}
109+
{:error, {:already_started, _}} -> {name, composed_proxy}
79110
end
80111
end
81112

@@ -101,4 +132,8 @@ defmodule HTTPClient.Adapters.Finch do
101132

102133
Module.concat(HTTPClient.FinchSupervisor, "Pool_#{name}")
103134
end
135+
136+
defp log_operation? do
137+
Application.get_env(:http_client, :log_operation, false)
138+
end
104139
end

lib/http_client/adapters/httpoison.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ defmodule HTTPClient.Adapters.HTTPoison do
1515
Performs the request using `HTTPoison`.
1616
"""
1717
def perform_request(request) do
18-
options = Map.to_list(request.options)
18+
{_logger_context, options} = Map.pop(request.options, :logger_context)
19+
options = Map.to_list(options)
1920

2021
case HTTPoison.request(request.method, request.url, request.body, request.headers, options) do
2122
{:ok, %{status_code: status, body: body, headers: headers}} ->

0 commit comments

Comments
 (0)