diff options
author | rinpatch <rinpatch@sdf.org> | 2020-09-05 17:47:12 +0000 |
---|---|---|
committer | rinpatch <rinpatch@sdf.org> | 2020-09-05 17:47:12 +0000 |
commit | 8c8fb84a38de31e7ef95661ea162bf2aded8967b (patch) | |
tree | cd696408df7613a2f3de354be0ba877733f271db /lib | |
parent | da4660d2bfd7cc8fe19649c4b51d86ee414b84e1 (diff) | |
parent | 10da13c71343623a5e52beebdc6abc1f400bc40d (diff) | |
download | pleroma-8c8fb84a38de31e7ef95661ea162bf2aded8967b.tar.gz |
Merge branch 'fix/pool-middleware-reverseproxy-leak' into 'develop'
ConnectionPool middleware: Fix connection leak on ReverseProxy redirects
See merge request pleroma/pleroma!2954
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/tesla/middleware/connection_pool.ex | 27 |
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 |