Fix temporary network/remote server error prevent from interactions with remote accounts (#18161)

* Fix temporary network/remote server error prevent from interactions with remote accounts

* Fix and add tests
pull/18170/head
Claire 2022-04-28 20:19:10 +02:00 committed by GitHub
parent 8284110c55
commit 84d991988e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 1 deletions

View File

@ -30,6 +30,11 @@ class ResolveURLService < BaseService
end end
def process_url_from_db def process_url_from_db
if [500, 502, 503, 504, nil].include?(fetch_resource_service.response_code)
account = Account.find_by(uri: @url)
return account unless account.nil?
end
return unless @on_behalf_of.present? && [401, 403, 404].include?(fetch_resource_service.response_code) return unless @on_behalf_of.present? && [401, 403, 404].include?(fetch_resource_service.response_code)
# It may happen that the resource is a private toot, and thus not fetchable, # It may happen that the resource is a private toot, and thus not fetchable,

View File

@ -8,14 +8,28 @@ describe ResolveURLService, type: :service do
describe '#call' do describe '#call' do
it 'returns nil when there is no resource url' do it 'returns nil when there is no resource url' do
url = 'http://example.com/missing-resource' url = 'http://example.com/missing-resource'
known_account = Fabricate(:account, uri: url)
service = double service = double
allow(FetchResourceService).to receive(:new).and_return service allow(FetchResourceService).to receive(:new).and_return service
allow(service).to receive(:response_code).and_return(404)
allow(service).to receive(:call).with(url).and_return(nil) allow(service).to receive(:call).with(url).and_return(nil)
expect(subject.call(url)).to be_nil expect(subject.call(url)).to be_nil
end end
it 'returns known account on temporary error' do
url = 'http://example.com/missing-resource'
known_account = Fabricate(:account, uri: url)
service = double
allow(FetchResourceService).to receive(:new).and_return service
allow(service).to receive(:response_code).and_return(500)
allow(service).to receive(:call).with(url).and_return(nil)
expect(subject.call(url)).to eq known_account
end
context 'searching for a remote private status' do context 'searching for a remote private status' do
let(:account) { Fabricate(:account) } let(:account) { Fabricate(:account) }
let(:poster) { Fabricate(:account, domain: 'example.com') } let(:poster) { Fabricate(:account, domain: 'example.com') }