diff options
Diffstat (limited to 'app/services')
-rw-r--r-- | app/services/follow_service.rb | 2 | ||||
-rw-r--r-- | app/services/process_interaction_service.rb | 2 | ||||
-rw-r--r-- | app/services/subscribe_service.rb | 28 | ||||
-rw-r--r-- | app/services/update_remote_profile_service.rb | 2 |
4 files changed, 25 insertions, 9 deletions
diff --git a/app/services/follow_service.rb b/app/services/follow_service.rb index 844f5282d..23e721fac 100644 --- a/app/services/follow_service.rb +++ b/app/services/follow_service.rb @@ -40,7 +40,7 @@ class FollowService < BaseService if target_account.local? NotifyService.new.call(target_account, follow) else - SubscribeService.new.call(target_account) unless target_account.subscribed? + Pubsubhubbub::SubscribeWorker.perform_async(target_account.id) unless target_account.subscribed? NotificationWorker.perform_async(build_follow_xml(follow), source_account.id, target_account.id) AfterRemoteFollowWorker.perform_async(follow.id) end diff --git a/app/services/process_interaction_service.rb b/app/services/process_interaction_service.rb index 1f15a265d..16eac2353 100644 --- a/app/services/process_interaction_service.rb +++ b/app/services/process_interaction_service.rb @@ -77,7 +77,7 @@ class ProcessInteractionService < BaseService def authorize_follow_request!(account, target_account) follow_request = FollowRequest.find_by(account: target_account, target_account: account) follow_request&.authorize! - SubscribeService.new.call(account) unless account.subscribed? + Pubsubhubbub::SubscribeWorker.perform_async(account.id) unless account.subscribed? end def reject_follow_request!(account, target_account) diff --git a/app/services/subscribe_service.rb b/app/services/subscribe_service.rb index 820b208e9..138718f14 100644 --- a/app/services/subscribe_service.rb +++ b/app/services/subscribe_service.rb @@ -5,15 +5,31 @@ class SubscribeService < BaseService account.secret = SecureRandom.hex subscription = account.subscription(api_subscription_url(account.id)) - response = subscription.subscribe + response = subscription.subscribe - unless response.successful? + if response_failed_permanently?(response) + # An error in the 4xx range (except for 429, which is rate limiting) + # means we're not allowed to subscribe. Fail and move on account.secret = '' - Rails.logger.debug "PuSH subscription request for #{account.acct} failed: #{response.message}" + account.save! + elsif response_successful?(response) + # Anything in the 2xx range means the subscription will be confirmed + # asynchronously, we've done what we needed to do + account.save! + else + # What's left is the 5xx range and 429, which means we need to retry + # at a later time. Fail loudly! + raise "Subscription attempt failed for #{account.acct} (#{account.hub_url}): HTTP #{response.code}" end + end + + private + + def response_failed_permanently?(response) + response.code > 299 && response.code < 500 && response.code != 429 + end - account.save! - rescue HTTP::Error, OpenSSL::SSL::SSLError - Rails.logger.debug "PuSH subscription request for #{account.acct} could not be made due to HTTP or SSL error" + def response_successful?(response) + response.code > 199 && response.code < 300 end end diff --git a/app/services/update_remote_profile_service.rb b/app/services/update_remote_profile_service.rb index 31f4af2c1..f0c39ecc0 100644 --- a/app/services/update_remote_profile_service.rb +++ b/app/services/update_remote_profile_service.rb @@ -28,7 +28,7 @@ class UpdateRemoteProfileService < BaseService account.save_with_optional_avatar! - SubscribeService.new.call(account) if resubscribe && (account.hub_url != old_hub_url) + Pubsubhubbub::SubscribeWorker.perform_async(account.id) if resubscribe && (account.hub_url != old_hub_url) end private |