From aef991b1683e0511d1f622abea09b48ec06a73ad Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Wed, 7 Oct 2026 10:11:42 +0200 Subject: [PATCH 1/3] Report the right count when `req_perform_sequential()` is interrupted --- R/req-perform-sequential.R | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/R/req-perform-sequential.R b/R/req-perform-sequential.R index c26aba5d..0332c871 100644 --- a/R/req-perform-sequential.R +++ b/R/req-perform-sequential.R @@ -93,7 +93,10 @@ req_perform_sequential <- function( interrupt = function(cnd) { check_repeated_interrupt() - resps <- resps[seq_len(i)] + # interrupt might occur before request i completes + if (is.null(resps[[i]])) { + i <- i - 1 + } cli::cli_alert_warning( "Terminating iteration; returning {i} response{?s}." ) From 09ba059d83b0f014062c286735504fe663c9bf0e Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Wed, 7 Oct 2026 21:41:25 +0200 Subject: [PATCH 2/3] Truncate `resps` when `req_perform_sequential()` is interrupted --- R/req-perform-sequential.R | 1 + 1 file changed, 1 insertion(+) diff --git a/R/req-perform-sequential.R b/R/req-perform-sequential.R index 0332c871..43c77ffb 100644 --- a/R/req-perform-sequential.R +++ b/R/req-perform-sequential.R @@ -97,6 +97,7 @@ req_perform_sequential <- function( if (is.null(resps[[i]])) { i <- i - 1 } + resps <<- resps[seq_len(i)] cli::cli_alert_warning( "Terminating iteration; returning {i} response{?s}." ) From 8835c62011eba7a36f4455e53e7ca108d6585019 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Thu, 8 Oct 2026 00:23:14 +0200 Subject: [PATCH 3/3] Test `req_perform_sequential()` interrupt handling --- tests/testthat/_snaps/req-perform-sequential.md | 7 +++++++ tests/testthat/test-req-perform-sequential.R | 17 +++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/tests/testthat/_snaps/req-perform-sequential.md b/tests/testthat/_snaps/req-perform-sequential.md index bc8a083f..f9835bb4 100644 --- a/tests/testthat/_snaps/req-perform-sequential.md +++ b/tests/testthat/_snaps/req-perform-sequential.md @@ -11,3 +11,10 @@ Error in `req_perform_sequential()`: ! If supplied, `paths` must be the same length as `reqs`. +# user termination returns completed responses + + Code + resps <- req_perform_sequential(reqs) + Message + ! Terminating iteration; returning 1 response. + diff --git a/tests/testthat/test-req-perform-sequential.R b/tests/testthat/test-req-perform-sequential.R index 6e8da59c..f38eb600 100644 --- a/tests/testthat/test-req-perform-sequential.R +++ b/tests/testthat/test-req-perform-sequential.R @@ -72,3 +72,20 @@ test_that("mocking works", { expect_equal(resps[[1]]$request, req_200) expect_s3_class(resps[[2]], "httr2_http_404") }) + +test_that("user termination returns completed responses", { + local_mocked_responses(function(req) { + if (req$url == "https://interrupt") { + interrupt() + } + response() + }) + reqs <- list( + request("https://ok"), + request("https://interrupt"), + request("https://ok") + ) + + expect_snapshot(resps <- req_perform_sequential(reqs)) + expect_length(resps, 1) +})