@@ -51,6 +51,8 @@ defmodule Phoenix.Sync.Electric.ClientAdapter do
5151 defp live? ( live ) , do: live == "true"
5252
5353 defp fetch_upstream ( sync_client , conn , request , shape ) do
54+ request = put_req_headers ( request , conn . req_headers )
55+
5456 response =
5557 case Client.Fetch . request ( sync_client . client , request ) do
5658 % Client.Fetch.Response { } = response -> response
@@ -68,18 +70,33 @@ defmodule Phoenix.Sync.Electric.ClientAdapter do
6870 end
6971
7072 conn
71- |> put_headers ( response . headers )
73+ |> put_resp_headers ( response . headers )
7274 |> Plug.Conn . send_resp ( response . status , body )
7375 end
7476
75- defp put_headers ( conn , headers ) do
76- headers
77- |> Map . delete ( "transfer-encoding" )
78- |> Enum . reduce ( conn , fn { header , values } , conn ->
79- Enum . reduce ( values , conn , fn value , conn ->
80- Plug.Conn . put_resp_header ( conn , header , value )
77+ defp put_req_headers ( request , headers ) do
78+ merged_headers =
79+ Enum . reduce ( headers , request . headers , fn { header , value } , acc ->
80+ Map . update ( acc , header , [ value ] , fn existing -> [ value | List . wrap ( existing ) ] end )
8181 end )
82- end )
82+ |> expand_headers ( )
83+
84+ % { request | headers: merged_headers }
85+ end
86+
87+ defp put_resp_headers ( conn , headers ) do
88+ resp_headers =
89+ headers
90+ |> Map . delete ( "transfer-encoding" )
91+ |> expand_headers ( )
92+
93+ Plug.Conn . merge_resp_headers ( conn , resp_headers )
94+ end
95+
96+ # turn headers into a list which is more compatible than a map
97+ # representation as it preserves multiple values for a header.
98+ defp expand_headers ( headers ) when is_map ( headers ) do
99+ Enum . flat_map ( headers , fn { k , v } -> Enum . map ( List . wrap ( v ) , & { k , & 1 } ) end )
83100 end
84101 end
85102end
0 commit comments