From a4104822eabdbcb60111cc249017189fa8e0a3bf Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Mon, 11 Mar 2024 08:45:52 +0100 Subject: [PATCH] Handle errors in `rack.after_reply` Ref: https://github.com/Shopify/pitchfork/issues/97 Don't break the callback chain if one callback raised. --- CHANGELOG.md | 2 ++ lib/pitchfork/http_server.rb | 8 +++++++- test/slow/test_server.rb | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf25e2e0..8c408eba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Unreleased +- Don't break the `rack.after_reply` callback chain if one callback raises (#97). + # 0.11.1 - Fix Ruby 3.4-dev compatibility. diff --git a/lib/pitchfork/http_server.rb b/lib/pitchfork/http_server.rb index eb05a19d..6ad39df7 100644 --- a/lib/pitchfork/http_server.rb +++ b/lib/pitchfork/http_server.rb @@ -762,7 +762,13 @@ def process_client(client, worker, timeout_handler) handle_error(client, e) env ensure - env["rack.after_reply"].each(&:call) if env + if env + env["rack.after_reply"].each do |callback| + callback.call + rescue => error + Pitchfork.log_error(@logger, "rack.after_reply error", error) + end + end timeout_handler.finished env end diff --git a/test/slow/test_server.rb b/test/slow/test_server.rb index cd4faec7..7118bb7e 100644 --- a/test/slow/test_server.rb +++ b/test/slow/test_server.rb @@ -41,6 +41,7 @@ def call(env) while env['rack.input'].read(4096) end + env["rack.after_reply"] << -> { raise "oops" } env["rack.after_reply"] << -> { @called = true } [200, { 'content-type' => 'text/plain' }, ["after_reply_called: #{@called}"]]