62 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
| # Pleroma: A lightweight social networking server
 | |
| # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
 | |
| # SPDX-License-Identifier: AGPL-3.0-only
 | |
| 
 | |
| defmodule Pleroma.Web.MediaProxy.Invalidation.Script do
 | |
|   @moduledoc false
 | |
| 
 | |
|   @behaviour Pleroma.Web.MediaProxy.Invalidation
 | |
| 
 | |
|   require Logger
 | |
| 
 | |
|   @impl Pleroma.Web.MediaProxy.Invalidation
 | |
|   def purge(urls, opts \\ []) do
 | |
|     args =
 | |
|       urls
 | |
|       |> maybe_format_urls(Keyword.get(opts, :url_format))
 | |
|       |> List.wrap()
 | |
|       |> Enum.uniq()
 | |
|       |> Enum.join(" ")
 | |
| 
 | |
|     opts
 | |
|     |> Keyword.get(:script_path)
 | |
|     |> do_purge([args])
 | |
|     |> handle_result(urls)
 | |
|   end
 | |
| 
 | |
|   defp do_purge(script_path, args) when is_binary(script_path) do
 | |
|     path = Path.expand(script_path)
 | |
|     Logger.debug("Running cache purge: #{inspect(args)}, #{inspect(path)}")
 | |
|     System.cmd(path, args)
 | |
|   rescue
 | |
|     error -> error
 | |
|   end
 | |
| 
 | |
|   defp do_purge(_, _), do: {:error, "not found script path"}
 | |
| 
 | |
|   defp handle_result({_result, 0}, urls), do: {:ok, urls}
 | |
|   defp handle_result({:error, error}, urls), do: handle_result(error, urls)
 | |
| 
 | |
|   defp handle_result(error, _) do
 | |
|     Logger.error("Error while cache purge: #{inspect(error)}")
 | |
|     {:error, inspect(error)}
 | |
|   end
 | |
| 
 | |
|   def maybe_format_urls(urls, :htcacheclean) do
 | |
|     urls
 | |
|     |> Enum.map(fn url ->
 | |
|       uri = URI.parse(url)
 | |
| 
 | |
|       query =
 | |
|         if !is_nil(uri.query) do
 | |
|           "?" <> uri.query
 | |
|         else
 | |
|           "?"
 | |
|         end
 | |
| 
 | |
|       uri.scheme <> "://" <> uri.host <> ":#{inspect(uri.port)}" <> uri.path <> query
 | |
|     end)
 | |
|   end
 | |
| 
 | |
|   def maybe_format_urls(urls, _), do: urls
 | |
| end
 | 
