Skip to content

Commit da2724a

Browse files
authored
Re-calculate lengths after exploding (#723)
Fixes #719
1 parent 19d57be commit da2724a

File tree

3 files changed

+22
-7
lines changed

3 files changed

+22
-7
lines changed

NEWS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# httr2 (development version)
22

3+
* `req_url_query()` now re-calculates n lengths when using `.multi = "explode"` to avoid select/recycling issues (@Kevanness, #719).
4+
35
# httr2 1.1.2
46

57
* `req_headers()` more carefully checks its input types (#707).

R/utils-multi.R

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,7 @@ multi_dots <- function(
6464
dots[n > 1] <- lapply(dots[n > 1], I)
6565
} else if (.multi == "explode") {
6666
dots <- explode(dots)
67-
dots[n > 1] <- imap(
68-
dots[n > 1],
69-
format_query_param,
70-
multi = TRUE,
71-
form = form
72-
)
73-
dots[n > 1] <- lapply(dots[n > 1], I)
67+
n <- lengths(dots)
7468
} else if (.multi == "error") {
7569
cli::cli_abort(
7670
c(

tests/testthat/test-utils-multi.R

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,25 @@ test_that("can handle multi query params", {
1717
)
1818
})
1919

20+
test_that("can handle mixed length multi query params", {
21+
expect_equal(
22+
multi_dots(a = 1:2, b = 1, c = NULL, .multi = "explode"),
23+
list(a = I("1"), a = I("2"), b = I("1"), c = NULL)
24+
)
25+
expect_equal(
26+
multi_dots(a = 1:2, b = 1, c = NULL, .multi = "comma"),
27+
list(a = I("1,2"), b = I("1"), c = NULL)
28+
)
29+
expect_equal(
30+
multi_dots(a = 1:2, b = 1, c = NULL, .multi = "pipe"),
31+
list(a = I("1|2"), b = I("1"), c = NULL)
32+
)
33+
expect_equal(
34+
multi_dots(a = 1:2, b = 1, c = NULL, .multi = function(x) "X"),
35+
list(a = I("X"), b = I("1"), c = NULL)
36+
)
37+
})
38+
2039
test_that("can opt-out of escaping for' vectors", {
2140
expect_equal(
2241
multi_dots(a = I(c(" ", " ")), .multi = "comma"),

0 commit comments

Comments
 (0)