Sfoglia il codice sorgente

Do not error out on unsalvageable errors in FetchRepliesService (#10175)

* Do not error out on unsalvageable errors in FetchRepliesService

Fixes #10152

* Fix FetchRepliesWorker erroring out on deleted statuses
ThibG 5 anni fa
parent
commit
df5924a1db

+ 15 - 1
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

+ 1 - 3
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

+ 2 - 0
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