From 641be24b69bc6cf95fd26ac178d1b8a7c9b14572 Mon Sep 17 00:00:00 2001 From: Jaden Date: Sat, 6 Sep 2025 15:19:46 -0700 Subject: [PATCH 1/3] Add request header merging in fetch_upstream Introduces put_request_headers to merge connection headers into the request before making upstream fetch calls. Also renames put_headers to put_conn_headers for clarity. --- lib/phoenix/sync/electric/client_adapter.ex | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/phoenix/sync/electric/client_adapter.ex b/lib/phoenix/sync/electric/client_adapter.ex index 4370b2c..b6c993a 100644 --- a/lib/phoenix/sync/electric/client_adapter.ex +++ b/lib/phoenix/sync/electric/client_adapter.ex @@ -51,6 +51,8 @@ defmodule Phoenix.Sync.Electric.ClientAdapter do defp live?(live), do: live == "true" defp fetch_upstream(sync_client, conn, request) do + request = put_request_headers(request, conn) + response = case Client.Fetch.request(sync_client.client, request) do %Client.Fetch.Response{} = response -> response @@ -58,11 +60,18 @@ defmodule Phoenix.Sync.Electric.ClientAdapter do end conn - |> put_headers(response.headers) + |> put_conn_headers(response.headers) |> Plug.Conn.send_resp(response.status, response.body) end - defp put_headers(conn, headers) do + defp put_request_headers(request, conn) do + conn.req_headers + |> Enum.into(%{}) + |> Map.merge(request.headers) + |> then(&Map.put(request, :headers, &1)) + end + + defp put_conn_headers(conn, headers) do headers |> Map.delete("transfer-encoding") |> Enum.reduce(conn, fn {header, values}, conn -> From 9b6aac11d5a9028e62e3b1940b66d9ae90098816 Mon Sep 17 00:00:00 2001 From: Jaden Date: Sat, 6 Sep 2025 16:23:27 -0700 Subject: [PATCH 2/3] handle header array values Refactors put_request_headers to correctly merge multiple header values and updates fetch_upstream to pass req_headers directly. This ensures headers are properly combined when forwarding requests upstream. --- lib/phoenix/sync/electric/client_adapter.ex | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/phoenix/sync/electric/client_adapter.ex b/lib/phoenix/sync/electric/client_adapter.ex index b6c993a..fee70b1 100644 --- a/lib/phoenix/sync/electric/client_adapter.ex +++ b/lib/phoenix/sync/electric/client_adapter.ex @@ -51,7 +51,7 @@ defmodule Phoenix.Sync.Electric.ClientAdapter do defp live?(live), do: live == "true" defp fetch_upstream(sync_client, conn, request) do - request = put_request_headers(request, conn) + request = put_request_headers(request, conn.req_headers) response = case Client.Fetch.request(sync_client.client, request) do @@ -64,10 +64,13 @@ defmodule Phoenix.Sync.Electric.ClientAdapter do |> Plug.Conn.send_resp(response.status, response.body) end - defp put_request_headers(request, conn) do - conn.req_headers - |> Enum.into(%{}) - |> Map.merge(request.headers) + defp put_request_headers(request, headers) do + Enum.reduce(headers, request.headers, fn {header, value}, acc -> + Map.update(acc, header, value, fn + existing when is_binary(existing) -> [existing, value] + existing when is_list(existing) -> existing ++ [value] + end) + end) |> then(&Map.put(request, :headers, &1)) end From bd9c0c29cb7d33a7c8c437f2ab4aa1077bd2a68c Mon Sep 17 00:00:00 2001 From: Jaden Date: Sat, 6 Sep 2025 16:24:30 -0700 Subject: [PATCH 3/3] update header helper function names --- lib/phoenix/sync/electric/client_adapter.ex | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/phoenix/sync/electric/client_adapter.ex b/lib/phoenix/sync/electric/client_adapter.ex index fee70b1..fdcf5bc 100644 --- a/lib/phoenix/sync/electric/client_adapter.ex +++ b/lib/phoenix/sync/electric/client_adapter.ex @@ -51,7 +51,7 @@ defmodule Phoenix.Sync.Electric.ClientAdapter do defp live?(live), do: live == "true" defp fetch_upstream(sync_client, conn, request) do - request = put_request_headers(request, conn.req_headers) + request = put_req_headers(request, conn.req_headers) response = case Client.Fetch.request(sync_client.client, request) do @@ -60,11 +60,11 @@ defmodule Phoenix.Sync.Electric.ClientAdapter do end conn - |> put_conn_headers(response.headers) + |> put_resp_headers(response.headers) |> Plug.Conn.send_resp(response.status, response.body) end - defp put_request_headers(request, headers) do + defp put_req_headers(request, headers) do Enum.reduce(headers, request.headers, fn {header, value}, acc -> Map.update(acc, header, value, fn existing when is_binary(existing) -> [existing, value] @@ -74,7 +74,7 @@ defmodule Phoenix.Sync.Electric.ClientAdapter do |> then(&Map.put(request, :headers, &1)) end - defp put_conn_headers(conn, headers) do + defp put_resp_headers(conn, headers) do headers |> Map.delete("transfer-encoding") |> Enum.reduce(conn, fn {header, values}, conn ->