[#2497] Adjusted media proxy preview invalidation. Allowed client-side caching for...
authorIvan Tashkinov <ivantashkinov@gmail.com>
Sat, 5 Sep 2020 17:19:09 +0000 (20:19 +0300)
committerIvan Tashkinov <ivantashkinov@gmail.com>
Sat, 5 Sep 2020 17:19:09 +0000 (20:19 +0300)
Removed :preview pool in favor of existing :media one. Misc. refactoring.

config/config.exs
lib/pleroma/helpers/media_helper.ex
lib/pleroma/reverse_proxy/reverse_proxy.ex
lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex
lib/pleroma/web/media_proxy/invalidation.ex
lib/pleroma/web/media_proxy/media_proxy.ex
lib/pleroma/web/media_proxy/media_proxy_controller.ex

index b92d3ccbb52510d56bf0509cfd7d32480ea9c85d..e5b7e18dfbea4a9cdcbe574a13dd065badb7850c 100644 (file)
@@ -754,11 +754,6 @@ config :pleroma, :pools,
     timeout: 10_000
   ],
   media: [
-    size: 50,
-    max_waiting: 10,
-    timeout: 10_000
-  ],
-  preview: [
     size: 50,
     max_waiting: 20,
     timeout: 15_000
index bb93d49158db1ac30d96362ebf607eafa3210f60..a1205e10d2b7b959be714cef7412b511c2521f72 100644 (file)
@@ -14,7 +14,7 @@ defmodule Pleroma.Helpers.MediaHelper do
   def image_resize(url, options) do
     with executable when is_binary(executable) <- System.find_executable("convert"),
          {:ok, args} <- prepare_image_resize_args(options),
-         {:ok, env} <- HTTP.get(url, [], adapter: [pool: :preview]),
+         {:ok, env} <- HTTP.get(url, [], adapter: [pool: :media]),
          {:ok, fifo_path} <- mkfifo() do
       args = List.flatten([fifo_path, args])
       run_fifo(fifo_path, env, executable, args)
@@ -62,7 +62,7 @@ defmodule Pleroma.Helpers.MediaHelper do
 
   def video_framegrab(url) do
     with executable when is_binary(executable) <- System.find_executable("ffmpeg"),
-         {:ok, env} <- HTTP.get(url, [], adapter: [pool: :preview]),
+         {:ok, env} <- HTTP.get(url, [], adapter: [pool: :media]),
          {:ok, fifo_path} <- mkfifo(),
          args = [
            "-y",
index 35637e9343e7eecb9aee30ee46ff34b9fbcc2465..8ae1157df1630f41e90c647de7028c6bcc27ad7a 100644 (file)
@@ -18,6 +18,7 @@ defmodule Pleroma.ReverseProxy do
   @methods ~w(GET HEAD)
 
   def max_read_duration_default, do: @max_read_duration
+  def default_cache_control_header, do: @default_cache_control_header
 
   @moduledoc """
   A reverse proxy.
index 5d8bb72aa98ec8fd74839fb7c12f221d9c9bbf98..1050b74baa87c60388d99e6dd137199d66c6d7ac 100644 (file)
@@ -12,23 +12,28 @@ defmodule Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy do
 
   require Logger
 
-  @options [
+  @adapter_options [
     pool: :media
   ]
 
   def perform(:prefetch, url) do
-    Logger.debug("Prefetching #{inspect(url)}")
+    # Fetching only proxiable resources
+    if MediaProxy.enabled?() and MediaProxy.url_proxiable?(url) do
+      # If preview proxy is enabled, it'll also hit media proxy (so we're caching both requests)
+      prefetch_url = MediaProxy.preview_url(url)
 
-    opts =
-      if Application.get_env(:tesla, :adapter) == Tesla.Adapter.Hackney do
-        Keyword.put(@options, :recv_timeout, 10_000)
-      else
-        @options
-      end
+      Logger.debug("Prefetching #{inspect(url)} as #{inspect(prefetch_url)}")
 
-    url
-    |> MediaProxy.preview_url()
-    |> HTTP.get([], adapter: opts)
+      HTTP.get(prefetch_url, [], adapter: adapter_options())
+    end
+  end
+
+  defp adapter_options do
+    if Application.get_env(:tesla, :adapter) == Tesla.Adapter.Hackney do
+      Keyword.put(@adapter_options, :recv_timeout, 10_000)
+    else
+      @adapter_options
+    end
   end
 
   def perform(:preload, %{"object" => %{"attachment" => attachments}} = _message) do
index 5808861e692b15a27b5e38506a2c05d953111270..4f434047830760f72b0ab007fda44685d016f0f9 100644 (file)
@@ -33,6 +33,8 @@ defmodule Pleroma.Web.MediaProxy.Invalidation do
   def prepare_urls(urls) do
     urls
     |> List.wrap()
-    |> Enum.map(&MediaProxy.url/1)
+    |> Enum.map(fn url -> [MediaProxy.url(url), MediaProxy.preview_url(url)] end)
+    |> List.flatten()
+    |> Enum.uniq()
   end
 end
index 80017cde1bc56fd4a31b5c8f840214136b178a89..ba553998b40b4293b88126c45d0568b22524f892 100644 (file)
@@ -41,20 +41,16 @@ defmodule Pleroma.Web.MediaProxy do
   def url("/" <> _ = url), do: url
 
   def url(url) do
-    if not enabled?() or not url_proxiable?(url) do
-      url
-    else
+    if enabled?() and url_proxiable?(url) do
       encode_url(url)
+    else
+      url
     end
   end
 
   @spec url_proxiable?(String.t()) :: boolean()
   def url_proxiable?(url) do
-    if local?(url) or whitelisted?(url) do
-      false
-    else
-      true
-    end
+    not local?(url) and not whitelisted?(url)
   end
 
   def preview_url(url, preview_params \\ []) do
@@ -69,7 +65,7 @@ defmodule Pleroma.Web.MediaProxy do
 
   # Note: media proxy must be enabled for media preview proxy in order to load all
   #   non-local non-whitelisted URLs through it and be sure that body size constraint is preserved.
-  def preview_enabled?, do: enabled?() and Config.get([:media_preview_proxy, :enabled], false)
+  def preview_enabled?, do: enabled?() and !!Config.get([:media_preview_proxy, :enabled])
 
   def local?(url), do: String.starts_with?(url, Pleroma.Web.base_url())
 
@@ -138,9 +134,13 @@ defmodule Pleroma.Web.MediaProxy do
     if path = URI.parse(url_or_path).path, do: Path.basename(path)
   end
 
+  def base_url do
+    Config.get([:media_proxy, :base_url], Web.base_url())
+  end
+
   defp proxy_url(path, sig_base64, url_base64, filename) do
     [
-      Config.get([:media_proxy, :base_url], Web.base_url()),
+      base_url(),
       path,
       sig_base64,
       url_base64,
index 469fbae5962e07572d54e400e983c652f377a2c7..89f4a23bdc6e1e4a21667a4920e4052684dc8a75 100644 (file)
@@ -51,7 +51,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do
     media_proxy_url = MediaProxy.url(url)
 
     with {:ok, %{status: status} = head_response} when status in 200..299 <-
-           Pleroma.HTTP.request("head", media_proxy_url, [], [], adapter: [pool: :preview]) do
+           Pleroma.HTTP.request("head", media_proxy_url, [], [], adapter: [pool: :media]) do
       content_type = Tesla.get_header(head_response, "content-type")
       handle_preview(content_type, conn, media_proxy_url)
     else
@@ -154,8 +154,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do
     conn
     |> put_resp_header("content-type", content_type)
     |> put_resp_header("content-disposition", "inline; filename=\"#{filename}\"")
-    # TODO: enable caching
-    |> put_resp_header("cache-control", "max-age=0, private, must-revalidate")
+    |> put_resp_header("cache-control", ReverseProxy.default_cache_control_header())
   end
 
   defp thumbnail_max_dimensions(params) do