diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ranch_acceptors_sup.erl | 20 | ||||
-rw-r--r-- | src/ranch_ssl.erl | 7 | ||||
-rw-r--r-- | src/ranch_tcp.erl | 5 | ||||
-rw-r--r-- | src/ranch_transport.erl | 4 |
4 files changed, 31 insertions, 5 deletions
diff --git a/src/ranch_acceptors_sup.erl b/src/ranch_acceptors_sup.erl index f0cff68..a4afc18 100644 --- a/src/ranch_acceptors_sup.erl +++ b/src/ranch_acceptors_sup.erl @@ -90,7 +90,7 @@ listen_error(Ref, Transport, TransOpts0, Reason, Logger) -> TransOpts = TransOpts0#{socket_opts => SocketOpts}, ranch:log(error, "Failed to start Ranch listener ~p in ~p:listen(~999999p) for reason ~p (~s)~n", - [Ref, Transport, TransOpts, Reason, format_error(Reason)], Logger), + [Ref, Transport, TransOpts, Reason, format_error(Transport, Reason)], Logger), exit({listen_error, Ref, Reason}). hide_socket_opts([]) -> @@ -106,9 +106,19 @@ hide_socket_opts([{password, _}|SocketOpts]) -> hide_socket_opts([SocketOpt|SocketOpts]) -> [SocketOpt|hide_socket_opts(SocketOpts)]. -format_error(no_cert) -> +%% Handling of no_cert really should be done in ranch_ssl. We leave it here for +%% backwards compatibility with possibly existing custom transports without a +%% format_error/1 implementation that may rely on this module handling it. +%% TODO: Remove in Ranch 3.0 +format_error(_, no_cert) -> "no certificate provided; see cert, certfile, sni_fun or sni_hosts options"; -format_error(reuseport_local) -> +format_error(_, reuseport_local) -> "num_listen_sockets must be set to 1 for local sockets"; -format_error(Reason) -> - inet:format_error(Reason). +format_error(Transport, Reason) -> + %% TODO: Required callback in Ranch 3.0 + case erlang:function_exported(Transport, format_error, 1) of + true -> + Transport:format_error(Reason); + false -> + lists:flatten(io_lib:format("~999999p", [Reason])) + end. diff --git a/src/ranch_ssl.erl b/src/ranch_ssl.erl index 7e6b9d8..c99335f 100644 --- a/src/ranch_ssl.erl +++ b/src/ranch_ssl.erl @@ -46,6 +46,7 @@ -export([shutdown/2]). -export([close/1]). -export([cleanup/1]). +-export([format_error/1]). -type ssl_opt() :: {alpn_preferred_protocols, [binary()]} | {anti_replay, '10k' | '100k' | {integer(), integer(), integer()}} @@ -328,6 +329,12 @@ cleanup(#{socket_opts:=SocketOpts}) -> cleanup(_) -> ok. +-spec format_error({error, ssl:reason()} | ssl:reason()) -> string(). +format_error(no_cert) -> + "no certificate provided; see cert, certfile, sni_fun or sni_hosts options"; +format_error(Reason) -> + ssl:format_error(Reason). + get_tls_versions(SocketOpts) -> %% Socket options need to be reversed for keyfind because later options %% take precedence when contained multiple times, but keyfind will return diff --git a/src/ranch_tcp.erl b/src/ranch_tcp.erl index 3541289..70e9f46 100644 --- a/src/ranch_tcp.erl +++ b/src/ranch_tcp.erl @@ -45,6 +45,7 @@ -export([shutdown/2]). -export([close/1]). -export([cleanup/1]). +-export([format_error/1]). -type opt() :: {backlog, non_neg_integer()} | {buffer, non_neg_integer()} @@ -285,3 +286,7 @@ cleanup(#{socket_opts:=SocketOpts}) -> end; cleanup(_) -> ok. + +-spec format_error(inet:posix() | system_limit) -> string(). +format_error(Reason) -> + inet:format_error(Reason). diff --git a/src/ranch_transport.erl b/src/ranch_transport.erl index 52eeba3..2fbcc1a 100644 --- a/src/ranch_transport.erl +++ b/src/ranch_transport.erl @@ -68,6 +68,10 @@ -> ok | {error, atom()}. -callback close(socket()) -> ok. -callback cleanup(ranch:transport_opts(any())) -> ok. +-callback format_error(term()) -> string(). + +%% TODO: Required callback in Ranch 3.0 +-optional_callbacks([format_error/1]). %% A fallback for transports that don't have a native sendfile implementation. %% Note that the ordering of arguments is different from file:sendfile/5 and |