diff --git a/apps/emqx/src/emqx_ws_connection.erl b/apps/emqx/src/emqx_ws_connection.erl index 6cc86e5f4..93c29bf4f 100644 --- a/apps/emqx/src/emqx_ws_connection.erl +++ b/apps/emqx/src/emqx_ws_connection.erl @@ -699,7 +699,7 @@ check_oom(State = #state{channel = Channel}) -> %%-------------------------------------------------------------------- parse_incoming(<<>>, Packets, State) -> - {Packets, State}; + {lists:reverse(Packets), State}; parse_incoming(Data, Packets, State = #state{parse_state = ParseState}) -> try emqx_frame:parse(Data, ParseState) of {more, NParseState} -> diff --git a/apps/emqx/test/emqx_ws_connection_SUITE.erl b/apps/emqx/test/emqx_ws_connection_SUITE.erl index 06be28a9c..9860248fe 100644 --- a/apps/emqx/test/emqx_ws_connection_SUITE.erl +++ b/apps/emqx/test/emqx_ws_connection_SUITE.erl @@ -530,6 +530,14 @@ t_parse_incoming(_) -> Packet = ?PUBLISH_PACKET(?QOS_0, <<"t">>, undefined, <<>>), ?assertMatch([{incoming, Packet}], Packets1). +t_parse_incoming_order(_) -> + Packet1 = ?PUBLISH_PACKET(?QOS_0, <<"t1">>, undefined, <<>>), + Packet2 = ?PUBLISH_PACKET(?QOS_0, <<"t2">>, undefined, <<>>), + Bin1 = emqx_frame:serialize(Packet1), + Bin2 = emqx_frame:serialize(Packet2), + {Packets1, _} = ?ws_conn:parse_incoming(erlang:iolist_to_binary([Bin1, Bin2]), [], st()), + ?assertMatch([{incoming, Packet1}, {incoming, Packet2}], Packets1). + t_parse_incoming_frame_error(_) -> {Packets, _St} = ?ws_conn:parse_incoming(<<3, 2, 1, 0>>, [], st()), FrameError = {frame_error, malformed_packet}, diff --git a/changes/ce/fix-11250.en.md b/changes/ce/fix-11250.en.md new file mode 100644 index 000000000..15e193368 --- /dev/null +++ b/changes/ce/fix-11250.en.md @@ -0,0 +1,2 @@ +Fix while a WebSocket packet contains more than one MQTT packet, the order of MQTT packets will be reversed. +