instance: Do not fetch unreachable instances
authorHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Mon, 7 Dec 2020 19:09:34 +0000 (20:09 +0100)
committerHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Mon, 7 Dec 2020 19:11:47 +0000 (20:11 +0100)
Closes: https://git.pleroma.social/pleroma/pleroma/-/issues/2346
lib/pleroma/instances/instance.ex
test/pleroma/instances/instance_test.exs

index df471a39d9a501a15050b94bd891e015add8ccce..c9ca3aac717ec63546d450216109d36a904ffbdf 100644 (file)
@@ -166,7 +166,8 @@ defmodule Pleroma.Instances.Instance do
 
   defp scrape_favicon(%URI{} = instance_uri) do
     try do
-      with {:ok, %Tesla.Env{body: html}} <-
+      with {_, true} <- {:reachable, reachable?(instance_uri.host)},
+           {:ok, %Tesla.Env{body: html}} <-
              Pleroma.HTTP.get(to_string(instance_uri), [{"accept", "text/html"}], pool: :media),
            {_, [favicon_rel | _]} when is_binary(favicon_rel) <-
              {:parse,
@@ -175,7 +176,15 @@ defmodule Pleroma.Instances.Instance do
              {:merge, URI.merge(instance_uri, favicon_rel) |> to_string()} do
         favicon
       else
-        _ -> nil
+        {:reachable, false} ->
+          Logger.debug(
+            "Instance.scrape_favicon(\"#{to_string(instance_uri)}\") ignored unreachable host"
+          )
+
+          nil
+
+        _ ->
+          nil
       end
     rescue
       e ->
index 4f080510018d22ad827af469af29f791bcc51d23..2c6389e4f9a389d9fd90e9e9095330f676f9c63a 100644 (file)
@@ -3,6 +3,7 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Instances.InstanceTest do
+  alias Pleroma.Instances
   alias Pleroma.Instances.Instance
   alias Pleroma.Repo
 
@@ -148,5 +149,13 @@ defmodule Pleroma.Instances.InstanceTest do
                         )
              end) =~ "Instance.scrape_favicon(\"https://no-favicon.example.org/\") error: "
     end
+
+    test "Doesn't scrapes unreachable instances" do
+      instance = insert(:instance, unreachable_since: Instances.reachability_datetime_threshold())
+      url = "https://" <> instance.host
+
+      assert capture_log(fn -> assert nil == Instance.get_or_update_favicon(URI.parse(url)) end) =~
+               "Instance.scrape_favicon(\"#{url}\") ignored unreachable host"
+    end
   end
 end