diff options
author | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2017-04-14 20:56:01 +0300 |
---|---|---|
committer | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2017-04-14 20:56:01 +0300 |
commit | 5c23187d2cb8a9ea18d258219891b5a5bbcc68c7 (patch) | |
tree | d3de998379a9f12e6ec39b3f348199d513c71700 /src | |
parent | 0a7eb337720d03d4e34b2d70cbed2c6837ef1382 (diff) |
Make sure stream trailer is sent in the very end
Diffstat (limited to 'src')
-rw-r--r-- | src/xmpp_stream_in.erl | 13 | ||||
-rw-r--r-- | src/xmpp_stream_out.erl | 13 |
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} -> |