|
|
@@ -287,14 +287,25 @@ parse_connect(FrameBin, StrictMode) ->
|
|
|
% Note: return malformed if reserved flag is not 0.
|
|
|
parse_connect2(
|
|
|
ProtoName,
|
|
|
- <<BridgeTag:4, ProtoVer:4, UsernameFlag:1, PasswordFlag:1, WillRetain:1, WillQoS:2, WillFlag:1,
|
|
|
- CleanStart:1, Reserved:1, KeepAlive:16/big, Rest2/binary>>,
|
|
|
+ <<BridgeTag:4, ProtoVer:4, UsernameFlag:1, PasswordFlag:1, WillRetainB:1, WillQoS:2,
|
|
|
+ WillFlagB:1, CleanStart:1, Reserved:1, KeepAlive:16/big, Rest2/binary>>,
|
|
|
StrictMode
|
|
|
) ->
|
|
|
case Reserved of
|
|
|
0 -> ok;
|
|
|
1 -> ?PARSE_ERR(reserved_connect_flag)
|
|
|
end,
|
|
|
+ WillFlag = bool(WillFlagB),
|
|
|
+ WillRetain = bool(WillRetainB),
|
|
|
+ case WillFlag of
|
|
|
+ %% MQTT-v3.1.1-[MQTT-3.1.2-13], MQTT-v5.0-[MQTT-3.1.2-11]
|
|
|
+ false when WillQoS > 0 -> ?PARSE_ERR(invalid_will_qos);
|
|
|
+ %% MQTT-v3.1.1-[MQTT-3.1.2-14], MQTT-v5.0-[MQTT-3.1.2-12]
|
|
|
+ true when WillQoS > 2 -> ?PARSE_ERR(invalid_will_qos);
|
|
|
+ %% MQTT-v3.1.1-[MQTT-3.1.2-15], MQTT-v5.0-[MQTT-3.1.2-13]
|
|
|
+ false when WillRetain -> ?PARSE_ERR(invalid_will_retain);
|
|
|
+ _ -> ok
|
|
|
+ end,
|
|
|
{Properties, Rest3} = parse_properties(Rest2, ProtoVer, StrictMode),
|
|
|
{ClientId, Rest4} = parse_utf8_string_with_cause(Rest3, StrictMode, invalid_clientid),
|
|
|
ConnPacket = #mqtt_packet_connect{
|
|
|
@@ -304,9 +315,9 @@ parse_connect2(
|
|
|
%% Invented by mosquitto, named 'try_private': https://mosquitto.org/man/mosquitto-conf-5.html
|
|
|
is_bridge = (BridgeTag =:= 8),
|
|
|
clean_start = bool(CleanStart),
|
|
|
- will_flag = bool(WillFlag),
|
|
|
+ will_flag = WillFlag,
|
|
|
will_qos = WillQoS,
|
|
|
- will_retain = bool(WillRetain),
|
|
|
+ will_retain = WillRetain,
|
|
|
keepalive = KeepAlive,
|
|
|
properties = Properties,
|
|
|
clientid = ClientId
|