diff --git a/lib/minch/conn.ex b/lib/minch/conn.ex index 5376eeb..38fd24c 100644 --- a/lib/minch/conn.ex +++ b/lib/minch/conn.ex @@ -181,6 +181,10 @@ defmodule Minch.Conn do defp handle_frame(_frame, %State{conn: nil} = state), do: {:noreply, state} + defp handle_frame({:error, reason}, %State{} = state) do + handle_error({:decode_frame, reason}, state) + end + # the server initiated close defp handle_frame({:close, _, _} = frame, %State{close_frame: nil} = state) do state = state |> stream_frame(frame) |> discard_error() diff --git a/test/minch/client_test.exs b/test/minch/client_test.exs index bef16a4..f1608bf 100644 --- a/test/minch/client_test.exs +++ b/test/minch/client_test.exs @@ -147,6 +147,14 @@ defmodule Minch.ClientTest do assert_receive {:client, :handle_frame, [{:pong, "123"}, _state]} end + test "handle_error/2 is called for a frame that fails to decode", ctx do + assert_receive {:client, :handle_connect, _} + Server.send_frame(ctx.server, [{:text, <<0xFF>>}, {:text, "a"}]) + assert_receive {:client, :handle_error, [{:decode_frame, {:invalid_utf8, <<0xFF>>}}, _]} + assert_receive {:client, :handle_frame, [{:text, "a"}, _state]} + refute_received {:client, :handle_frame, [{:error, _}, _state]} + end + test "handle_frame/2 is called with frames received before a close", ctx do assert_receive {:client, :handle_connect, _} # suspended so the frames and the socket close land in the mailbox together