aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_c2s.erl
diff options
context:
space:
mode:
authorHolger Weiss <holger@zedat.fu-berlin.de>2014-05-05 00:02:55 +0200
committerHolger Weiss <holger@zedat.fu-berlin.de>2014-05-05 00:02:55 +0200
commit32abcbca6cd2462b6bcb6d056514fa24d2caed17 (patch)
treeaffae3f956e9b7c76d7a921cdbb3dd7214730d39 /src/ejabberd_c2s.erl
parentXEP-0198: Log message when waiting for resumption (diff)
XEP-0198: Accept stream elements in pending state
Due to timing issues, ejabberd_c2s might receive stream elements from the client while the session is waiting for stream resumption. Those elements are now accepted.
Diffstat (limited to 'src/ejabberd_c2s.erl')
-rw-r--r--src/ejabberd_c2s.erl14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index 9f7ab4b89..314f07f8c 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -1270,15 +1270,15 @@ session_established2(El, StateData) ->
[{xmlstreamelement, El}]),
fsm_next_state(session_established, NewState).
+wait_for_resume({xmlstreamelement, _El} = Event, StateData) ->
+ session_established(Event, StateData),
+ fsm_next_state(wait_for_resume, StateData);
wait_for_resume(timeout, StateData) ->
?DEBUG("Timed out waiting for resumption of stream for ~s",
[jlib:jid_to_string(StateData#state.jid)]),
{stop, normal, StateData};
-wait_for_resume(closed, StateData) ->
- ?DEBUG("Ignoring 'closed' event while waiting for resumption", []),
- fsm_next_state(wait_for_resume, StateData);
wait_for_resume(Event, StateData) ->
- ?INFO_MSG("Ignoring event while waiting for resumption: ~p", [Event]),
+ ?DEBUG("Ignoring event while waiting for resumption: ~p", [Event]),
fsm_next_state(wait_for_resume, StateData).
%%----------------------------------------------------------------------
@@ -1874,6 +1874,9 @@ send_header(StateData, Server, Version, Lang) ->
send_text(StateData, iolist_to_binary(Header)).
send_trailer(StateData)
+ when StateData#state.sm_state == pending ->
+ ?DEBUG("Cannot send stream trailer while waiting for resumption", []);
+send_trailer(StateData)
when StateData#state.xml_socket ->
(StateData#state.sockmod):send_xml(StateData#state.socket,
{xmlstreamend, <<"stream:stream">>});
@@ -2558,7 +2561,8 @@ stream_mgmt_enabled(#state{sm_state = disabled}) ->
stream_mgmt_enabled(_StateData) ->
true.
-dispatch_stream_mgmt(El, #state{sm_state = active} = StateData) ->
+dispatch_stream_mgmt(El, StateData) when StateData#state.sm_state == active;
+ StateData#state.sm_state == pending ->
perform_stream_mgmt(El, StateData);
dispatch_stream_mgmt(El, StateData) ->
negotiate_stream_mgmt(El, StateData).