From 05cdd3f6eb1b53174ed18bdd8697cfff9649a146 Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Mon, 4 Aug 2025 09:43:34 +0200 Subject: [PATCH] Track delivery failures to FASP (#35628) --- app/lib/fasp/request.rb | 4 ++++ app/models/fasp/provider.rb | 4 ++++ spec/lib/fasp/request_spec.rb | 23 +++++++++++++++++++++++ spec/models/fasp/provider_spec.rb | 8 ++++++++ 4 files changed, 39 insertions(+) diff --git a/app/lib/fasp/request.rb b/app/lib/fasp/request.rb index 2002e90bb..51950a004 100644 --- a/app/lib/fasp/request.rb +++ b/app/lib/fasp/request.rb @@ -32,8 +32,12 @@ class Fasp::Request .send(verb, url, body:) validate!(response) + @provider.delivery_failure_tracker.track_success! response.parse if response.body.present? + rescue *::Mastodon::HTTP_CONNECTION_ERRORS + @provider.delivery_failure_tracker.track_failure! + raise end def request_headers(_verb, _url, body = '') diff --git a/app/models/fasp/provider.rb b/app/models/fasp/provider.rb index 37d0b581c..9f7be482f 100644 --- a/app/models/fasp/provider.rb +++ b/app/models/fasp/provider.rb @@ -118,6 +118,10 @@ class Fasp::Provider < ApplicationRecord save! end + def delivery_failure_tracker + @delivery_failure_tracker ||= DeliveryFailureTracker.new(base_url, resolution: :minutes) + end + private def create_keypair diff --git a/spec/lib/fasp/request_spec.rb b/spec/lib/fasp/request_spec.rb index 9b354c8f4..380b79512 100644 --- a/spec/lib/fasp/request_spec.rb +++ b/spec/lib/fasp/request_spec.rb @@ -27,6 +27,14 @@ RSpec.describe Fasp::Request do 'Signature-Input' => /.+/, }) end + + it 'tracks that a successful connection was made' do + provider.delivery_failure_tracker.track_failure! + + expect do + subject.send(method, '/test_path') + end.to change(provider.delivery_failure_tracker, :failures).from(1).to(0) + end end context 'when the response is not signed' do @@ -55,6 +63,21 @@ RSpec.describe Fasp::Request do end end end + + context 'when the request raises an error' do + before do + stub_request(method, 'https://reqprov.example.com/fasp/test_path') + .to_raise(HTTP::ConnectionError) + end + + it "records the failure using the provider's delivery failure tracker" do + expect do + subject.send(method, '/test_path') + end.to raise_error(HTTP::ConnectionError) + + expect(provider.delivery_failure_tracker.failures).to eq 1 + end + end end describe '#get' do diff --git a/spec/models/fasp/provider_spec.rb b/spec/models/fasp/provider_spec.rb index 52df4638f..9fd2c4c23 100644 --- a/spec/models/fasp/provider_spec.rb +++ b/spec/models/fasp/provider_spec.rb @@ -206,4 +206,12 @@ RSpec.describe Fasp::Provider do end end end + + describe '#delivery_failure_tracker' do + subject { Fabricate(:fasp_provider) } + + it 'returns a `DeliverFailureTracker` instance' do + expect(subject.delivery_failure_tracker).to be_a(DeliveryFailureTracker) + end + end end