Gilbert пре 7 година
родитељ
комит
1797aadbe7
3 измењених фајлова са 22 додато и 17 уклоњено
  1. 15 16
      src/emqx_protocol.erl
  2. 3 1
      src/emqx_reason_codes.erl
  3. 4 0
      test/emqx_reason_codes_tests.erl

+ 15 - 16
src/emqx_protocol.erl

@@ -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].

+ 3 - 1
src/emqx_reason_codes.erl

@@ -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.

+ 4 - 0
test/emqx_reason_codes_tests.erl

@@ -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) ->