Skip to content

Commit

Permalink
Provide a better error message when getting malformed V1 Socket Paylo…
Browse files Browse the repository at this point in the history
  • Loading branch information
aselder authored Feb 20, 2023
1 parent 85e2c89 commit 6aef3e2
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 4 deletions.
12 changes: 9 additions & 3 deletions lib/phoenix/socket/serializers/v1_json_serializer.ex
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,15 @@ defmodule Phoenix.Socket.V1.JSONSerializer do

@impl true
def decode!(message, _opts) do
message
|> Phoenix.json_library().decode!()
|> Phoenix.Socket.Message.from_map!()
payload = Phoenix.json_library().decode!(message)

case payload do
%{} ->
Phoenix.Socket.Message.from_map!(payload)

other ->
raise "V1 JSON Serializer expected a map, got #{inspect(other)}"
end
end

defp encode_v1_fields_only(%Message{} = msg) do
Expand Down
11 changes: 10 additions & 1 deletion test/phoenix/socket/v1_json_serializer_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ defmodule Phoenix.Socket.V1.JSONSerializerTest do
# v1 responses must not contain join_ref
@serializer V1.JSONSerializer
@v1_msg_json "{\"event\":\"e\",\"payload\":\"m\",\"ref\":null,\"topic\":\"t\"}"
@v1_bad_json "[null,null,\"t\",\"e\",{\"m\":1}]"
@v1_reply_json "{\"event\":\"phx_reply\",\"payload\":{\"response\":null,\"status\":null},\"ref\":\"null\",\"topic\":\"t\"}"
@v1_fastlane_json "{\"event\":\"e\",\"payload\":\"m\",\"ref\":null,\"topic\":\"t\"}"

Expand Down Expand Up @@ -33,7 +34,15 @@ defmodule Phoenix.Socket.V1.JSONSerializerTest do

test "decode!/2 decodes `Phoenix.Socket.Message` from JSON" do
assert %Message{topic: "t", event: "e", payload: "m"} ==
decode!(@serializer, @v1_msg_json, opcode: :text)
decode!(@serializer, @v1_msg_json, opcode: :text)
end

test "decode!/2 raise a PayloadFormatException if the JSON doesn't contain a map" do
assert_raise(
RuntimeError,
"V1 JSON Serializer expected a map, got [nil, nil, \"t\", \"e\", %{\"m\" => 1}]",
fn -> decode!(@serializer, @v1_bad_json, opcode: :text) end
)
end

test "fastlane!/1 encodes a broadcast into a message as JSON" do
Expand Down

0 comments on commit 6aef3e2

Please sign in to comment.