Merge branch 'richmedia-workaround' into 'develop'
authorrinpatch <rin@patch.cx>
Sun, 21 Mar 2021 08:19:42 +0000 (08:19 +0000)
committerrinpatch <rin@patch.cx>
Sun, 21 Mar 2021 08:19:42 +0000 (08:19 +0000)
Workaround for RichMedia preview image breakage edge case

See merge request pleroma/pleroma!3363

1  2 
lib/pleroma/web/mastodon_api/views/status_view.ex

index d30c9fa68b444b99c9a433768727b81377442c07,71f659ba05914e779ac9cf423782a5253edee109..3753588f2609a571fe084999f98ad9595269b86b
@@@ -198,10 -198,8 +198,10 @@@ defmodule Pleroma.Web.MastodonAPI.Statu
      like_count = object.data["like_count"] || 0
      announcement_count = object.data["announcement_count"] || 0
  
 -    tags = object.data["tag"] || []
 -    sensitive = object.data["sensitive"] || Enum.member?(tags, "nsfw")
 +    hashtags = Object.hashtags(object)
 +    sensitive = object.data["sensitive"] || Enum.member?(hashtags, "nsfw")
 +
 +    tags = Object.tags(object)
  
      tag_mentions =
        tags
  
      page_url = page_url_data |> to_string
  
-     image_url =
+     image_url_data =
        if is_binary(rich_media["image"]) do
-         URI.merge(page_url_data, URI.parse(rich_media["image"]))
-         |> to_string
+         URI.parse(rich_media["image"])
+       else
+         nil
        end
  
+     image_url = build_image_url(image_url_data, page_url_data)
      %{
        type: "link",
        provider_name: page_url_data.host,
      do: %{name: name, website: url}
  
    defp build_application(_), do: nil
+   # Workaround for Elixir issue #10771
+   # Avoid applying URI.merge unless necessary
+   # TODO: revert to always attempting URI.merge(image_url_data, page_url_data)
+   # when Elixir 1.12 is the minimum supported version
+   @spec build_image_url(struct() | nil, struct()) :: String.t() | nil
+   defp build_image_url(
+          %URI{scheme: image_scheme, host: image_host} = image_url_data,
+          %URI{} = _page_url_data
+        )
+        when not is_nil(image_scheme) and not is_nil(image_host) do
+     image_url_data |> to_string
+   end
+   defp build_image_url(%URI{} = image_url_data, %URI{} = page_url_data) do
+     URI.merge(page_url_data, image_url_data) |> to_string
+   end
+   defp build_image_url(_, _), do: nil
  end