adding gun adapter
This commit is contained in:
parent
962eb8d4ac
commit
514c899275
63 changed files with 3615 additions and 389 deletions
26
lib/pleroma/gun/api.ex
Normal file
26
lib/pleroma/gun/api.ex
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.Gun.API do
|
||||
@callback open(charlist(), pos_integer(), map()) :: {:ok, pid()}
|
||||
@callback info(pid()) :: map()
|
||||
@callback close(pid()) :: :ok
|
||||
@callback await_up(pid) :: {:ok, atom()} | {:error, atom()}
|
||||
@callback connect(pid(), map()) :: reference()
|
||||
@callback await(pid(), reference()) :: {:response, :fin, 200, []}
|
||||
|
||||
def open(host, port, opts), do: api().open(host, port, opts)
|
||||
|
||||
def info(pid), do: api().info(pid)
|
||||
|
||||
def close(pid), do: api().close(pid)
|
||||
|
||||
def await_up(pid), do: api().await_up(pid)
|
||||
|
||||
def connect(pid, opts), do: api().connect(pid, opts)
|
||||
|
||||
def await(pid, ref), do: api().await(pid, ref)
|
||||
|
||||
defp api, do: Pleroma.Config.get([Pleroma.Gun.API], Pleroma.Gun)
|
||||
end
|
||||
151
lib/pleroma/gun/api/mock.ex
Normal file
151
lib/pleroma/gun/api/mock.ex
Normal file
|
|
@ -0,0 +1,151 @@
|
|||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.Gun.API.Mock do
|
||||
@behaviour Pleroma.Gun.API
|
||||
|
||||
alias Pleroma.Gun.API
|
||||
|
||||
@impl API
|
||||
def open('some-domain.com', 443, _) do
|
||||
{:ok, conn_pid} = Task.start_link(fn -> Process.sleep(1_000) end)
|
||||
|
||||
Registry.register(API.Mock, conn_pid, %{
|
||||
origin_scheme: "https",
|
||||
origin_host: 'some-domain.com',
|
||||
origin_port: 443
|
||||
})
|
||||
|
||||
{:ok, conn_pid}
|
||||
end
|
||||
|
||||
@impl API
|
||||
def open(ip, port, _)
|
||||
when ip in [{10_755, 10_368, 61_708, 131, 64_206, 45_068, 0, 9_694}, {127, 0, 0, 1}] and
|
||||
port in [80, 443] do
|
||||
{:ok, conn_pid} = Task.start_link(fn -> Process.sleep(1_000) end)
|
||||
|
||||
scheme = if port == 443, do: "https", else: "http"
|
||||
|
||||
Registry.register(API.Mock, conn_pid, %{
|
||||
origin_scheme: scheme,
|
||||
origin_host: ip,
|
||||
origin_port: port
|
||||
})
|
||||
|
||||
{:ok, conn_pid}
|
||||
end
|
||||
|
||||
@impl API
|
||||
def open('localhost', 1234, %{
|
||||
protocols: [:socks],
|
||||
proxy: {:socks5, 'localhost', 1234},
|
||||
socks_opts: %{host: 'proxy-socks.com', port: 80, version: 5}
|
||||
}) do
|
||||
{:ok, conn_pid} = Task.start_link(fn -> Process.sleep(1_000) end)
|
||||
|
||||
Registry.register(API.Mock, conn_pid, %{
|
||||
origin_scheme: "http",
|
||||
origin_host: 'proxy-socks.com',
|
||||
origin_port: 80
|
||||
})
|
||||
|
||||
{:ok, conn_pid}
|
||||
end
|
||||
|
||||
@impl API
|
||||
def open('localhost', 1234, %{
|
||||
protocols: [:socks],
|
||||
proxy: {:socks4, 'localhost', 1234},
|
||||
socks_opts: %{
|
||||
host: 'proxy-socks.com',
|
||||
port: 443,
|
||||
protocols: [:http2],
|
||||
tls_opts: [],
|
||||
transport: :tls,
|
||||
version: 4
|
||||
}
|
||||
}) do
|
||||
{:ok, conn_pid} = Task.start_link(fn -> Process.sleep(1_000) end)
|
||||
|
||||
Registry.register(API.Mock, conn_pid, %{
|
||||
origin_scheme: "https",
|
||||
origin_host: 'proxy-socks.com',
|
||||
origin_port: 443
|
||||
})
|
||||
|
||||
{:ok, conn_pid}
|
||||
end
|
||||
|
||||
@impl API
|
||||
def open('gun-not-up.com', 80, _opts), do: {:error, :timeout}
|
||||
|
||||
@impl API
|
||||
def open('example.com', port, _) when port in [443, 115] do
|
||||
{:ok, conn_pid} = Task.start_link(fn -> Process.sleep(1_000) end)
|
||||
|
||||
Registry.register(API.Mock, conn_pid, %{
|
||||
origin_scheme: "https",
|
||||
origin_host: 'example.com',
|
||||
origin_port: 443
|
||||
})
|
||||
|
||||
{:ok, conn_pid}
|
||||
end
|
||||
|
||||
@impl API
|
||||
def open(domain, 80, _) do
|
||||
{:ok, conn_pid} = Task.start_link(fn -> Process.sleep(1_000) end)
|
||||
|
||||
Registry.register(API.Mock, conn_pid, %{
|
||||
origin_scheme: "http",
|
||||
origin_host: domain,
|
||||
origin_port: 80
|
||||
})
|
||||
|
||||
{:ok, conn_pid}
|
||||
end
|
||||
|
||||
@impl API
|
||||
def open({127, 0, 0, 1}, 8123, _) do
|
||||
Task.start_link(fn -> Process.sleep(1_000) end)
|
||||
end
|
||||
|
||||
@impl API
|
||||
def open('localhost', 9050, _) do
|
||||
Task.start_link(fn -> Process.sleep(1_000) end)
|
||||
end
|
||||
|
||||
@impl API
|
||||
def await_up(_pid), do: {:ok, :http}
|
||||
|
||||
@impl API
|
||||
def connect(pid, %{host: _, port: 80}) do
|
||||
ref = make_ref()
|
||||
Registry.register(API.Mock, ref, pid)
|
||||
ref
|
||||
end
|
||||
|
||||
@impl API
|
||||
def connect(pid, %{host: _, port: 443, protocols: [:http2], transport: :tls}) do
|
||||
ref = make_ref()
|
||||
Registry.register(API.Mock, ref, pid)
|
||||
ref
|
||||
end
|
||||
|
||||
@impl API
|
||||
def await(pid, ref) do
|
||||
[{_, ^pid}] = Registry.lookup(API.Mock, ref)
|
||||
{:response, :fin, 200, []}
|
||||
end
|
||||
|
||||
@impl API
|
||||
def info(pid) do
|
||||
[{_, info}] = Registry.lookup(API.Mock, pid)
|
||||
info
|
||||
end
|
||||
|
||||
@impl API
|
||||
def close(_pid), do: :ok
|
||||
end
|
||||
29
lib/pleroma/gun/conn.ex
Normal file
29
lib/pleroma/gun/conn.ex
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.Gun.Conn do
|
||||
@moduledoc """
|
||||
Struct for gun connection data
|
||||
"""
|
||||
@type gun_state :: :up | :down
|
||||
@type conn_state :: :active | :idle
|
||||
|
||||
@type t :: %__MODULE__{
|
||||
conn: pid(),
|
||||
gun_state: gun_state(),
|
||||
conn_state: conn_state(),
|
||||
used_by: [pid()],
|
||||
last_reference: pos_integer(),
|
||||
crf: float(),
|
||||
retries: pos_integer()
|
||||
}
|
||||
|
||||
defstruct conn: nil,
|
||||
gun_state: :open,
|
||||
conn_state: :init,
|
||||
used_by: [],
|
||||
last_reference: 0,
|
||||
crf: 1,
|
||||
retries: 0
|
||||
end
|
||||
45
lib/pleroma/gun/gun.ex
Normal file
45
lib/pleroma/gun/gun.ex
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.Gun do
|
||||
@behaviour Pleroma.Gun.API
|
||||
|
||||
alias Pleroma.Gun.API
|
||||
|
||||
@gun_keys [
|
||||
:connect_timeout,
|
||||
:http_opts,
|
||||
:http2_opts,
|
||||
:protocols,
|
||||
:retry,
|
||||
:retry_timeout,
|
||||
:trace,
|
||||
:transport,
|
||||
:tls_opts,
|
||||
:tcp_opts,
|
||||
:socks_opts,
|
||||
:ws_opts
|
||||
]
|
||||
|
||||
@impl API
|
||||
def open(host, port, opts \\ %{}), do: :gun.open(host, port, Map.take(opts, @gun_keys))
|
||||
|
||||
@impl API
|
||||
defdelegate info(pid), to: :gun
|
||||
|
||||
@impl API
|
||||
defdelegate close(pid), to: :gun
|
||||
|
||||
@impl API
|
||||
defdelegate await_up(pid), to: :gun
|
||||
|
||||
@impl API
|
||||
defdelegate connect(pid, opts), to: :gun
|
||||
|
||||
@impl API
|
||||
defdelegate await(pid, ref), to: :gun
|
||||
|
||||
@spec flush(pid() | reference()) :: :ok
|
||||
defdelegate flush(pid), to: :gun
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue