@@ -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
104139end
0 commit comments