diff --git a/apps/emqx_gateway/src/bhvrs/emqx_gateway_conn.erl b/apps/emqx_gateway/src/bhvrs/emqx_gateway_conn.erl index 041a8e6f1..8df531a43 100644 --- a/apps/emqx_gateway/src/bhvrs/emqx_gateway_conn.erl +++ b/apps/emqx_gateway/src/bhvrs/emqx_gateway_conn.erl @@ -710,10 +710,7 @@ parse_incoming( ) -> try FrameMod:parse(Data, ParseState) of {more, NParseState} -> - if - Data == <<$\n>> -> {[Data], State#state{parse_state = NParseState}}; - true -> {Packets, State#state{parse_state = NParseState}} - end; + {Packets, State#state{parse_state = NParseState}}; {ok, Packet, Rest, NParseState} -> NState = State#state{parse_state = NParseState}, parse_incoming(Rest, [Packet | Packets], NState) diff --git a/apps/emqx_gateway_stomp/src/emqx_stomp_channel.erl b/apps/emqx_gateway_stomp/src/emqx_stomp_channel.erl index a3f744280..cd2359269 100644 --- a/apps/emqx_gateway_stomp/src/emqx_stomp_channel.erl +++ b/apps/emqx_gateway_stomp/src/emqx_stomp_channel.erl @@ -654,7 +654,7 @@ handle_in( end, {ok, Outgoings, Channel}; handle_in( - <<$\n>>, + ?PACKET(?CMD_HEARTBEAT), Channel = #channel{heartbeat = Heartbeat} ) -> NewHeartbeat = emqx_stomp_heartbeat:reset(incoming, 0, Heartbeat), diff --git a/apps/emqx_gateway_stomp/src/emqx_stomp_frame.erl b/apps/emqx_gateway_stomp/src/emqx_stomp_frame.erl index 9921ad318..99593155b 100644 --- a/apps/emqx_gateway_stomp/src/emqx_stomp_frame.erl +++ b/apps/emqx_gateway_stomp/src/emqx_stomp_frame.erl @@ -140,6 +140,9 @@ g(Key, Opts, Val) -> -spec parse(binary(), parse_state()) -> parse_result(). parse(<<>>, Parser) -> {more, Parser}; +%% treat the \n as a heartbeat frame +parse(<<$\n>>, Parser = #{phase := none}) -> + {ok, #stomp_frame{command = ?CMD_HEARTBEAT}, <<>>, Parser}; parse(Bytes, #{phase := body, length := Len, state := State}) -> parse(body, Bytes, State, Len); parse(<>, #{phase := hdname, state := State}) -> @@ -346,9 +349,7 @@ serialize_pkt( serialize_pkt(header, {Name, Val}) when is_integer(Val) -> [escape(Name), ?COLON, integer_to_list(Val), ?LF]; serialize_pkt(header, {Name, Val}) -> - [escape(Name), ?COLON, escape(Val), ?LF]; -serialize_pkt(<<$\n>>, _SerializeOpts) -> - <<$\n>>. + [escape(Name), ?COLON, escape(Val), ?LF]. escape(Bin) when is_binary(Bin) -> <<<<(escape(Ch))/binary>> || <> <= Bin>>;