aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJan Uhlig <[email protected]>2021-09-01 12:30:33 +0200
committerJan Uhlig <[email protected]>2021-09-01 12:30:33 +0200
commit4687f74954c1392da30c00f6031a2c99a2933834 (patch)
treeb870e202b480b5c8e6ca12f42bb7a1ea02d0a8d3 /src
parent18816dfb0c3e01467855c0061023548db1655453 (diff)
downloadranch-4687f74954c1392da30c00f6031a2c99a2933834.tar.gz
ranch-4687f74954c1392da30c00f6031a2c99a2933834.tar.bz2
ranch-4687f74954c1392da30c00f6031a2c99a2933834.zip
Add post-listen callback
Diffstat (limited to 'src')
-rw-r--r--src/ranch.erl5
-rw-r--r--src/ranch_acceptors_sup.erl8
2 files changed, 11 insertions, 2 deletions
diff --git a/src/ranch.erl b/src/ranch.erl
index a83402d..f36c145 100644
--- a/src/ranch.erl
+++ b/src/ranch.erl
@@ -58,11 +58,12 @@
-type transport_opts(SocketOpts) :: #{
connection_type => worker | supervisor,
handshake_timeout => timeout(),
- max_connections => max_conns(),
logger => module(),
+ max_connections => max_conns(),
num_acceptors => pos_integer(),
num_conns_sups => pos_integer(),
num_listen_sockets => pos_integer(),
+ post_listen_callback => fun((term()) -> ok | {error, term()}),
shutdown => timeout() | brutal_kill,
socket_opts => SocketOpts
}.
@@ -131,6 +132,8 @@ validate_transport_opt(num_conns_sups, Value, _) ->
validate_transport_opt(num_listen_sockets, Value, Opts) ->
is_integer(Value) andalso Value > 0
andalso Value =< maps:get(num_acceptors, Opts, 10);
+validate_transport_opt(post_listen_callback, Value, _) ->
+ is_function(Value, 1);
validate_transport_opt(shutdown, brutal_kill, _) ->
true;
validate_transport_opt(shutdown, infinity, _) ->
diff --git a/src/ranch_acceptors_sup.erl b/src/ranch_acceptors_sup.erl
index 801fec5..76155b8 100644
--- a/src/ranch_acceptors_sup.erl
+++ b/src/ranch_acceptors_sup.erl
@@ -77,7 +77,13 @@ start_listen_sockets(Ref, NumListenSockets, Transport, TransOpts0, Logger) when
start_listen_socket(Ref, Transport, TransOpts, Logger) ->
case Transport:listen(TransOpts) of
{ok, Socket} ->
- Socket;
+ PostListenCb = maps:get(post_listen_callback, TransOpts, fun (_) -> ok end),
+ case PostListenCb(Socket) of
+ ok ->
+ Socket;
+ {error, Reason} ->
+ listen_error(Ref, Transport, TransOpts, Reason, Logger)
+ end;
{error, Reason} ->
listen_error(Ref, Transport, TransOpts, Reason, Logger)
end.