summaryrefslogtreecommitdiffstats
path: root/app/services/fetch_oembed_service.rb
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2019-11-17 18:40:33 +0100
committerGitHub <noreply@github.com>2019-11-17 18:40:33 +0100
commitd14e74eff52352f1a2fb4bc2053bbb28c1aa29e0 (patch)
tree5fd20f50b1bdc8315d5afa59ea66e6c912d9931e /app/services/fetch_oembed_service.rb
parent5a2c0707f163f14565d186db48bf0b4fe0b05b4f (diff)
Add cache for OEmbed endpoints to avoid extra HTTP requests (#12403)
* add youtube oembed endpoint * add check for oembed endpoint * change unless for a more readable if * clear blank lines * endpoint via https * Fix string literal in condition * use cache for endpoints * use cache for endpoints * clean up and adding check * clean up and remove redundant return * add html check * add false to return * use double quotes * use double quotes * Clean up
Diffstat (limited to 'app/services/fetch_oembed_service.rb')
-rw-r--r--app/services/fetch_oembed_service.rb31
1 files changed, 30 insertions, 1 deletions
diff --git a/app/services/fetch_oembed_service.rb b/app/services/fetch_oembed_service.rb
index 10176cfb994..4f8498c623d 100644
--- a/app/services/fetch_oembed_service.rb
+++ b/app/services/fetch_oembed_service.rb
@@ -1,13 +1,20 @@
# frozen_string_literal: true
class FetchOEmbedService
+ ENDPOINT_CACHE_EXPIRES_IN = 24.hours.freeze
+
attr_reader :url, :options, :format, :endpoint_url
def call(url, options = {})
@url = url
@options = options
- discover_endpoint!
+ if @options[:cached_endpoint]
+ parse_cached_endpoint!
+ else
+ discover_endpoint!
+ end
+
fetch!
end
@@ -32,10 +39,32 @@ class FetchOEmbedService
return if @endpoint_url.blank?
@endpoint_url = (Addressable::URI.parse(@url) + @endpoint_url).to_s
+
+ cache_endpoint!
rescue Addressable::URI::InvalidURIError
@endpoint_url = nil
end
+ def parse_cached_endpoint!
+ cached = @options[:cached_endpoint]
+
+ return if cached[:endpoint].nil? || cached[:format].nil?
+
+ @endpoint_url = Addressable::Template.new(cached[:endpoint]).expand(url: @url).to_s
+ @format = cached[:format]
+ end
+
+ def cache_endpoint!
+ url_domain = Addressable::URI.parse(@url).normalized_host
+
+ endpoint_hash = {
+ endpoint: @endpoint_url.gsub(URI.encode_www_form_component(@url), '{url}'),
+ format: @format,
+ }
+
+ Rails.cache.write("oembed_endpoint:#{url_domain}", endpoint_hash, expires_in: ENDPOINT_CACHE_EXPIRES_IN)
+ end
+
def fetch!
return if @endpoint_url.blank?