about summary refs log tree commit diff
path: root/app/lib/cache_buster.rb
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2020-11-19 17:38:06 +0100
committerGitHub <noreply@github.com>2020-11-19 17:38:06 +0100
commitdf1653174be233f2737d8ec281325dee54011947 (patch)
tree90d2a8fe113cfa3a1184001a94a2bed7b56a6f27 /app/lib/cache_buster.rb
parent1242e57c270e9ff356e8c175670d5dc3a10ad273 (diff)
Add cache buster feature for media files (#15155)
Nginx can be configured to bypass proxy cache when a special header
is in the request. If the response is cacheable, it will replace
the cache for that request. Proxy caching of media files is
desirable when using object storage as a way of minimizing bandwidth
costs, but has the drawback of leaving deleted media files for
a configured amount of cache time. A cache buster can make those
media files immediately unavailable. This especially makes sense
when suspending and unsuspending an account.
Diffstat (limited to 'app/lib/cache_buster.rb')
-rw-r--r--app/lib/cache_buster.rb28
1 files changed, 28 insertions, 0 deletions
diff --git a/app/lib/cache_buster.rb b/app/lib/cache_buster.rb
new file mode 100644
index 000000000..035611518
--- /dev/null
+++ b/app/lib/cache_buster.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class CacheBuster
+  def initialize(options = {})
+    @secret_header = options[:secret_header] || 'Secret-Header'
+    @secret        = options[:secret] || 'True'
+  end
+
+  def bust(url)
+    site = Addressable::URI.parse(url).normalized_site
+
+    request_pool.with(site) do |http_client|
+      build_request(url, http_client).perform
+    end
+  end
+
+  private
+
+  def request_pool
+    RequestPool.current
+  end
+
+  def build_request(url, http_client)
+    Request.new(:get, url, http_client: http_client).tap do |request|
+      request.add_headers(@secret_header => @secret)
+    end
+  end
+end