diff options
author | Siri Hansen <[email protected]> | 2016-06-05 13:30:55 +0200 |
---|---|---|
committer | Siri Hansen <[email protected]> | 2016-06-09 14:28:15 +0200 |
commit | 12573be47139eb40ec17b137808dcde929a00345 (patch) | |
tree | 4c987e54611d5147e38a4fa2e8cdb635c4814f81 | |
parent | 15ce292889054bc7514e7d1d1cb7c68c349d65bb (diff) | |
download | otp-12573be47139eb40ec17b137808dcde929a00345.tar.gz otp-12573be47139eb40ec17b137808dcde929a00345.tar.bz2 otp-12573be47139eb40ec17b137808dcde929a00345.zip |
[ct test] Flush messages from old client after close in telnet server
Since the same erlang process is used for subsequent telnet
connections, messages from old clients must be flushed after close.
-rw-r--r-- | lib/common_test/test/telnet_server.erl | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/lib/common_test/test/telnet_server.erl b/lib/common_test/test/telnet_server.erl index 2c33cb268a..65300b0bdf 100644 --- a/lib/common_test/test/telnet_server.erl +++ b/lib/common_test/test/telnet_server.erl @@ -117,38 +117,64 @@ init_client(#state{client=Sock}=State) -> dbg("Server sending: ~p~n",["login: "]), R = case gen_tcp:send(Sock,"login: ") of ok -> - loop(State, 1); + loop(State); Error -> Error end, _ = gen_tcp:close(Sock), R. -loop(State, N) -> +loop(State=#state{client=Sock}) -> receive - {tcp,_,Data} -> + {tcp,Sock,Data} -> try handle_data(Data,State) of {ok,State1} -> - loop(State1, N); + loop(State1); closed -> + _ = flush(State), closed catch throw:Error -> + _ = flush(State), Error end; - {tcp_closed, _} -> + {tcp_closed,Sock} -> closed; - {tcp_error,_,Error} -> + {tcp_error,Sock,Error} -> {error,tcp,Error}; disconnect -> - Sock = State#state.client, dbg("Server closing connection on socket ~p~n", [Sock]), + timer:sleep(1000), ok = gen_tcp:close(Sock), - closed; + _ = flush(State); stop -> + _ = flush(State), stopped end. +flush(State=#state{client=Sock}) -> + receive + {tcp,Sock,Data} = M-> + dbg("Message flushed after close or error: ~p~n", [M]), + try handle_data(Data,State) of + {ok,State1} -> + flush(State1); + closed -> + flush(State) + catch + throw:Error -> + Error + end; + {tcp_closed,Sock} = M -> + dbg("Message flushed after close or error: ~p~n", [M]), + ok; + {tcp_error,Sock,Error} = M -> + dbg("Message flushed after close or error: ~p~n", [M]), + {error,tcp,Error} + after 100 -> + ok + end. + handle_data(Cmd,#state{break=true}=State) -> dbg("Server got data when in break mode: ~p~n",[Cmd]), handle_break_cmd(Cmd,State); |