Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/processone/ejabberd.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2017-04-14 20:56:01 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2017-04-14 20:56:01 +0300
commit5c23187d2cb8a9ea18d258219891b5a5bbcc68c7 (patch)
treed3de998379a9f12e6ec39b3f348199d513c71700 /src
parent0a7eb337720d03d4e34b2d70cbed2c6837ef1382 (diff)
Make sure stream trailer is sent in the very end
Diffstat (limited to 'src')
-rw-r--r--src/xmpp_stream_in.erl13
-rw-r--r--src/xmpp_stream_out.erl13
2 files changed, 14 insertions, 12 deletions
diff --git a/src/xmpp_stream_in.erl b/src/xmpp_stream_in.erl
index 7d5a7e0b4..45e14224f 100644
--- a/src/xmpp_stream_in.erl
+++ b/src/xmpp_stream_in.erl
@@ -445,7 +445,8 @@ process_invalid_xml(#{lang := MyLang} = State, El, Reason) ->
process_stream_end(_, #{stream_state := disconnected} = State) ->
State;
process_stream_end(Reason, #{mod := Mod} = State) ->
- State1 = send_trailer(State),
+ State1 = State#{stream_timeout => infinity,
+ stream_state => disconnected},
try Mod:handle_stream_end(Reason, State1)
catch _:undef -> stop(State1)
end.
@@ -1081,21 +1082,21 @@ send_trailer(State) ->
socket_send(#{socket := Sock, sockmod := SockMod,
stream_state := StateName,
xmlns := NS,
- stream_header_sent := true}, Pkt) when StateName /= disconnected ->
+ stream_header_sent := true}, Pkt) ->
case Pkt of
trailer ->
SockMod:send_trailer(Sock);
- #stream_start{} ->
+ #stream_start{} when StateName /= disconnected ->
SockMod:send_header(Sock, xmpp:encode(Pkt));
+ _ when StateName /= disconnected ->
+ SockMod:send_element(Sock, xmpp:encode(Pkt, NS));
_ ->
- SockMod:send_element(Sock, xmpp:encode(Pkt, NS))
+ {error, closed}
end;
socket_send(_, _) ->
{error, closed}.
-spec close_socket(state()) -> state().
-close_socket(#{stream_state := disconnected} = State) ->
- State;
close_socket(#{sockmod := SockMod, socket := Socket} = State) ->
SockMod:close(Socket),
State#{stream_timeout => infinity,
diff --git a/src/xmpp_stream_out.erl b/src/xmpp_stream_out.erl
index 7f6291a57..fd86bd794 100644
--- a/src/xmpp_stream_out.erl
+++ b/src/xmpp_stream_out.erl
@@ -444,7 +444,8 @@ process_invalid_xml(#{lang := MyLang} = State, El, Reason) ->
process_stream_end(_, #{stream_state := disconnected} = State) ->
State;
process_stream_end(Reason, #{mod := Mod} = State) ->
- State1 = send_trailer(State),
+ State1 = State#{stream_timeout => infinity,
+ stream_state => disconnected},
try Mod:handle_stream_end(Reason, State1)
catch _:undef -> stop(State1)
end.
@@ -745,14 +746,16 @@ send_error(State, Pkt, Err) ->
-spec socket_send(state(), xmpp_element() | xmlel() | trailer) -> ok | {error, inet:posix()}.
socket_send(#{sockmod := SockMod, socket := Socket, xmlns := NS,
- stream_state := StateName}, Pkt) when StateName /= disconnected ->
+ stream_state := StateName}, Pkt) ->
case Pkt of
trailer ->
SockMod:send_trailer(Socket);
- #stream_start{} ->
+ #stream_start{} when StateName /= disconnected ->
SockMod:send_header(Socket, xmpp:encode(Pkt));
+ _ when StateName /= disconnected ->
+ SockMod:send_element(Socket, xmpp:encode(Pkt, NS));
_ ->
- SockMod:send_element(Socket, xmpp:encode(Pkt, NS))
+ {error, closed}
end;
socket_send(_, _) ->
{error, closed}.
@@ -763,8 +766,6 @@ send_trailer(State) ->
close_socket(State).
-spec close_socket(state()) -> state().
-close_socket(#{stream_state := disconnected} = State) ->
- State;
close_socket(State) ->
case State of
#{sockmod := SockMod, socket := Socket} ->