aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJan Uhlig <[email protected]>2024-11-21 10:43:22 +0100
committerLoïc Hoguin <[email protected]>2025-01-23 12:36:43 +0100
commit38100182914ca3ec84afbdf32ca84b8b78c40973 (patch)
tree424e2087b5df44f8080fdf1504eb00a4af51d354 /src
parent2a2ff882d128bc58ac99912f86ccf8e57d47ed1f (diff)
downloadranch-38100182914ca3ec84afbdf32ca84b8b78c40973.tar.gz
ranch-38100182914ca3ec84afbdf32ca84b8b78c40973.tar.bz2
ranch-38100182914ca3ec84afbdf32ca84b8b78c40973.zip
Add optional callback ranch_transport:format_error/1
Diffstat (limited to 'src')
-rw-r--r--src/ranch_acceptors_sup.erl20
-rw-r--r--src/ranch_ssl.erl7
-rw-r--r--src/ranch_tcp.erl5
-rw-r--r--src/ranch_transport.erl4
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