|
|
@@ -1141,9 +1141,31 @@ return_sub_unsub_ack(Packet, Channel) ->
|
|
|
{reply, Reply :: term(), channel()}
|
|
|
| {shutdown, Reason :: term(), Reply :: term(), channel()}
|
|
|
| {shutdown, Reason :: term(), Reply :: term(), emqx_types:packet(), channel()}.
|
|
|
-handle_call(kick, Channel) ->
|
|
|
- Channel1 = ensure_disconnected(kicked, Channel),
|
|
|
- disconnect_and_shutdown(kicked, ok, Channel1);
|
|
|
+handle_call(
|
|
|
+ kick,
|
|
|
+ Channel = #channel{
|
|
|
+ conn_state = ConnState,
|
|
|
+ will_msg = WillMsg,
|
|
|
+ conninfo = #{proto_ver := ProtoVer}
|
|
|
+ }
|
|
|
+) ->
|
|
|
+ (WillMsg =/= undefined) andalso publish_will_msg(WillMsg),
|
|
|
+ Channel1 =
|
|
|
+ case ConnState of
|
|
|
+ connected -> ensure_disconnected(kicked, Channel);
|
|
|
+ _ -> Channel
|
|
|
+ end,
|
|
|
+ case ProtoVer == ?MQTT_PROTO_V5 andalso ConnState == connected of
|
|
|
+ true ->
|
|
|
+ shutdown(
|
|
|
+ kicked,
|
|
|
+ ok,
|
|
|
+ ?DISCONNECT_PACKET(?RC_ADMINISTRATIVE_ACTION),
|
|
|
+ Channel1
|
|
|
+ );
|
|
|
+ _ ->
|
|
|
+ shutdown(kicked, ok, Channel1)
|
|
|
+ end;
|
|
|
handle_call(discard, Channel) ->
|
|
|
disconnect_and_shutdown(discarded, ok, Channel);
|
|
|
%% Session Takeover
|
|
|
@@ -1220,7 +1242,7 @@ handle_info(
|
|
|
->
|
|
|
emqx_config:get_zone_conf(Zone, [flapping_detect, enable]) andalso
|
|
|
emqx_flapping:detect(ClientInfo),
|
|
|
- Channel1 = ensure_disconnected(Reason, mabye_publish_will_msg(Channel)),
|
|
|
+ Channel1 = ensure_disconnected(Reason, maybe_publish_will_msg(Channel)),
|
|
|
case maybe_shutdown(Reason, Channel1) of
|
|
|
{ok, Channel2} -> {ok, {event, disconnected}, Channel2};
|
|
|
Shutdown -> Shutdown
|
|
|
@@ -2044,9 +2066,9 @@ ensure_disconnected(
|
|
|
%%--------------------------------------------------------------------
|
|
|
%% Maybe Publish will msg
|
|
|
|
|
|
-mabye_publish_will_msg(Channel = #channel{will_msg = undefined}) ->
|
|
|
+maybe_publish_will_msg(Channel = #channel{will_msg = undefined}) ->
|
|
|
Channel;
|
|
|
-mabye_publish_will_msg(Channel = #channel{will_msg = WillMsg}) ->
|
|
|
+maybe_publish_will_msg(Channel = #channel{will_msg = WillMsg}) ->
|
|
|
case will_delay_interval(WillMsg) of
|
|
|
0 ->
|
|
|
ok = publish_will_msg(WillMsg),
|
|
|
@@ -2056,10 +2078,13 @@ mabye_publish_will_msg(Channel = #channel{will_msg = WillMsg}) ->
|
|
|
end.
|
|
|
|
|
|
will_delay_interval(WillMsg) ->
|
|
|
- maps:get('Will-Delay-Interval', emqx_message:get_header(properties, WillMsg), 0).
|
|
|
+ maps:get(
|
|
|
+ 'Will-Delay-Interval',
|
|
|
+ emqx_message:get_header(properties, WillMsg, #{}),
|
|
|
+ 0
|
|
|
+ ).
|
|
|
|
|
|
publish_will_msg(Msg) ->
|
|
|
- %% TODO check if we should discard result here
|
|
|
_ = emqx_broker:publish(Msg),
|
|
|
ok.
|
|
|
|
|
|
@@ -2070,8 +2095,7 @@ disconnect_reason(?RC_SUCCESS) -> normal;
|
|
|
disconnect_reason(ReasonCode) -> emqx_reason_codes:name(ReasonCode).
|
|
|
|
|
|
reason_code(takenover) -> ?RC_SESSION_TAKEN_OVER;
|
|
|
-reason_code(discarded) -> ?RC_SESSION_TAKEN_OVER;
|
|
|
-reason_code(_) -> ?RC_NORMAL_DISCONNECTION.
|
|
|
+reason_code(discarded) -> ?RC_SESSION_TAKEN_OVER.
|
|
|
|
|
|
%%--------------------------------------------------------------------
|
|
|
%% Helper functions
|