@@ -223,11 +223,11 @@ user_receive_packet(Acc, _Params, _Extra) ->
223
223
xmpp_presend_element (Acc , #{c2s_data := StateData , c2s_state := C2SState }, _Extra ) ->
224
224
case {get_mod_state (StateData ), mongoose_acc :stanza_type (Acc )} of
225
225
{{error , not_found }, _ } ->
226
- {ok , Acc };
226
+ {xmpp_presend_result ( C2SState ) , Acc };
227
227
{_ , <<" probe" >>} ->
228
- {ok , Acc };
228
+ {xmpp_presend_result ( C2SState ) , Acc };
229
229
{# sm_state {buffer_max = no_buffer } = SmState , _ } ->
230
- maybe_send_ack_request (Acc , SmState );
230
+ maybe_send_ack_request (Acc , C2SState , SmState );
231
231
{SmState , _ } ->
232
232
Jid = mongoose_c2s :get_jid (StateData ),
233
233
handle_buffer_and_ack (Acc , C2SState , Jid , SmState )
@@ -248,7 +248,7 @@ handle_buffer_and_ack(Acc, C2SState, Jid, #sm_state{buffer = Buffer, buffer_max
248
248
NewSmState = SmState # sm_state {buffer = [Acc1 | Buffer ], buffer_size = NewBufferSize },
249
249
ToAcc = [{actions , MaybeActions }, {state_mod , {? MODULE , NewSmState }}],
250
250
Acc2 = mongoose_c2s_acc :to_acc_many (Acc1 , ToAcc ),
251
- maybe_send_ack_request (Acc2 , NewSmState ).
251
+ maybe_send_ack_request (Acc2 , C2SState , NewSmState ).
252
252
253
253
notify_unacknowledged_msg_if_in_resume_state (Acc , Jid , ? EXT_C2S_STATE (resume_session )) ->
254
254
maybe_notify_unacknowledged_msg (Acc , Jid );
@@ -263,16 +263,22 @@ is_buffer_full(BufferSize, BufferMax) when BufferSize =< BufferMax ->
263
263
is_buffer_full (_ , _ ) ->
264
264
true .
265
265
266
- -spec maybe_send_ack_request (mongoose_acc :t (), sm_state ()) ->
266
+ -spec maybe_send_ack_request (mongoose_acc :t (), c2s_state (), sm_state ()) ->
267
267
mongoose_c2s_hooks :result ().
268
- maybe_send_ack_request (Acc , # sm_state {buffer_size = BufferSize ,
269
- counter_out = Out ,
270
- ack_freq = AckFreq })
271
- when 0 =:= (Out + BufferSize ) rem AckFreq ->
268
+ maybe_send_ack_request (Acc , C2SState , # sm_state {buffer_size = BufferSize ,
269
+ counter_out = Out ,
270
+ ack_freq = AckFreq })
271
+ when 0 =:= (Out + BufferSize ) rem AckFreq , C2SState =/= ? EXT_C2S_STATE ( resume_session ) ->
272
272
Stanza = mod_stream_management_stanzas :stream_mgmt_request (),
273
273
{ok , mongoose_c2s_acc :to_acc (Acc , socket_send , Stanza )};
274
- maybe_send_ack_request (Acc , _SmState ) ->
275
- {ok , Acc }.
274
+ maybe_send_ack_request (Acc , C2SState , _SmState ) ->
275
+ {xmpp_presend_result (C2SState ), Acc }.
276
+
277
+ -spec xmpp_presend_result (c2s_state ()) -> stop | ok .
278
+ xmpp_presend_result (? EXT_C2S_STATE (resume_session )) ->
279
+ stop ; % It makes no sense to route anything to a closed socket
280
+ xmpp_presend_result (_C2SState ) ->
281
+ ok .
276
282
277
283
-spec user_send_xmlel (Acc , Params , Extra ) -> Result when
278
284
Acc :: mongoose_acc :t (),
0 commit comments