about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--app/helpers/jsonld_helper.rb16
-rw-r--r--app/services/activitypub/fetch_replies_service.rb4
-rw-r--r--app/workers/activitypub/fetch_replies_worker.rb2
3 files changed, 18 insertions, 4 deletions
diff --git a/app/helpers/jsonld_helper.rb b/app/helpers/jsonld_helper.rb
index 59e4ae685..f0a19e332 100644
--- a/app/helpers/jsonld_helper.rb
+++ b/app/helpers/jsonld_helper.rb
@@ -63,13 +63,19 @@ module JsonLdHelper
     json.present? && json['id'] == uri ? json : nil
   end
 
-  def fetch_resource_without_id_validation(uri, on_behalf_of = nil)
+  def fetch_resource_without_id_validation(uri, on_behalf_of = nil, raise_on_temporary_error = false)
     build_request(uri, on_behalf_of).perform do |response|
+      unless response_successful?(response) || response_error_unsalvageable?(response) || !raise_on_temporary_error
+        raise Mastodon::UnexpectedResponseError, response
+      end
       return body_to_json(response.body_with_limit) if response.code == 200
     end
     # If request failed, retry without doing it on behalf of a user
     return if on_behalf_of.nil?
     build_request(uri).perform do |response|
+      unless response_successful?(response) || response_error_unsalvageable?(response) || !raise_on_temporary_error
+        raise Mastodon::UnexpectedResponseError, response
+      end
       response.code == 200 ? body_to_json(response.body_with_limit) : nil
     end
   end
@@ -92,6 +98,14 @@ module JsonLdHelper
 
   private
 
+  def response_successful?(response)
+    (200...300).cover?(response.code)
+  end
+
+  def response_error_unsalvageable?(response)
+    (400...500).cover?(response.code) && response.code != 429
+  end
+
   def build_request(uri, on_behalf_of = nil)
     request = Request.new(:get, uri)
     request.on_behalf_of(on_behalf_of) if on_behalf_of
diff --git a/app/services/activitypub/fetch_replies_service.rb b/app/services/activitypub/fetch_replies_service.rb
index 95c486a43..569d0d7c1 100644
--- a/app/services/activitypub/fetch_replies_service.rb
+++ b/app/services/activitypub/fetch_replies_service.rb
@@ -36,9 +36,7 @@ class ActivityPub::FetchRepliesService < BaseService
     return collection_or_uri if collection_or_uri.is_a?(Hash)
     return unless @allow_synchronous_requests
     return if invalid_origin?(collection_or_uri)
-    collection = fetch_resource_without_id_validation(collection_or_uri)
-    raise Mastodon::UnexpectedResponseError if collection.nil?
-    collection
+    fetch_resource_without_id_validation(collection_or_uri, nil, true)
   end
 
   def filtered_replies
diff --git a/app/workers/activitypub/fetch_replies_worker.rb b/app/workers/activitypub/fetch_replies_worker.rb
index bf466db54..54d98f228 100644
--- a/app/workers/activitypub/fetch_replies_worker.rb
+++ b/app/workers/activitypub/fetch_replies_worker.rb
@@ -8,5 +8,7 @@ class ActivityPub::FetchRepliesWorker
 
   def perform(parent_status_id, replies_uri)
     ActivityPub::FetchRepliesService.new.call(Status.find(parent_status_id), replies_uri)
+  rescue ActiveRecord::RecordNotFound
+    true
   end
 end