Pleroma/lib/pleroma/http/adapter_helper/gun.ex

83 lines
2.1 KiB
Elixir
Raw Normal View History

2020-02-11 08:12:57 +01:00
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
2020-02-11 08:12:57 +01:00
# SPDX-License-Identifier: AGPL-3.0-only
2020-03-03 16:53:44 +01:00
defmodule Pleroma.HTTP.AdapterHelper.Gun do
@behaviour Pleroma.HTTP.AdapterHelper
2020-02-11 08:12:57 +01:00
alias Pleroma.Config
2020-03-06 19:04:18 +01:00
alias Pleroma.HTTP.AdapterHelper
2020-02-11 08:12:57 +01:00
2020-03-06 19:24:19 +01:00
require Logger
2020-02-11 08:12:57 +01:00
@defaults [
retry: 1,
retry_timeout: 1_000
2020-02-11 08:12:57 +01:00
]
@type pool() :: :federation | :upload | :media | :default
2020-02-11 08:12:57 +01:00
@spec options(keyword(), URI.t()) :: keyword()
2020-03-12 16:28:54 +01:00
def options(incoming_opts \\ [], %URI{} = uri) do
proxy =
[:http, :proxy_url]
|> Config.get()
2020-03-06 19:04:18 +01:00
|> AdapterHelper.format_proxy()
config_opts = Config.get([:http, :adapter], [])
2020-02-11 08:12:57 +01:00
@defaults
2020-03-06 19:04:18 +01:00
|> Keyword.merge(config_opts)
2020-02-11 08:12:57 +01:00
|> add_scheme_opts(uri)
2020-03-12 16:28:54 +01:00
|> AdapterHelper.maybe_add_proxy(proxy)
|> Keyword.merge(incoming_opts)
|> put_timeout()
2020-02-11 08:12:57 +01:00
end
2020-03-12 16:28:54 +01:00
defp add_scheme_opts(opts, %{scheme: "http"}), do: opts
2020-02-11 08:12:57 +01:00
2020-03-12 16:28:54 +01:00
defp add_scheme_opts(opts, %{scheme: "https"}) do
Keyword.put(opts, :certificates_verification, true)
2020-02-11 08:12:57 +01:00
end
defp put_timeout(opts) do
{recv_timeout, opts} = Keyword.pop(opts, :recv_timeout, pool_timeout(opts[:pool]))
# this is the timeout to receive a message from Gun
# `:timeout` key is used in Tesla
Keyword.put(opts, :timeout, recv_timeout)
end
@spec pool_timeout(pool()) :: non_neg_integer()
def pool_timeout(pool) do
default = Config.get([:pools, :default, :recv_timeout], 5_000)
Config.get([:pools, pool, :recv_timeout], default)
end
2020-05-17 21:16:02 +02:00
@prefix Pleroma.Gun.ConnectionPool
def limiter_setup do
wait = Config.get([:connections_pool, :connection_acquisition_wait])
retries = Config.get([:connections_pool, :connection_acquisition_retries])
2020-05-17 21:16:02 +02:00
:pools
|> Config.get([])
2020-05-17 21:16:02 +02:00
|> Enum.each(fn {name, opts} ->
max_running = Keyword.get(opts, :size, 50)
max_waiting = Keyword.get(opts, :max_waiting, 10)
result =
2020-05-17 21:16:02 +02:00
ConcurrentLimiter.new(:"#{@prefix}.#{name}", max_running, max_waiting,
wait: wait,
max_retries: retries
)
case result do
:ok -> :ok
{:error, :existing} -> :ok
end
2020-05-17 21:16:02 +02:00
end)
:ok
end
2020-02-11 08:12:57 +01:00
end