diff options
author | lain <lain@soykaf.club> | 2020-09-07 15:00:14 +0200 |
---|---|---|
committer | lain <lain@soykaf.club> | 2020-09-07 15:00:14 +0200 |
commit | d00f74e036735c1c238f661076f2925b39daa6ac (patch) | |
tree | d70d9fcfb1b815406b739ac5b012846fd0622a2f /lib/pleroma/tesla | |
parent | bb007b9298b514c305dff944bef8463ffe1596a8 (diff) | |
parent | 6c6de8e5dfaf245e4e16ddca0c741342eeaa9187 (diff) | |
download | pleroma-matrix-explorations.tar.gz |
Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into matrix-explorationsmatrix-explorations
Diffstat (limited to 'lib/pleroma/tesla')
-rw-r--r-- | lib/pleroma/tesla/middleware/connection_pool.ex | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/lib/pleroma/tesla/middleware/connection_pool.ex b/lib/pleroma/tesla/middleware/connection_pool.ex index a435ab4cc..056e736ce 100644 --- a/lib/pleroma/tesla/middleware/connection_pool.ex +++ b/lib/pleroma/tesla/middleware/connection_pool.ex @@ -15,19 +15,34 @@ 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) + {_, res} = pop_in(env.opts[:adapter][:conn]) + {:ok, res} + else + {:ok, env} + end + + err -> + ConnectionPool.release_conn(conn_pid) + err end - res - err -> err end |