From 8f95e125341fc56916b9513062dbddb8ff3f63d8 Mon Sep 17 00:00:00 2001 From: zhanghongtong Date: Thu, 23 Jul 2020 15:46:53 +0800 Subject: [PATCH] fix(emqx_channel): EMQ X replaces MQTT properties when node connects using "topic-alias-maximum" property --- src/emqx_channel.erl | 17 ++++++++++++++--- test/emqx_channel_SUITE.erl | 20 +++++++++++++++++--- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/emqx_channel.erl b/src/emqx_channel.erl index d0f951596..450492852 100644 --- a/src/emqx_channel.erl +++ b/src/emqx_channel.erl @@ -1239,14 +1239,21 @@ process_alias(_Packet, Channel) -> {ok, Channel}. %% Packing Topic Alias packing_alias(Packet = #mqtt_packet{ - variable = #mqtt_packet_publish{topic_name = Topic} = Publish + variable = #mqtt_packet_publish{ + topic_name = Topic, + properties = Prop + } = Publish }, Channel = ?IS_MQTT_V5 = #channel{topic_aliases = TopicAliases, alias_maximum = Limits}) -> case find_alias(outbound, Topic, TopicAliases) of {ok, AliasId} -> + NProp = case Prop of + undefined -> #{'Topic-Alias' => AliasId}; + _ -> maps:merge(Prop, #{'Topic-Alias' => AliasId}) + end, NPublish = Publish#mqtt_packet_publish{ topic_name = <<>>, - properties = #{'Topic-Alias' => AliasId} + properties = NProp }, {Packet#mqtt_packet{variable = NPublish}, Channel}; error -> @@ -1257,9 +1264,13 @@ packing_alias(Packet = #mqtt_packet{ true -> NTopicAliases = save_alias(outbound, AliasId, Topic, TopicAliases), NChannel = Channel#channel{topic_aliases = NTopicAliases}, + NProp = case Prop of + undefined -> #{'Topic-Alias' => AliasId}; + _ -> maps:merge(Prop, #{'Topic-Alias' => AliasId}) + end, NPublish = Publish#mqtt_packet_publish{ topic_name = Topic, - properties = #{'Topic-Alias' => AliasId} + properties = NProp }, {Packet#mqtt_packet{variable = NPublish}, NChannel}; false -> {Packet, Channel} diff --git a/test/emqx_channel_SUITE.erl b/test/emqx_channel_SUITE.erl index 2dba03dfb..506dd2812 100644 --- a/test/emqx_channel_SUITE.erl +++ b/test/emqx_channel_SUITE.erl @@ -532,15 +532,29 @@ t_process_alias(_) -> emqx_channel:process_alias(#mqtt_packet{variable = Publish}, Channel). t_packing_alias(_) -> - Packet1 = #mqtt_packet{variable = #mqtt_packet_publish{topic_name = <<"x">>}}, + Packet1 = #mqtt_packet{variable = #mqtt_packet_publish{ + topic_name = <<"x">>, + properties = #{'User-Property' => [{<<"k">>, <<"v">>}]} + }}, Packet2 = #mqtt_packet{variable = #mqtt_packet_publish{topic_name = <<"y">>}}, Channel = emqx_channel:set_field(alias_maximum, #{outbound => 1}, channel()), {RePacket1, NChannel1} = emqx_channel:packing_alias(Packet1, Channel), - ?assertEqual(#mqtt_packet{variable = #mqtt_packet_publish{topic_name = <<"x">>, properties = #{'Topic-Alias' => 1}}}, RePacket1), + ?assertEqual(#mqtt_packet{variable = #mqtt_packet_publish{ + topic_name = <<"x">>, + properties = #{ + 'Topic-Alias' => 1, + 'User-Property' => [{<<"k">>, <<"v">>}] + } + }}, RePacket1), {RePacket2, NChannel2} = emqx_channel:packing_alias(Packet1, NChannel1), - ?assertEqual(#mqtt_packet{variable = #mqtt_packet_publish{topic_name = <<>>, properties = #{'Topic-Alias' => 1}}}, RePacket2), + ?assertEqual(#mqtt_packet{variable = #mqtt_packet_publish{ + topic_name = <<>>, + properties = #{ + 'Topic-Alias' => 1, + 'User-Property' => [{<<"k">>, <<"v">>}] + }}}, RePacket2), {RePacket3, _} = emqx_channel:packing_alias(Packet2, NChannel2), ?assertEqual(#mqtt_packet{variable = #mqtt_packet_publish{topic_name = <<"y">>, properties = undefined}}, RePacket3),