aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma/tesla/middleware
diff options
context:
space:
mode:
authorrinpatch <rinpatch@sdf.org>2020-09-04 22:10:40 +0300
committerrinpatch <rinpatch@sdf.org>2020-09-04 22:10:40 +0300
commit10da13c71343623a5e52beebdc6abc1f400bc40d (patch)
treecff977adf698a197639073a7c2ad92848aa5460b /lib/pleroma/tesla/middleware
parent2b04cdf407c9ce4134a0fe448b7f8dff7f6ff57f (diff)
downloadpleroma-10da13c71343623a5e52beebdc6abc1f400bc40d.tar.gz
ConnectionPool middleware: Fix connection leak on ReverseProxy redirects
Requires a patched Tesla due to upstream not saving opts between redirects, patch submitted at https://github.com/teamon/tesla/pull/414
Diffstat (limited to 'lib/pleroma/tesla/middleware')
-rw-r--r--lib/pleroma/tesla/middleware/connection_pool.ex27
1 files changed, 19 insertions, 8 deletions
diff --git a/lib/pleroma/tesla/middleware/connection_pool.ex b/lib/pleroma/tesla/middleware/connection_pool.ex
index a435ab4cc..5909e98d6 100644
--- a/lib/pleroma/tesla/middleware/connection_pool.ex
+++ b/lib/pleroma/tesla/middleware/connection_pool.ex
@@ -15,21 +15,32 @@ defmodule Pleroma.Tesla.Middleware.ConnectionPool do
def call(%Tesla.Env{url: url, opts: opts} = env, next, _) do
uri = URI.parse(url)
+ # Avoid leaking connections when the middleware is called twice
+ # with body_as: :chunks. We assume only the middleware can set
+ # opts[:adapter][:conn]
+ if opts[:adapter][:conn] do
+ ConnectionPool.release_conn(opts[:adapter][:conn])
+ end
+
case ConnectionPool.get_conn(uri, opts[:adapter]) do
{:ok, conn_pid} ->
adapter_opts = Keyword.merge(opts[:adapter], conn: conn_pid, close_conn: false)
opts = Keyword.put(opts, :adapter, adapter_opts)
env = %{env | opts: opts}
- res = Tesla.run(env, next)
- unless opts[:adapter][:body_as] == :chunks do
- ConnectionPool.release_conn(conn_pid)
+ case Tesla.run(env, next) do
+ {:ok, env} ->
+ unless opts[:adapter][:body_as] == :chunks do
+ ConnectionPool.release_conn(conn_pid)
+ {:ok, pop_in(env[:opts][:adapter][:conn])}
+ else
+ {:ok, env}
+ end
+
+ err ->
+ ConnectionPool.release_conn(conn_pid)
+ err
end
-
- res
-
- err ->
- err
end
end
end