+
+ @spec request(Client.t(), keyword(), map()) :: {:ok, Env.t()} | {:error, any()}
+ def request(%Client{} = client, request, %{env: :test}), do: request_try(client, request)
+
+ def request(%Client{} = client, request, %{body_as: :chunks}) do
+ request_try(client, request)
+ end
+
+ def request(%Client{} = client, request, %{pool_alive?: false}) do
+ request_try(client, request)
+ end
+
+ def request(%Client{} = client, request, %{pool: pool, timeout: timeout}) do
+ try do
+ :poolboy.transaction(
+ pool,
+ &Pleroma.Pool.Request.execute(&1, client, request, timeout + 500),
+ timeout + 1_000
+ )
+ rescue
+ e ->
+ {:error, e}
+ catch
+ :exit, {:timeout, _} ->
+ Logger.warn("Receive response from pool failed #{request[:url]}")
+ {:error, :recv_pool_timeout}
+
+ :exit, e ->
+ {:error, e}
+ end
+ end
+
+ @spec request_try(Client.t(), keyword()) :: {:ok, Env.t()} | {:error, any()}
+ def request_try(client, request) do
+ try do
+ Tesla.request(client, request)
+ rescue
+ e ->
+ {:error, e}
+ catch
+ :exit, e ->
+ {:error, e}
+ end
+ end
+
+ defp build_request(method, headers, options, url, body, params) do
+ Builder.new()
+ |> Builder.method(method)
+ |> Builder.headers(headers)
+ |> Builder.opts(options)
+ |> Builder.url(url)
+ |> Builder.add_param(:body, :body, body)
+ |> Builder.add_param(:query, :query, params)
+ |> Builder.convert_to_keyword()
+ end
+
+ defp tesla_adapter, do: Application.get_env(:tesla, :adapter)