From fa9e2a825fd5c922a7d29e15159df6e460c5685a Mon Sep 17 00:00:00 2001 From: Kevin VanNess <75155102+Kevanness@users.noreply.github.com> Date: Sat, 3 May 2025 14:57:54 -0600 Subject: [PATCH 1/4] test for mixed lengths --- tests/testthat/test-utils-multi.R | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/testthat/test-utils-multi.R b/tests/testthat/test-utils-multi.R index b5c897070..7613d1399 100644 --- a/tests/testthat/test-utils-multi.R +++ b/tests/testthat/test-utils-multi.R @@ -17,6 +17,25 @@ test_that("can handle multi query params", { ) }) +test_that("can handle mixed length multi query params", { + expect_equal( + multi_dots(a = 1:2, b = 1, c = NULL, .multi = "explode"), + list(a = I("1"), a = I("2"), b = I("1"), c = NULL) + ) + expect_equal( + multi_dots(a = 1:2, b = 1, c = NULL, .multi = "comma"), + list(a = I("1,2"), b = I("1"), c = NULL) + ) + expect_equal( + multi_dots(a = 1:2, b = 1, c = NULL, .multi = "pipe"), + list(a = I("1|2"), b = I("1"), c = NULL) + ) + expect_equal( + multi_dots(a = 1:2, b = 1, c = NULL, .multi = function(x) "X"), + list(a = I("X"), b = I("1"), c = NULL) + ) +}) + test_that("can opt-out of escaping for' vectors", { expect_equal( multi_dots(a = I(c(" ", " ")), .multi = "comma"), From 1a0a10fce44565f4a4ba8ea6b972a7b16b3bc2fc Mon Sep 17 00:00:00 2001 From: Kevin VanNess <75155102+Kevanness@users.noreply.github.com> Date: Sat, 3 May 2025 14:58:06 -0600 Subject: [PATCH 2/4] re-calculate lengths for explode --- R/utils-multi.R | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/R/utils-multi.R b/R/utils-multi.R index 2e1b2b78b..4ffb1b58d 100644 --- a/R/utils-multi.R +++ b/R/utils-multi.R @@ -64,13 +64,7 @@ multi_dots <- function( dots[n > 1] <- lapply(dots[n > 1], I) } else if (.multi == "explode") { dots <- explode(dots) - dots[n > 1] <- imap( - dots[n > 1], - format_query_param, - multi = TRUE, - form = form - ) - dots[n > 1] <- lapply(dots[n > 1], I) + n <- lengths(dots) } else if (.multi == "error") { cli::cli_abort( c( From d3bfcc4667255c9c0cfd9bc2222bb32c0f2b05ab Mon Sep 17 00:00:00 2001 From: Kevin VanNess <75155102+Kevanness@users.noreply.github.com> Date: Sun, 4 May 2025 19:53:39 -0600 Subject: [PATCH 3/4] add update bullet for 719 --- NEWS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS.md b/NEWS.md index 233d4bfbd..b7ab8015b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ # httr2 (development version) +* `multi_dots()` now re-calculates n lengths when using `.multi = "explode"` to avoid select/recycling issues (@Kevanness, #719). + # httr2 1.1.2 * `req_headers()` more carefully checks its input types (#707). From f40633c6a055240b8d08b1069bfd4ca0afef70d1 Mon Sep 17 00:00:00 2001 From: Kevin VanNess <75155102+Kevanness@users.noreply.github.com> Date: Mon, 5 May 2025 13:33:57 -0600 Subject: [PATCH 4/4] Update NEWS.md Co-authored-by: Hadley Wickham --- NEWS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index b7ab8015b..36646dd5e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,6 @@ # httr2 (development version) -* `multi_dots()` now re-calculates n lengths when using `.multi = "explode"` to avoid select/recycling issues (@Kevanness, #719). +* `req_url_query()` now re-calculates n lengths when using `.multi = "explode"` to avoid select/recycling issues (@Kevanness, #719). # httr2 1.1.2