about summary refs log tree commit diff
path: root/app/services
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2017-07-12 00:39:15 +0200
committerGitHub <noreply@github.com>2017-07-12 00:39:15 +0200
commit1764c32b9e295157b1900b9c66d3cdd76e2d3e0d (patch)
tree21678b5dab3c068ac34c7990e46c4c0a62dc64fe /app/services
parentb21ab498f84b75288f20a7eb2c6e0ee223481674 (diff)
Fix #4067 - Do not make HTTP round-trip when resolving local URL (#4160)
Diffstat (limited to 'app/services')
-rw-r--r--app/services/fetch_remote_resource_service.rb28
1 files changed, 28 insertions, 0 deletions
diff --git a/app/services/fetch_remote_resource_service.rb b/app/services/fetch_remote_resource_service.rb
index 5dfa3a0ff..2c1c1f05f 100644
--- a/app/services/fetch_remote_resource_service.rb
+++ b/app/services/fetch_remote_resource_service.rb
@@ -5,6 +5,9 @@ class FetchRemoteResourceService < BaseService
 
   def call(url)
     @url = url
+
+    return process_local_url if local_url?
+
     process_url unless fetched_atom_feed.nil?
   end
 
@@ -38,4 +41,29 @@ class FetchRemoteResourceService < BaseService
   def xml_data
     @_xml_data ||= Nokogiri::XML(body, nil, 'utf-8')
   end
+
+  def local_url?
+    TagManager.instance.local_url?(@url)
+  end
+
+  def process_local_url
+    recognized_params = Rails.application.routes.recognize_path(@url)
+
+    return unless recognized_params[:action] == 'show'
+
+    if recognized_params[:controller] == 'stream_entries'
+      status = StreamEntry.find_by(id: recognized_params[:id])&.status
+      check_local_status(status)
+    elsif recognized_params[:controller] == 'statuses'
+      status = Status.find_by(id: recognized_params[:id])
+      check_local_status(status)
+    elsif recognized_params[:controller] == 'accounts'
+      Account.find_local(recognized_params[:username])
+    end
+  end
+
+  def check_local_status(status)
+    return if status.nil?
+    status if status.public_visibility? || status.unlisted_visibility?
+  end
 end