From 77e9a52450d897f39a28276694ac175955232d0e Mon Sep 17 00:00:00 2001
From: FloatingGhost <hannah@coffee-and-dreams.uk>
Date: Mon, 12 Dec 2022 19:06:04 +0000
Subject: [PATCH] allow http AS profile in ld+json header

---
 lib/pleroma/object/fetcher.ex        |  7 ++-
 test/pleroma/object/fetcher_test.exs | 71 ++++++++++++++++++++++++++++
 2 files changed, 77 insertions(+), 1 deletion(-)

diff --git a/lib/pleroma/object/fetcher.ex b/lib/pleroma/object/fetcher.ex
index 8309ef64a..aeaf05986 100644
--- a/lib/pleroma/object/fetcher.ex
+++ b/lib/pleroma/object/fetcher.ex
@@ -262,7 +262,7 @@ defmodule Pleroma.Object.Fetcher do
   def fetch_and_contain_remote_object_from_id(_id),
     do: {:error, "id must be a string"}
 
-  defp get_object(id) do
+  def get_object(id) do
     date = Pleroma.Signature.signed_date()
 
     headers =
@@ -282,6 +282,11 @@ defmodule Pleroma.Object.Fetcher do
                %{"profile" => "https://www.w3.org/ns/activitystreams"}} ->
                 {:ok, body}
 
+              # pixelfed sometimes (and only sometimes) responds with http instead of https
+              {:ok, "application", "ld+json",
+               %{"profile" => "http://www.w3.org/ns/activitystreams"}} ->
+                {:ok, body}
+
               _ ->
                 {:error, {:content_type, content_type}}
             end
diff --git a/test/pleroma/object/fetcher_test.exs b/test/pleroma/object/fetcher_test.exs
index c76a09fd7..e26443a81 100644
--- a/test/pleroma/object/fetcher_test.exs
+++ b/test/pleroma/object/fetcher_test.exs
@@ -572,4 +572,75 @@ defmodule Pleroma.Object.FetcherTest do
              } = object.data
     end
   end
+
+  describe "get_object/1" do
+    test "should return ok if the content type is application/activity+json" do
+      Tesla.Mock.mock(fn
+        %{
+          method: :get,
+          url: "https://mastodon.social/2"
+        } ->
+          %Tesla.Env{
+            status: 200,
+            headers: [{"content-type", "application/activity+json"}],
+            body: "{}"
+          }
+      end)
+
+      assert {:ok, "{}"} = Fetcher.get_object("https://mastodon.social/2")
+    end
+
+    test "should return ok if the content type is application/ld+json with a profile" do
+      Tesla.Mock.mock(fn
+        %{
+          method: :get,
+          url: "https://mastodon.social/2"
+        } ->
+          %Tesla.Env{
+            status: 200,
+            headers: [
+              {"content-type",
+               "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\""}
+            ],
+            body: "{}"
+          }
+      end)
+
+      assert {:ok, "{}"} = Fetcher.get_object("https://mastodon.social/2")
+
+      Tesla.Mock.mock(fn
+        %{
+          method: :get,
+          url: "https://mastodon.social/2"
+        } ->
+          %Tesla.Env{
+            status: 200,
+            headers: [
+              {"content-type",
+               "application/ld+json; profile=\"http://www.w3.org/ns/activitystreams\""}
+            ],
+            body: "{}"
+          }
+      end)
+
+      assert {:ok, "{}"} = Fetcher.get_object("https://mastodon.social/2")
+    end
+
+    test "should not return ok with other content types" do
+      Tesla.Mock.mock(fn
+        %{
+          method: :get,
+          url: "https://mastodon.social/2"
+        } ->
+          %Tesla.Env{
+            status: 200,
+            headers: [{"content-type", "application/json"}],
+            body: "{}"
+          }
+      end)
+
+      assert {:error, {:content_type, "application/json"}} =
+               Fetcher.get_object("https://mastodon.social/2")
+    end
+  end
 end