Compare commits
2 commits
de29cb2b51
...
b96516405e
Author | SHA1 | Date | |
---|---|---|---|
b96516405e | |||
a191077cc4 |
3 changed files with 27 additions and 12 deletions
|
@ -244,10 +244,20 @@ defmodule Wayfarer.Server.Proxy do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp handle_responses(conn, [{:done, req} | _], mint, req) do
|
# If the connection is done without sending any body content, then we need to
|
||||||
{:ok, Conn.halt(conn), mint}
|
# send the respond and halt the conn.
|
||||||
|
defp handle_responses(conn, [{:done, req} | _], mint, req) when conn.state == :unset do
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> Conn.send_resp(conn.status, "")
|
||||||
|
|> Conn.halt()
|
||||||
|
|
||||||
|
{:ok, conn, mint}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp handle_responses(conn, [{:done, req} | _], mint, req) when conn.state == :chunked,
|
||||||
|
do: {:ok, Conn.halt(conn), mint}
|
||||||
|
|
||||||
defp handle_responses(conn, [{:error, req, reason} | _], _mint, req), do: {:error, conn, reason}
|
defp handle_responses(conn, [{:error, req, reason} | _], _mint, req), do: {:error, conn, reason}
|
||||||
|
|
||||||
defp send_request(conn, mint) do
|
defp send_request(conn, mint) do
|
||||||
|
|
|
@ -106,7 +106,8 @@ defmodule Wayfarer.Server.WebSocketProxy do
|
||||||
defp handle_error({:error, _, %{reason: reason}, _}, state),
|
defp handle_error({:error, _, %{reason: reason}, _}, state),
|
||||||
do: handle_error({:error, reason}, state)
|
do: handle_error({:error, reason}, state)
|
||||||
|
|
||||||
defp handle_error({:error, reason, state}, _state), do: handle_error({:error, reason}, state)
|
defp handle_error({:error, reason, state}, _state),
|
||||||
|
do: handle_error({:error, reason}, state)
|
||||||
|
|
||||||
defp handle_error({:error, reason}, state) do
|
defp handle_error({:error, reason}, state) do
|
||||||
Logger.debug(fn ->
|
Logger.debug(fn ->
|
||||||
|
@ -218,14 +219,18 @@ defmodule Wayfarer.Server.WebSocketProxy do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp response_for_messages([], state), do: {:ok, state}
|
# Handle all the frames coming from the target and decide how to respond to
|
||||||
|
# Bandit/WebSock. In the case of encountering a close frame, we terminate the
|
||||||
|
# client websocket with the same code, otherwise we just copy the frames over.
|
||||||
|
defp response_for_messages(messages, state, response \\ [])
|
||||||
|
defp response_for_messages([], state, []), do: {:ok, state}
|
||||||
|
defp response_for_messages([], state, response), do: {:push, Enum.reverse(response), state}
|
||||||
|
|
||||||
defp response_for_messages(messages, state) do
|
defp response_for_messages([{:close, code, _} | _], state, response),
|
||||||
case Enum.split_with(messages, &(elem(&1, 0) == :close)) do
|
do: {:stop, :normal, code, Enum.reverse(response), state}
|
||||||
{[], messages} -> {:push, messages, state}
|
|
||||||
{[{:close, code, _} | _], messages} -> {:stop, :normal, code, messages, state}
|
defp response_for_messages([message | messages], state, response),
|
||||||
end
|
do: response_for_messages(messages, state, [message | response])
|
||||||
end
|
|
||||||
|
|
||||||
defp request_client_frame(conn, {frame_type, frame}) do
|
defp request_client_frame(conn, {frame_type, frame}) do
|
||||||
frame_size = byte_size(frame)
|
frame_size = byte_size(frame)
|
||||||
|
|
|
@ -55,7 +55,7 @@ defmodule Wayfarer.Server.ProxyTest do
|
||||||
{:ok, mint, req}
|
{:ok, mint, req}
|
||||||
end)
|
end)
|
||||||
|> stub(:stream, fn mint, :ignore -> {:ok, mint, responses} end)
|
|> stub(:stream, fn mint, :ignore -> {:ok, mint, responses} end)
|
||||||
|> stub(:stream, fn mint, _ -> {:ok, mint, [{:done, req}]} end)
|
|> stub(:stream, fn mint, _ -> {:ok, mint, [{:status, req, 200}, {:done, req}]} end)
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "request/2" do
|
describe "request/2" do
|
||||||
|
@ -79,7 +79,7 @@ defmodule Wayfarer.Server.ProxyTest do
|
||||||
{:ok, mint, req}
|
{:ok, mint, req}
|
||||||
end)
|
end)
|
||||||
|> expect(:stream, fn mint, :ignore ->
|
|> expect(:stream, fn mint, :ignore ->
|
||||||
{:ok, mint, [{:done, req}]}
|
{:ok, mint, [{:status, req, 200}, {:done, req}]}
|
||||||
end)
|
end)
|
||||||
|
|
||||||
assert conn = Proxy.request(conn, target)
|
assert conn = Proxy.request(conn, target)
|
||||||
|
|
Loading…
Reference in a new issue