From 86af6b8f57d08a8b54737389e0a2db5b534d17b6 Mon Sep 17 00:00:00 2001 From: Maciej Szlosarczyk Date: Fri, 7 Jun 2019 15:06:53 +0300 Subject: [PATCH] Expect user to close connection abruptly When waiting for input from socket, expect not only a valid outcome, but also the client getting bored and closing the connection without any message being sent.Log an info message when that happens,but do not make it an error. Also, only use hyphens for headers sent to registry server. --- apps/epp_proxy/src/epp_tls_worker.erl | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/apps/epp_proxy/src/epp_tls_worker.erl b/apps/epp_proxy/src/epp_tls_worker.erl index 81e539a..49bb43b 100644 --- a/apps/epp_proxy/src/epp_tls_worker.erl +++ b/apps/epp_proxy/src/epp_tls_worker.erl @@ -124,7 +124,6 @@ read_length(Socket) -> LengthToReceive = epp_util:frame_length_to_receive(Length), {ok, LengthToReceive}; {error, Reason} -> - lager:error("Error: ~p~n", [Reason]), {error, Reason} end. @@ -133,7 +132,6 @@ read_frame(Socket, FrameLength) -> {ok, Data} -> {ok, Data}; {error, Reason} -> - lager:error("Error: ~p~n", [Reason]), {error, Reason} end. @@ -149,31 +147,34 @@ write_line(Socket, Line) -> %% First, listen for 4 bytes, then listen until the declared length. %% Return the frame binary at the very end. +%% If the client closes connection abruptly, then kill the process frame_from_socket(Socket, State) -> Length = case read_length(Socket) of {ok, Data} -> Data; - {error, _Details} -> - {stop, normal, State} + {error, closed} -> + log_and_exit(State) end, Frame = case read_frame(Socket, Length) of {ok, FrameData} -> FrameData; - {error, _FrameDetails} -> - {stop, normal, State} - end, + {error, closed} -> + log_and_exit(State) + end, Frame. +log_and_exit(State) -> + lager:info("Client closed connection: [~p]~n", [State]), + exit(normal). + %% Extract state info from socket. Fail if you must. state_from_socket(Socket, State) -> {ok, PeerCert} = ssl:peercert(Socket), {ok, {PeerIp, _PeerPort}} = ssl:peername(Socket), {SSL_CLIENT_S_DN_CN, SSL_CLIENT_CERT} = epp_certs:headers_from_cert(PeerCert), - Headers = [{"SSL_CLIENT_CERT", SSL_CLIENT_CERT}, - {"SSL_CLIENT_S_DN_CN", SSL_CLIENT_S_DN_CN}, - {"SSL-CLIENT-CERT", SSL_CLIENT_CERT}, + Headers = [{"SSL-CLIENT-CERT", SSL_CLIENT_CERT}, {"SSL-CLIENT-S-DN-CN", SSL_CLIENT_S_DN_CN}, {"User-Agent", <<"EPP proxy">>}, {"X-Forwarded-for", epp_util:readable_ip(PeerIp)}],