From 1c8c6048ded10e8db600989969e222f8a882599d Mon Sep 17 00:00:00 2001 From: Lain Soykaf Date: Sat, 24 Oct 2026 14:12:47 +0400 Subject: [PATCH] fix(http): treat an empty proxy_url as no proxy --- changelog.d/empty-proxy-url.fix | 1 + lib/pleroma/http/adapter_helper.ex | 5 +++-- test/pleroma/http/adapter_helper/hackney_test.exs | 7 +++++++ test/pleroma/http/adapter_helper_test.exs | 6 ++++++ 4 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 changelog.d/empty-proxy-url.fix diff --git a/changelog.d/empty-proxy-url.fix b/changelog.d/empty-proxy-url.fix new file mode 100644 index 000000000..4dd547aba --- /dev/null +++ b/changelog.d/empty-proxy-url.fix @@ -0,0 +1 @@ +HTTP: treat an empty proxy_url as no proxy; with Hackney 4 it made every outgoing request fail diff --git a/lib/pleroma/http/adapter_helper.ex b/lib/pleroma/http/adapter_helper.ex index 4f0e23f20..fa1d1ab54 100644 --- a/lib/pleroma/http/adapter_helper.ex +++ b/lib/pleroma/http/adapter_helper.ex @@ -20,8 +20,9 @@ defmodule Pleroma.HTTP.AdapterHelper do @callback options(keyword(), URI.t()) :: keyword() + # AdminFE stores an empty proxy field as "", which means no proxy. @spec format_proxy(String.t() | tuple() | nil) :: proxy() | nil - def format_proxy(nil), do: nil + def format_proxy(proxy) when proxy in [nil, ""], do: nil def format_proxy(proxy_url) do case parse_proxy(proxy_url) do @@ -32,7 +33,7 @@ defmodule Pleroma.HTTP.AdapterHelper do end @spec maybe_add_proxy(keyword(), proxy() | nil) :: keyword() - def maybe_add_proxy(opts, nil), do: opts + def maybe_add_proxy(opts, proxy) when proxy in [nil, ""], do: opts def maybe_add_proxy(opts, proxy), do: Keyword.put_new(opts, :proxy, proxy) @doc """ diff --git a/test/pleroma/http/adapter_helper/hackney_test.exs b/test/pleroma/http/adapter_helper/hackney_test.exs index 4a31ffb07..ecfd2323d 100644 --- a/test/pleroma/http/adapter_helper/hackney_test.exs +++ b/test/pleroma/http/adapter_helper/hackney_test.exs @@ -58,6 +58,13 @@ defmodule Pleroma.HTTP.AdapterHelper.HackneyTest do {:socks5, ~c"::1", 9050} end + # AdminFE stores an empty field as "", and Hackney 4 fails every request with it. + test "ignores an empty proxy_url", %{uri: uri} do + clear_config([:http, :proxy_url], "") + + refute Keyword.has_key?(Hackney.options([], uri), :proxy) + end + test "respect connection opts and no proxy", %{uri: uri} do opts = Hackney.options([a: 2, b: 1], uri) diff --git a/test/pleroma/http/adapter_helper_test.exs b/test/pleroma/http/adapter_helper_test.exs index cc0e24167..e75710d0d 100644 --- a/test/pleroma/http/adapter_helper_test.exs +++ b/test/pleroma/http/adapter_helper_test.exs @@ -12,6 +12,12 @@ defmodule Pleroma.HTTP.AdapterHelperTest do assert AdapterHelper.format_proxy(nil) == nil end + test "with an empty string" do + assert ExUnit.CaptureLog.capture_log(fn -> + assert AdapterHelper.format_proxy("") == nil + end) == "" + end + test "with string" do assert AdapterHelper.format_proxy("127.0.0.1:8123") == {{127, 0, 0, 1}, 8123} end