Fix unsuback compat (#2102)

This commit is contained in:
Gilbert 2018-12-22 18:47:38 +08:00 committed by turtleDeng
parent edf0ded9f3
commit 1797aadbe7
3 changed files with 22 additions and 17 deletions

View File

@ -283,8 +283,8 @@ preprocess_properties(Packet = #mqtt_packet{
topic_name = <<>>,
properties = #{'Topic-Alias' := AliasId}}
},
PState = #pstate{proto_ver = ?MQTT_PROTO_V5,
topic_aliases = Aliases,
PState = #pstate{proto_ver = ?MQTT_PROTO_V5,
topic_aliases = Aliases,
topic_alias_maximum = #{from_client := TopicAliasMaximum}}) ->
case AliasId =< TopicAliasMaximum of
true ->
@ -300,7 +300,7 @@ preprocess_properties(Packet = #mqtt_packet{
topic_name = Topic,
properties = #{'Topic-Alias' := AliasId}}
},
PState = #pstate{proto_ver = ?MQTT_PROTO_V5,
PState = #pstate{proto_ver = ?MQTT_PROTO_V5,
topic_aliases = Aliases,
topic_alias_maximum = #{from_client := TopicAliasMaximum}}) ->
case AliasId =< TopicAliasMaximum of
@ -521,11 +521,7 @@ connack({?RC_SUCCESS, SP, PState}) ->
connack({ReasonCode, PState = #pstate{proto_ver = ProtoVer}}) ->
emqx_hooks:run('client.connected', [credentials(PState), ReasonCode, attrs(PState)]),
ReasonCode1 = if ProtoVer =:= ?MQTT_PROTO_V5 ->
ReasonCode;
true ->
emqx_reason_codes:compat(connack, ReasonCode)
end,
[ReasonCode1] = reason_codes_compat(connack, [ReasonCode], ProtoVer),
_ = deliver({connack, ReasonCode1}, PState),
{error, emqx_reason_codes:name(ReasonCode1, ProtoVer), PState}.
@ -633,15 +629,10 @@ deliver({pubrec, PacketId, ReasonCode}, PState) ->
send(?PUBREC_PACKET(PacketId, ReasonCode), PState);
deliver({suback, PacketId, ReasonCodes}, PState = #pstate{proto_ver = ProtoVer}) ->
send(?SUBACK_PACKET(PacketId,
if ProtoVer =:= ?MQTT_PROTO_V5 ->
ReasonCodes;
true ->
[emqx_reason_codes:compat(suback, RC) || RC <- ReasonCodes]
end), PState);
send(?SUBACK_PACKET(PacketId, reason_codes_compat(suback, ReasonCodes, ProtoVer)), PState);
deliver({unsuback, PacketId, ReasonCodes}, PState) ->
send(?UNSUBACK_PACKET(PacketId, ReasonCodes), PState);
deliver({unsuback, PacketId, ReasonCodes}, PState = #pstate{proto_ver = ProtoVer}) ->
send(?UNSUBACK_PACKET(PacketId, reason_codes_compat(unsuback, ReasonCodes, ProtoVer)), PState);
%% Deliver a disconnect for mqtt 5.0
deliver({disconnect, ReasonCode}, PState = #pstate{proto_ver = ?MQTT_PROTO_V5}) ->
@ -981,3 +972,11 @@ do_acl_deny_action(?SUBSCRIBE_PACKET(_PacketId, _Properties, _RawTopicFilters),
end;
do_acl_deny_action(_PubSupPacket, _ReasonCode, PState) ->
{ok, PState}.
%% Reason code compat
reason_codes_compat(_PktType, ReasonCodes, ?MQTT_PROTO_V5) ->
ReasonCodes;
reason_codes_compat(unsuback, _ReasonCodes, _ProtoVer) ->
undefined;
reason_codes_compat(PktType, ReasonCodes, _ProtoVer) ->
[emqx_reason_codes:compat(PktType, RC) || RC <- ReasonCodes].

View File

@ -140,4 +140,6 @@ compat(connack, 16#9D) -> ?CONNACK_SERVER;
compat(connack, 16#9F) -> ?CONNACK_SERVER;
compat(suback, Code) when Code =< ?QOS_2 -> Code;
compat(suback, Code) when Code >= 16#80 -> 16#80.
compat(suback, Code) when Code >= 16#80 -> 16#80;
compat(unsuback, _Code) -> undefined.

View File

@ -112,6 +112,10 @@ compat_test() ->
(((codes_test(suback))
([0,1,2, 16#80]))
([0,1,2, 16#80]))
(fun emqx_reason_codes:compat/2),
(((codes_test(unsuback))
([0, 1, 2]))
([undefined, undefined, undefined]))
(fun emqx_reason_codes:compat/2).
codes_test(AsistVar) ->