diff --git a/.tool-versions b/.tool-versions index 1b46c89..93fce84 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ -elixir 1.13.0 -erlang 24.0.1 +elixir 1.18.2 +erlang 27.3.1 diff --git a/lib/reverse_proxy_plug/http_client/adapters/req.ex b/lib/reverse_proxy_plug/http_client/adapters/req.ex index bc5015e..a1d7ac1 100644 --- a/lib/reverse_proxy_plug/http_client/adapters/req.ex +++ b/lib/reverse_proxy_plug/http_client/adapters/req.ex @@ -118,7 +118,16 @@ if Code.ensure_loaded?(Req) do end defp normalize_headers(headers) do - Enum.map(headers, fn {k, v} -> {k, v |> List.wrap() |> Enum.join(", ")} end) + Enum.flat_map(headers, fn + {"set-cookie", values} when is_list(values) -> + Enum.map(values, &{"set-cookie", &1}) + + {"set-cookie", value} -> + [{"set-cookie", value}] + + {k, v} -> + [{k, v |> List.wrap() |> Enum.join(", ")}] + end) end end end diff --git a/test/http_client/adapters/req_test.exs b/test/http_client/adapters/req_test.exs index 310d75f..ca57d7d 100644 --- a/test/http_client/adapters/req_test.exs +++ b/test/http_client/adapters/req_test.exs @@ -73,6 +73,44 @@ defmodule ReverseProxyPlug.HTTPClient.Adapters.ReqTest do assert {:error, %Error{reason: :econnrefused}} == ReqClient.request(req) end + + test "should not merge set-cookie headers with method #{method}", %{bypass: bypass} do + path = "/my-resource" + + req = %Request{ + method: unquote(method), + options: [finch: FinchTest], + url: "http://localhost:8000#{path}" + } + + Bypass.expect_once(bypass, fn %Plug.Conn{} = conn -> + assert conn.method == req.method |> to_string() |> String.upcase() + assert conn.request_path == path + + conn + |> Plug.Conn.prepend_resp_headers([{"set-cookie", "foo=bar; Path=/"}]) + |> Plug.Conn.prepend_resp_headers([{"set-cookie", "baz=quux; Path=/"}]) + |> Plug.Conn.send_resp(204, "") + end) + + assert {:ok, stream} = ReqClient.request_stream(req) + + assert [ + {:status, 204}, + {:headers, headers} + ] = Enum.to_list(stream) + + set_cookie_headers = + Enum.filter(headers, fn + {"set-cookie", _} -> true + _ -> false + end) + + assert set_cookie_headers == [ + {"set-cookie", "foo=bar; Path=/"}, + {"set-cookie", "baz=quux; Path=/"} + ] + end end end end