forked from mirrors/catstodon
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
This commit is contained in:
parent
8284110c55
commit
84d991988e
2 changed files with 20 additions and 1 deletions
|
@ -30,6 +30,11 @@ class ResolveURLService < BaseService
|
|||
end
|
||||
|
||||
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)
|
||||
|
||||
# It may happen that the resource is a private toot, and thus not fetchable,
|
||||
|
|
|
@ -7,15 +7,29 @@ describe ResolveURLService, type: :service do
|
|||
|
||||
describe '#call' 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
|
||||
|
||||
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)
|
||||
|
||||
expect(subject.call(url)).to be_nil
|
||||
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
|
||||
let(:account) { Fabricate(:account) }
|
||||
let(:poster) { Fabricate(:account, domain: 'example.com') }
|
||||
|
|
Loading…
Reference in a new issue