From 9f514cb1fe939a9b0d2859caa7c050fec38f0c6b Mon Sep 17 00:00:00 2001 From: thiagomajesk <13930952+thiagomajesk@users.noreply.github.com> Date: Wed, 16 Oct 2024 19:35:42 -0300 Subject: [PATCH 1/2] Handle nil params in get requests --- lib/req/steps.ex | 5 ++--- test/req_test.exs | 8 ++++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/req/steps.ex b/lib/req/steps.ex index 33e332e..cca56e7 100644 --- a/lib/req/steps.ex +++ b/lib/req/steps.ex @@ -534,9 +534,8 @@ defmodule Req.Steps do put_params(request, Req.Request.get_option(request, :params, [])) end - defp put_params(request, []) do - request - end + defp put_params(request, []), do: request + defp put_params(request, nil), do: request defp put_params(request, params) do encoded = URI.encode_query(params) diff --git a/test/req_test.exs b/test/req_test.exs index b0a3970..90871cf 100644 --- a/test/req_test.exs +++ b/test/req_test.exs @@ -95,4 +95,12 @@ defmodule ReqTest do resp = Req.get!(origin_url, into: :self) assert Req.put!(echo_url, body: resp.body).body == "foobarbaz" end + + test "empty params", c do + Bypass.expect(c.bypass, "GET", "/", fn conn -> + Plug.Conn.send_resp(conn, 200, "") + end) + + assert %Req.Response{status: 200} = Req.get!(c.url, params: nil) + end end From 1338d4dfbb5c1a4fc22ecf767ef9f96541b9f4cb Mon Sep 17 00:00:00 2001 From: thiagomajesk <13930952+thiagomajesk@users.noreply.github.com> Date: Thu, 17 Oct 2024 10:42:00 -0300 Subject: [PATCH 2/2] Coalessce nil params and allow unsetting params --- lib/req.ex | 6 ++++++ lib/req/steps.ex | 3 +-- test/req_test.exs | 18 +++++++++++++++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/lib/req.ex b/lib/req.ex index 2f7d4de..8a0c157 100644 --- a/lib/req.ex +++ b/lib/req.ex @@ -544,6 +544,12 @@ defmodule Req do update_in( request.options, &Map.merge(&1, Map.new(options), fn + :params, nil, new -> + new + + :params, _old, nil -> + nil + :params, old, new -> Keyword.merge(old, new) diff --git a/lib/req/steps.ex b/lib/req/steps.ex index cca56e7..8110c5e 100644 --- a/lib/req/steps.ex +++ b/lib/req/steps.ex @@ -535,10 +535,9 @@ defmodule Req.Steps do end defp put_params(request, []), do: request - defp put_params(request, nil), do: request defp put_params(request, params) do - encoded = URI.encode_query(params) + encoded = URI.encode_query(params || []) update_in(request.url.query, fn nil -> encoded diff --git a/test/req_test.exs b/test/req_test.exs index 90871cf..aac7c6e 100644 --- a/test/req_test.exs +++ b/test/req_test.exs @@ -96,11 +96,27 @@ defmodule ReqTest do assert Req.put!(echo_url, body: resp.body).body == "foobarbaz" end - test "empty params", c do + test "merge params" do + req = Req.new(url: "/", params: [a: 1]) + assert %{options: %{params: [a: 1, b: 2]}} = Req.merge(req, params: [b: 2]) + end + + test "merge with empty params" do + req = Req.new(url: "/", params: nil) + assert %{options: %{params: [a: 1]}} = Req.merge(req, params: [a: 1]) + + req = Req.new(url: "/", params: [a: 1]) + assert %{options: %{params: nil}} = Req.merge(req, params: nil) + end + + test "request with empty params", c do Bypass.expect(c.bypass, "GET", "/", fn conn -> Plug.Conn.send_resp(conn, 200, "") end) + + assert {:ok, %Req.Response{}} = Req.get(Req.new(url: c.url, params: [a: 1]), params: nil) + assert {:ok, %Req.Response{}} = Req.get(Req.new(url: c.url, params: nil), params: [a: 1]) assert %Req.Response{status: 200} = Req.get!(c.url, params: nil) end end