aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorjuhlig <[email protected]>2019-05-27 15:20:37 +0200
committerLoïc Hoguin <[email protected]>2019-05-27 16:03:29 +0200
commit30604262b5934b38e9f55f0d3ef44f8aed5310de (patch)
tree5a88a20152197921b266769684c17651afc44882 /src
parentad82f58139ca88b7e82dcb6bd50063c899b685e9 (diff)
downloadranch-30604262b5934b38e9f55f0d3ef44f8aed5310de.tar.gz
ranch-30604262b5934b38e9f55f0d3ef44f8aed5310de.tar.bz2
ranch-30604262b5934b38e9f55f0d3ef44f8aed5310de.zip
Use transport options in ranch_transport:listen/1 callbacks
The callback `ranch_transport:listen/1` has changed to accept a map of transport options instead of socket options.
Diffstat (limited to 'src')
-rw-r--r--src/ranch.erl57
-rw-r--r--src/ranch_acceptors_sup.erl37
-rw-r--r--src/ranch_ssl.erl30
-rw-r--r--src/ranch_tcp.erl18
-rw-r--r--src/ranch_transport.erl2
5 files changed, 74 insertions, 70 deletions
diff --git a/src/ranch.erl b/src/ranch.erl
index 86a1c30..0580d5b 100644
--- a/src/ranch.erl
+++ b/src/ranch.erl
@@ -38,7 +38,7 @@
-export([procs/2]).
-export([wait_for_connections/3]).
-export([wait_for_connections/4]).
--export([filter_options/3]).
+-export([filter_options/4]).
-export([set_option_default/3]).
-export([require/1]).
-export([log/4]).
@@ -46,7 +46,10 @@
-type max_conns() :: non_neg_integer() | infinity.
-export_type([max_conns/0]).
--type opts() :: any() | #{
+-type opts() :: any() | transport_opts(any()).
+-export_type([opts/0]).
+
+-type transport_opts(SocketOpts) :: #{
connection_type => worker | supervisor,
handshake_timeout => timeout(),
max_connections => max_conns(),
@@ -55,9 +58,9 @@
num_conns_sups => pos_integer(),
num_listen_sockets => pos_integer(),
shutdown => timeout() | brutal_kill,
- socket_opts => any()
+ socket_opts => SocketOpts
}.
--export_type([opts/0]).
+-export_type([transport_opts/1]).
-type ref() :: any().
-export_type([ref/0]).
@@ -76,7 +79,7 @@ start_listener(Ref, Transport, TransOpts0, Protocol, ProtoOpts)
Transport, TransOpts, Protocol, ProtoOpts)))
end.
--spec normalize_opts(opts()) -> opts().
+-spec normalize_opts(opts()) -> transport_opts(any()).
normalize_opts(Map) when is_map(Map) ->
Map;
normalize_opts(Any) ->
@@ -233,7 +236,7 @@ get_max_connections(Ref) ->
set_max_connections(Ref, MaxConnections) ->
ranch_server:set_max_connections(Ref, MaxConnections).
--spec get_transport_options(ref()) -> any().
+-spec get_transport_options(ref()) -> transport_opts(any()).
get_transport_options(Ref) ->
ranch_server:get_transport_options(Ref).
@@ -247,7 +250,7 @@ set_transport_options(Ref, TransOpts0) ->
{error, running}
end.
--spec get_protocol_options(ref()) -> opts().
+-spec get_protocol_options(ref()) -> any().
get_protocol_options(Ref) ->
ranch_server:get_protocol_options(Ref).
@@ -360,38 +363,34 @@ wait_for_connections_loop(Ref, Op, NumConns, Interval) ->
end.
-spec filter_options([inet | inet6 | {atom(), any()} | {raw, any(), any(), any()}],
- [atom()], Acc) -> Acc when Acc :: [any()].
-filter_options(UserOptions, DisallowedKeys, DefaultOptions) ->
- AllowedOptions = filter_user_options(UserOptions, DisallowedKeys),
+ [atom()], Acc, module()) -> Acc when Acc :: [any()].
+filter_options(UserOptions, DisallowedKeys, DefaultOptions, Logger) ->
+ AllowedOptions = filter_user_options(UserOptions, DisallowedKeys, Logger),
lists:foldl(fun merge_options/2, DefaultOptions, AllowedOptions).
%% 2-tuple options.
-filter_user_options([Opt = {Key, _}|Tail], DisallowedKeys) ->
+filter_user_options([Opt = {Key, _}|Tail], DisallowedKeys, Logger) ->
case lists:member(Key, DisallowedKeys) of
false ->
- [Opt|filter_user_options(Tail, DisallowedKeys)];
+ [Opt|filter_user_options(Tail, DisallowedKeys, Logger)];
true ->
- filter_options_warning(Opt),
- filter_user_options(Tail, DisallowedKeys)
+ filter_options_warning(Opt, Logger),
+ filter_user_options(Tail, DisallowedKeys, Logger)
end;
%% Special option forms.
-filter_user_options([inet|Tail], DisallowedKeys) ->
- [inet|filter_user_options(Tail, DisallowedKeys)];
-filter_user_options([inet6|Tail], DisallowedKeys) ->
- [inet6|filter_user_options(Tail, DisallowedKeys)];
-filter_user_options([Opt = {raw, _, _, _}|Tail], DisallowedKeys) ->
- [Opt|filter_user_options(Tail, DisallowedKeys)];
-filter_user_options([Opt|Tail], DisallowedKeys) ->
- filter_options_warning(Opt),
- filter_user_options(Tail, DisallowedKeys);
-filter_user_options([], _) ->
+filter_user_options([inet|Tail], DisallowedKeys, Logger) ->
+ [inet|filter_user_options(Tail, DisallowedKeys, Logger)];
+filter_user_options([inet6|Tail], DisallowedKeys, Logger) ->
+ [inet6|filter_user_options(Tail, DisallowedKeys, Logger)];
+filter_user_options([Opt = {raw, _, _, _}|Tail], DisallowedKeys, Logger) ->
+ [Opt|filter_user_options(Tail, DisallowedKeys, Logger)];
+filter_user_options([Opt|Tail], DisallowedKeys, Logger) ->
+ filter_options_warning(Opt, Logger),
+ filter_user_options(Tail, DisallowedKeys, Logger);
+filter_user_options([], _, _) ->
[].
-filter_options_warning(Opt) ->
- Logger = case get(logger) of
- undefined -> logger;
- Logger0 -> Logger0
- end,
+filter_options_warning(Opt, Logger) ->
log(warning,
"Transport option ~p unknown or invalid.~n",
[Opt], Logger).
diff --git a/src/ranch_acceptors_sup.erl b/src/ranch_acceptors_sup.erl
index c062645..a1bb8c2 100644
--- a/src/ranch_acceptors_sup.erl
+++ b/src/ranch_acceptors_sup.erl
@@ -27,14 +27,11 @@ init([Ref, NumAcceptors, Transport]) ->
TransOpts = ranch_server:get_transport_options(Ref),
Logger = maps:get(logger, TransOpts, logger),
NumListenSockets = maps:get(num_listen_sockets, TransOpts, 1),
- SocketOpts = maps:get(socket_opts, TransOpts, []),
%% We temporarily put the logger in the process dictionary
%% so that it can be used from ranch:filter_options. The
%% interface as it currently is does not allow passing it
%% down otherwise.
- put(logger, Logger),
- LSockets = start_listen_sockets(Ref, NumListenSockets, Transport, SocketOpts, Logger),
- erase(logger),
+ LSockets = start_listen_sockets(Ref, NumListenSockets, Transport, TransOpts, Logger),
Procs = [begin
LSocketId = (AcceptorId rem NumListenSockets) + 1,
{_, LSocket} = lists:keyfind(LSocketId, 1, LSockets),
@@ -46,46 +43,50 @@ init([Ref, NumAcceptors, Transport]) ->
end || AcceptorId <- lists:seq(1, NumAcceptors)],
{ok, {#{}, Procs}}.
--spec start_listen_sockets(any(), pos_integer(), module(), list(), module())
+-spec start_listen_sockets(any(), pos_integer(), module(), map(), module())
-> [{pos_integer(), inet:socket()}].
-start_listen_sockets(Ref, NumListenSockets, Transport, SocketOpts0, Logger) when NumListenSockets > 0 ->
- BaseSocket = start_listen_socket(Ref, Transport, SocketOpts0, Logger),
+start_listen_sockets(Ref, NumListenSockets, Transport, TransOpts0, Logger) when NumListenSockets > 0 ->
+ BaseSocket = start_listen_socket(Ref, Transport, TransOpts0, Logger),
{ok, Addr} = Transport:sockname(BaseSocket),
ExtraSockets = case Addr of
{local, _} when NumListenSockets > 1 ->
- listen_error(Ref, Transport, SocketOpts0, reuseport_local, Logger);
+ listen_error(Ref, Transport, TransOpts0, reuseport_local, Logger);
{local, _} ->
[];
{_, Port} ->
- SocketOpts = case lists:keyfind(port, 1, SocketOpts0) of
+ SocketOpts = maps:get(socket_opts, TransOpts0, []),
+ SocketOpts1 = case lists:keyfind(port, 1, SocketOpts) of
{port, Port} ->
- SocketOpts0;
+ SocketOpts;
_ ->
- [{port, Port}|lists:keydelete(port, 1, SocketOpts0)]
+ [{port, Port}|lists:keydelete(port, 1, SocketOpts)]
end,
- [{N, start_listen_socket(Ref, Transport, SocketOpts, Logger)}
+ TransOpts1 = TransOpts0#{socket_opts => SocketOpts1},
+ [{N, start_listen_socket(Ref, Transport, TransOpts1, Logger)}
|| N <- lists:seq(2, NumListenSockets)]
end,
ranch_server:set_addr(Ref, Addr),
[{1, BaseSocket}|ExtraSockets].
--spec start_listen_socket(any(), module(), list(), module()) -> inet:socket().
-start_listen_socket(Ref, Transport, SocketOpts, Logger) ->
- case Transport:listen(SocketOpts) of
+-spec start_listen_socket(any(), module(), map(), module()) -> inet:socket().
+start_listen_socket(Ref, Transport, TransOpts, Logger) ->
+ case Transport:listen(TransOpts) of
{ok, Socket} ->
Socket;
{error, Reason} ->
- listen_error(Ref, Transport, SocketOpts, Reason, Logger)
+ listen_error(Ref, Transport, TransOpts, Reason, Logger)
end.
-spec listen_error(any(), module(), any(), atom(), module()) -> no_return().
-listen_error(Ref, Transport, SocketOpts0, Reason, Logger) ->
+listen_error(Ref, Transport, TransOpts0, Reason, Logger) ->
+ SocketOpts0 = maps:get(socket_opts, TransOpts0, []),
SocketOpts1 = [{cert, '...'}|proplists:delete(cert, SocketOpts0)],
SocketOpts2 = [{key, '...'}|proplists:delete(key, SocketOpts1)],
SocketOpts = [{cacerts, '...'}|proplists:delete(cacerts, SocketOpts2)],
+ 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, SocketOpts, Reason, format_error(Reason)], Logger),
+ [Ref, Transport, TransOpts, Reason, format_error(Reason)], Logger),
exit({listen_error, Ref, Reason}).
format_error(no_cert) ->
diff --git a/src/ranch_ssl.erl b/src/ranch_ssl.erl
index bcbe909..cf876fe 100644
--- a/src/ranch_ssl.erl
+++ b/src/ranch_ssl.erl
@@ -98,28 +98,30 @@ secure() ->
messages() -> {ssl, ssl_closed, ssl_error, ssl_passive}.
--spec listen(opts()) -> {ok, ssl:sslsocket()} | {error, atom()}.
-listen(Opts) ->
- case lists:keymember(cert, 1, Opts)
- orelse lists:keymember(certfile, 1, Opts)
- orelse lists:keymember(sni_fun, 1, Opts)
- orelse lists:keymember(sni_hosts, 1, Opts) of
+-spec listen(ranch:transport_opts(opts())) -> {ok, ssl:sslsocket()} | {error, atom()}.
+listen(TransOpts) ->
+ SocketOpts = maps:get(socket_opts, TransOpts, []),
+ case lists:keymember(cert, 1, SocketOpts)
+ orelse lists:keymember(certfile, 1, SocketOpts)
+ orelse lists:keymember(sni_fun, 1, SocketOpts)
+ orelse lists:keymember(sni_hosts, 1, SocketOpts) of
true ->
- do_listen(Opts);
+ Logger = maps:get(logger, TransOpts, logger),
+ do_listen(SocketOpts, Logger);
false ->
{error, no_cert}
end.
-do_listen(Opts0) ->
- Opts1 = ranch:set_option_default(Opts0, backlog, 1024),
- Opts2 = ranch:set_option_default(Opts1, nodelay, true),
- Opts3 = ranch:set_option_default(Opts2, send_timeout, 30000),
- Opts = ranch:set_option_default(Opts3, send_timeout_close, true),
+do_listen(SocketOpts0, Logger) ->
+ SocketOpts1 = ranch:set_option_default(SocketOpts0, backlog, 1024),
+ SocketOpts2 = ranch:set_option_default(SocketOpts1, nodelay, true),
+ SocketOpts3 = ranch:set_option_default(SocketOpts2, send_timeout, 30000),
+ SocketOpts = ranch:set_option_default(SocketOpts3, send_timeout_close, true),
%% We set the port to 0 because it is given in the Opts directly.
%% The port in the options takes precedence over the one in the
%% first argument.
- ssl:listen(0, ranch:filter_options(Opts, disallowed_listen_options(),
- [binary, {active, false}, {packet, raw}, {reuseaddr, true}])).
+ ssl:listen(0, ranch:filter_options(SocketOpts, disallowed_listen_options(),
+ [binary, {active, false}, {packet, raw}, {reuseaddr, true}], Logger)).
%% 'binary' and 'list' are disallowed but they are handled
%% specifically as they do not have 2-tuple equivalents.
diff --git a/src/ranch_tcp.erl b/src/ranch_tcp.erl
index 764c4b8..3a6e4d9 100644
--- a/src/ranch_tcp.erl
+++ b/src/ranch_tcp.erl
@@ -78,17 +78,19 @@ secure() ->
messages() -> {tcp, tcp_closed, tcp_error, tcp_passive}.
--spec listen(opts()) -> {ok, inet:socket()} | {error, atom()}.
-listen(Opts) ->
- Opts2 = ranch:set_option_default(Opts, backlog, 1024),
- Opts3 = ranch:set_option_default(Opts2, nodelay, true),
- Opts4 = ranch:set_option_default(Opts3, send_timeout, 30000),
- Opts5 = ranch:set_option_default(Opts4, send_timeout_close, true),
+-spec listen(ranch:transport_opts(opts())) -> {ok, inet:socket()} | {error, atom()}.
+listen(TransOpts) ->
+ Logger = maps:get(logger, TransOpts, logger),
+ SocketOpts0 = maps:get(socket_opts, TransOpts, []),
+ SocketOpts1 = ranch:set_option_default(SocketOpts0, backlog, 1024),
+ SocketOpts2 = ranch:set_option_default(SocketOpts1, nodelay, true),
+ SocketOpts3 = ranch:set_option_default(SocketOpts2, send_timeout, 30000),
+ SocketOpts4 = ranch:set_option_default(SocketOpts3, send_timeout_close, true),
%% We set the port to 0 because it is given in the Opts directly.
%% The port in the options takes precedence over the one in the
%% first argument.
- gen_tcp:listen(0, ranch:filter_options(Opts5, disallowed_listen_options(),
- [binary, {active, false}, {packet, raw}, {reuseaddr, true}])).
+ gen_tcp:listen(0, ranch:filter_options(SocketOpts4, disallowed_listen_options(),
+ [binary, {active, false}, {packet, raw}, {reuseaddr, true}], Logger)).
%% 'binary' and 'list' are disallowed but they are handled
%% specifically as they do not have 2-tuple equivalents.
diff --git a/src/ranch_transport.erl b/src/ranch_transport.erl
index 2344733..6790977 100644
--- a/src/ranch_transport.erl
+++ b/src/ranch_transport.erl
@@ -27,7 +27,7 @@
-callback name() -> atom().
-callback secure() -> boolean().
-callback messages() -> {OK::atom(), Closed::atom(), Error::atom(), Passive::atom()}.
--callback listen(opts()) -> {ok, socket()} | {error, atom()}.
+-callback listen(ranch:transport_opts(any())) -> {ok, socket()} | {error, atom()}.
-callback accept(socket(), timeout())
-> {ok, socket()} | {error, closed | timeout | atom()}.
-callback handshake(socket(), opts(), timeout()) -> {ok, socket()} | {error, any()}.