Просмотр исходного кода

Remove the CONNACK's `Maximum-QoS` key if it equal to 2 (#3321)

JianBo He 6 лет назад
Родитель
Сommit
7e00b58db5
3 измененных файлов с 18 добавлено и 11 удалено
  1. 16 8
      src/emqx_channel.erl
  2. 1 2
      test/emqx_channel_SUITE.erl
  3. 1 1
      test/mqtt_protocol_v5_SUITE.erl

+ 16 - 8
src/emqx_channel.erl

@@ -1182,14 +1182,22 @@ enrich_connack_caps(AckProps, #channel{conninfo   = #{proto_ver := ?MQTT_PROTO_V
       shared_subscription   := Shared,
       wildcard_subscription := Wildcard
      } = emqx_mqtt_caps:get_caps(Zone),
-    AckProps#{'Maximum-QoS'         => MaxQoS,
-              'Retain-Available'    => flag(Retain),
-              'Maximum-Packet-Size' => MaxPktSize,
-              'Topic-Alias-Maximum' => MaxAlias,
-              'Wildcard-Subscription-Available'   => flag(Wildcard),
-              'Subscription-Identifier-Available' => 1,
-              'Shared-Subscription-Available'     => flag(Shared)
-             };
+    NAckProps = AckProps#{'Retain-Available'    => flag(Retain),
+                          'Maximum-Packet-Size' => MaxPktSize,
+                          'Topic-Alias-Maximum' => MaxAlias,
+                          'Wildcard-Subscription-Available'   => flag(Wildcard),
+                          'Subscription-Identifier-Available' => 1,
+                          'Shared-Subscription-Available'     => flag(Shared)
+                         },
+    %% MQTT 5.0 - 3.2.2.3.4:
+    %% It is a Protocol Error to include Maximum QoS more than once,
+    %% or to have a value other than 0 or 1. If the Maximum QoS is absent,
+    %% the Client uses a Maximum QoS of 2.
+    case MaxQoS =:= 2 of
+        true -> NAckProps;
+        _ -> NAckProps#{'Maximum-QoS' => MaxQoS}
+    end;
+
 enrich_connack_caps(AckProps, _Channel) -> AckProps.
 
 %%--------------------------------------------------------------------

+ 1 - 2
test/emqx_channel_SUITE.erl

@@ -522,8 +522,7 @@ t_enrich_connack_caps(_) ->
                    'Topic-Alias-Maximum' := 10,
                    'Wildcard-Subscription-Available' := 1,
                    'Subscription-Identifier-Available' := 1,
-                   'Shared-Subscription-Available' := 1,
-                   'Maximum-QoS' := ?QOS_2
+                   'Shared-Subscription-Available' := 1
                   }, AckProps),
     ok = meck:unload(emqx_mqtt_caps).
 

+ 1 - 1
test/mqtt_protocol_v5_SUITE.erl

@@ -475,7 +475,7 @@ t_connack_max_qos_allowed(_) ->
 
     {ok, Client5} = emqtt:start_link([{proto_ver, v5}]),
     {ok, Connack5} = emqtt:connect(Client5),
-    ?assertEqual(2, maps:get('Maximum-QoS', Connack5)),  %% [MQTT-3.2.2-9]
+    ?assertEqual(undefined, maps:get('Maximum-QoS', Connack5, undefined)),  %% [MQTT-3.2.2-9]
     ok = emqtt:disconnect(Client5),
     waiting_client_process_exit(Client5),