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
This commit is contained in:
rinpatch 2020-09-04 22:10:40 +03:00
commit 10da13c713
3 changed files with 23 additions and 10 deletions

View file

@ -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