diff options
author | Holger Weiss <holger@zedat.fu-berlin.de> | 2014-05-05 00:02:55 +0200 |
---|---|---|
committer | Holger Weiss <holger@zedat.fu-berlin.de> | 2014-05-05 00:02:55 +0200 |
commit | 32abcbca6cd2462b6bcb6d056514fa24d2caed17 (patch) | |
tree | affae3f956e9b7c76d7a921cdbb3dd7214730d39 /src/ejabberd_c2s.erl | |
parent | XEP-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.erl | 14 |
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). |