X-Git-Url: https://git.squeep.com/?a=blobdiff_plain;f=lib%2Fpleroma%2Ftesla%2Fmiddleware%2Fconnection_pool.ex;h=906706d39a45b1817782e08ab38a7b21ab76e138;hb=2fe1484ed35d4537249a28e444a1fe3e82cfa382;hp=a435ab4cc5232ab39646fa73687eb7e862a29a35;hpb=d34fe2840d969c30b393cfb73e34b6301027c776;p=akkoma
diff --git a/lib/pleroma/tesla/middleware/connection_pool.ex b/lib/pleroma/tesla/middleware/connection_pool.ex
index a435ab4cc..906706d39 100644
--- a/lib/pleroma/tesla/middleware/connection_pool.ex
+++ b/lib/pleroma/tesla/middleware/connection_pool.ex
@@ -1,5 +1,5 @@
# Pleroma: A lightweight social networking server
-# Copyright © 2020 Pleroma Authors
+# Copyright © 2017-2021 Pleroma Authors
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Tesla.Middleware.ConnectionPool do
@@ -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