Merge branch 'fix/rich-media-fake-statuses' into 'develop'
[akkoma] / lib / pleroma / tesla / middleware / connection_pool.ex
index a435ab4cc5232ab39646fa73687eb7e862a29a35..056e736ce8fd82d281ac417d9d22a9ea07056f4e 100644 (file)
@@ -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