logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

connection_pool.ex (1467B)


  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Tesla.Middleware.ConnectionPool do
  5. @moduledoc """
  6. Middleware to get/release connections from `Pleroma.Gun.ConnectionPool`
  7. """
  8. @behaviour Tesla.Middleware
  9. alias Pleroma.Gun.ConnectionPool
  10. @impl Tesla.Middleware
  11. def call(%Tesla.Env{url: url, opts: opts} = env, next, _) do
  12. uri = URI.parse(url)
  13. # Avoid leaking connections when the middleware is called twice
  14. # with body_as: :chunks. We assume only the middleware can set
  15. # opts[:adapter][:conn]
  16. if opts[:adapter][:conn] do
  17. ConnectionPool.release_conn(opts[:adapter][:conn])
  18. end
  19. case ConnectionPool.get_conn(uri, opts[:adapter]) do
  20. {:ok, conn_pid} ->
  21. adapter_opts = Keyword.merge(opts[:adapter], conn: conn_pid, close_conn: false)
  22. opts = Keyword.put(opts, :adapter, adapter_opts)
  23. env = %{env | opts: opts}
  24. case Tesla.run(env, next) do
  25. {:ok, env} ->
  26. unless opts[:adapter][:body_as] == :chunks do
  27. ConnectionPool.release_conn(conn_pid)
  28. {_, res} = pop_in(env.opts[:adapter][:conn])
  29. {:ok, res}
  30. else
  31. {:ok, env}
  32. end
  33. err ->
  34. ConnectionPool.release_conn(conn_pid)
  35. err
  36. end
  37. err ->
  38. err
  39. end
  40. end
  41. end