Return 'closed' instead of 'einval' on closed sockets

This commit is contained in:
Evgeniy Khramtsov 2017-03-12 08:55:54 +03:00
parent 0822108fc8
commit 071c1dcb64
3 changed files with 9 additions and 3 deletions

View File

@ -211,14 +211,16 @@ send_trailer(SocketData) when ?is_http_socket(SocketData) ->
send_trailer(SocketData) -> send_trailer(SocketData) ->
send(SocketData, <<"</stream:stream>">>). send(SocketData, <<"</stream:stream>">>).
-spec send(socket_state(), iodata()) -> ok | {error, inet:posix()}. -spec send(socket_state(), iodata()) -> ok | {error, closed | inet:posix()}.
send(#socket_state{sockmod = SockMod, socket = Socket} = SocketData, Data) -> send(#socket_state{sockmod = SockMod, socket = Socket} = SocketData, Data) ->
?DEBUG("(~s) Send XML on stream = ~p", [pp(SocketData), Data]), ?DEBUG("(~s) Send XML on stream = ~p", [pp(SocketData), Data]),
try SockMod:send(Socket, Data) try SockMod:send(Socket, Data) of
{error, einval} -> {error, closed};
Result -> Result
catch _:badarg -> catch _:badarg ->
%% Some modules throw badarg exceptions on closed sockets %% Some modules throw badarg exceptions on closed sockets
%% TODO: their code should be improved %% TODO: their code should be improved
{error, einval} {error, closed}
end. end.
-spec send_xml(socket_state(), -spec send_xml(socket_state(),

View File

@ -1104,6 +1104,8 @@ set_lang(Pkt, _) ->
Pkt. Pkt.
-spec format_inet_error(atom()) -> string(). -spec format_inet_error(atom()) -> string().
format_inet_error(closed) ->
"connection closed";
format_inet_error(Reason) -> format_inet_error(Reason) ->
case inet:format_error(Reason) of case inet:format_error(Reason) of
"unknown POSIX error" -> atom_to_list(Reason); "unknown POSIX error" -> atom_to_list(Reason);

View File

@ -764,6 +764,8 @@ select_lang(Lang, <<"">>) -> Lang;
select_lang(_, Lang) -> Lang. select_lang(_, Lang) -> Lang.
-spec format_inet_error(atom()) -> string(). -spec format_inet_error(atom()) -> string().
format_inet_error(closed) ->
"connection closed";
format_inet_error(Reason) -> format_inet_error(Reason) ->
case inet:format_error(Reason) of case inet:format_error(Reason) of
"unknown POSIX error" -> atom_to_list(Reason); "unknown POSIX error" -> atom_to_list(Reason);