mirror of
https://github.com/processone/ejabberd.git
synced 2024-06-18 22:15:20 +02:00
Merge pull request #205 from weiss/xep-0198
XEP-0198: Improve handling of incorrect stanza counts reported by client
This commit is contained in:
commit
5d22159e9a
|
@ -2686,16 +2686,13 @@ handle_r(StateData) ->
|
||||||
send_element(StateData, Res),
|
send_element(StateData, Res),
|
||||||
StateData.
|
StateData.
|
||||||
|
|
||||||
handle_a(#state{jid = JID, mgmt_stanzas_out = NumStanzasOut} = StateData,
|
handle_a(StateData, Attrs) ->
|
||||||
Attrs) ->
|
|
||||||
case catch jlib:binary_to_integer(xml:get_attr_s(<<"h">>, Attrs)) of
|
case catch jlib:binary_to_integer(xml:get_attr_s(<<"h">>, Attrs)) of
|
||||||
H when is_integer(H), H >= 0 ->
|
H when is_integer(H), H >= 0 ->
|
||||||
?DEBUG("~s acknowledged ~B of ~B stanzas",
|
check_h_attribute(StateData, H);
|
||||||
[jlib:jid_to_string(JID), H, NumStanzasOut]),
|
|
||||||
mgmt_queue_drop(StateData, H);
|
|
||||||
_ ->
|
_ ->
|
||||||
?WARNING_MSG("Ignoring invalid ACK element from ~s",
|
?DEBUG("Ignoring invalid ACK element from ~s",
|
||||||
[jlib:jid_to_string(JID)]),
|
[jlib:jid_to_string(StateData#state.jid)]),
|
||||||
StateData
|
StateData
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -2707,7 +2704,7 @@ handle_resume(StateData, Attrs) ->
|
||||||
case {xml:get_attr(<<"previd">>, Attrs),
|
case {xml:get_attr(<<"previd">>, Attrs),
|
||||||
catch jlib:binary_to_integer(xml:get_attr_s(<<"h">>, Attrs))}
|
catch jlib:binary_to_integer(xml:get_attr_s(<<"h">>, Attrs))}
|
||||||
of
|
of
|
||||||
{{value, PrevID}, H} when is_integer(H) ->
|
{{value, PrevID}, H} when is_integer(H), H >= 0 ->
|
||||||
case inherit_session_state(StateData, PrevID) of
|
case inherit_session_state(StateData, PrevID) of
|
||||||
{ok, InheritedState} ->
|
{ok, InheritedState} ->
|
||||||
{ok, InheritedState, H};
|
{ok, InheritedState, H};
|
||||||
|
@ -2728,7 +2725,7 @@ handle_resume(StateData, Attrs) ->
|
||||||
end,
|
end,
|
||||||
case R of
|
case R of
|
||||||
{ok, ResumedState, NumHandled} ->
|
{ok, ResumedState, NumHandled} ->
|
||||||
NewState = mgmt_queue_drop(ResumedState, NumHandled),
|
NewState = check_h_attribute(ResumedState, NumHandled),
|
||||||
AttrXmlns = NewState#state.mgmt_xmlns,
|
AttrXmlns = NewState#state.mgmt_xmlns,
|
||||||
AttrId = make_resume_id(NewState),
|
AttrId = make_resume_id(NewState),
|
||||||
AttrH = jlib:integer_to_binary(NewState#state.mgmt_stanzas_in),
|
AttrH = jlib:integer_to_binary(NewState#state.mgmt_stanzas_in),
|
||||||
|
@ -2754,6 +2751,16 @@ handle_resume(StateData, Attrs) ->
|
||||||
error
|
error
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
check_h_attribute(#state{mgmt_stanzas_out = NumStanzasOut} = StateData, H)
|
||||||
|
when H > NumStanzasOut ->
|
||||||
|
?DEBUG("~s acknowledged ~B stanzas, but only ~B were sent",
|
||||||
|
[jlib:jid_to_string(StateData#state.jid), H, NumStanzasOut]),
|
||||||
|
mgmt_queue_drop(StateData#state{mgmt_stanzas_out = H}, NumStanzasOut);
|
||||||
|
check_h_attribute(#state{mgmt_stanzas_out = NumStanzasOut} = StateData, H) ->
|
||||||
|
?DEBUG("~s acknowledged ~B of ~B stanzas",
|
||||||
|
[jlib:jid_to_string(StateData#state.jid), H, NumStanzasOut]),
|
||||||
|
mgmt_queue_drop(StateData, H).
|
||||||
|
|
||||||
update_num_stanzas_in(#state{mgmt_state = active} = StateData, El) ->
|
update_num_stanzas_in(#state{mgmt_state = active} = StateData, El) ->
|
||||||
NewNum = case {is_stanza(El), StateData#state.mgmt_stanzas_in} of
|
NewNum = case {is_stanza(El), StateData#state.mgmt_stanzas_in} of
|
||||||
{true, 4294967295} ->
|
{true, 4294967295} ->
|
||||||
|
|
Loading…
Reference in New Issue
Block a user