aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorj.uhlig <[email protected]>2018-06-26 17:07:13 +0200
committerLoïc Hoguin <[email protected]>2018-07-02 09:02:00 +0200
commit5ada450fe10a5fc51b7f3f0900571a10547635a1 (patch)
tree45ac84215485f09ebedce319121ed5f719b30493 /src
parentcaeadc82615e9e5ce0c2d92f882cad7b9cb7322d (diff)
downloadranch-5ada450fe10a5fc51b7f3f0900571a10547635a1.tar.gz
ranch-5ada450fe10a5fc51b7f3f0900571a10547635a1.tar.bz2
ranch-5ada450fe10a5fc51b7f3f0900571a10547635a1.zip
Introduce Transport:handshake/1,2
This commit deprecates Transport:accept_ack/1 in favor of a new forward-compatible function. Transport:handshake/1,2 will use ssl:handshake/2,3 from Ranch 2.0 onward.
Diffstat (limited to 'src')
-rw-r--r--src/ranch.erl14
-rw-r--r--src/ranch_conns_sup.erl8
-rw-r--r--src/ranch_ssl.erl14
-rw-r--r--src/ranch_tcp.erl8
-rw-r--r--src/ranch_transport.erl4
5 files changed, 39 insertions, 9 deletions
diff --git a/src/ranch.erl b/src/ranch.erl
index 9cd3809..287b1e3 100644
--- a/src/ranch.erl
+++ b/src/ranch.erl
@@ -22,6 +22,8 @@
-export([child_spec/5]).
-export([child_spec/6]).
-export([accept_ack/1]).
+-export([handshake/1]).
+-export([handshake/2]).
-export([remove_connection/1]).
-export([get_status/1]).
-export([get_addr/1]).
@@ -166,10 +168,20 @@ child_spec(Ref, NumAcceptors, Transport, TransOpts, Protocol, ProtoOpts)
-spec accept_ack(ref()) -> ok.
accept_ack(Ref) ->
- receive {shoot, Ref, Transport, Socket, AckTimeout} ->
+ receive {handshake, Ref, Transport, Socket, AckTimeout} ->
Transport:accept_ack(Socket, AckTimeout)
end.
+-spec handshake(ref()) -> {ok, ranch_transport:socket()}.
+handshake(Ref) ->
+ handshake(Ref, []).
+
+-spec handshake(ref(), any()) -> {ok, ranch_transport:socket()}.
+handshake(Ref, Opts) ->
+ receive {handshake, Ref, Transport, Socket, AckTimeout} ->
+ Transport:handshake(Socket, Opts, AckTimeout)
+ end.
+
-spec remove_connection(ref()) -> ok.
remove_connection(Ref) ->
ConnsSup = ranch_server:get_connections_sup(Ref),
diff --git a/src/ranch_conns_sup.erl b/src/ranch_conns_sup.erl
index 812a6c3..72de2d7 100644
--- a/src/ranch_conns_sup.erl
+++ b/src/ranch_conns_sup.erl
@@ -115,9 +115,9 @@ loop(State=#state{parent=Parent, ref=Ref, conn_type=ConnType,
{?MODULE, start_protocol, To, Socket} ->
try Protocol:start_link(Ref, Socket, Transport, Opts) of
{ok, Pid} ->
- shoot(State, CurConns, NbChildren, Sleepers, To, Socket, Pid, Pid);
+ handshake(State, CurConns, NbChildren, Sleepers, To, Socket, Pid, Pid);
{ok, SupPid, ProtocolPid} when ConnType =:= supervisor ->
- shoot(State, CurConns, NbChildren, Sleepers, To, Socket, SupPid, ProtocolPid);
+ handshake(State, CurConns, NbChildren, Sleepers, To, Socket, SupPid, ProtocolPid);
Ret ->
To ! self(),
error_logger:error_msg(
@@ -219,11 +219,11 @@ loop(State=#state{parent=Parent, ref=Ref, conn_type=ConnType,
loop(State, CurConns, NbChildren, Sleepers)
end.
-shoot(State=#state{ref=Ref, transport=Transport, ack_timeout=AckTimeout, max_conns=MaxConns},
+handshake(State=#state{ref=Ref, transport=Transport, ack_timeout=AckTimeout, max_conns=MaxConns},
CurConns, NbChildren, Sleepers, To, Socket, SupPid, ProtocolPid) ->
case Transport:controlling_process(Socket, ProtocolPid) of
ok ->
- ProtocolPid ! {shoot, Ref, Transport, Socket, AckTimeout},
+ ProtocolPid ! {handshake, Ref, Transport, Socket, AckTimeout},
put(SupPid, active),
CurConns2 = CurConns + 1,
if CurConns2 < MaxConns ->
diff --git a/src/ranch_ssl.erl b/src/ranch_ssl.erl
index ac96e45..d651e7a 100644
--- a/src/ranch_ssl.erl
+++ b/src/ranch_ssl.erl
@@ -15,6 +15,10 @@
-module(ranch_ssl).
-behaviour(ranch_transport).
+-ifdef(OTP_RELEASE).
+-compile({nowarn_deprecated_function, [{ssl, ssl_accept, 3}]}).
+-endif.
+
-export([name/0]).
-export([secure/0]).
-export([messages/0]).
@@ -22,6 +26,7 @@
-export([disallowed_listen_options/0]).
-export([accept/2]).
-export([accept_ack/2]).
+-export([handshake/3]).
-export([connect/3]).
-export([connect/4]).
-export([recv/3]).
@@ -128,9 +133,14 @@ accept(LSocket, Timeout) ->
-spec accept_ack(ssl:sslsocket(), timeout()) -> ok.
accept_ack(CSocket, Timeout) ->
- case ssl:ssl_accept(CSocket, Timeout) of
+ {ok, _} = handshake(CSocket, [], Timeout),
+ ok.
+
+-spec handshake(ssl:sslsocket(), opts(), timeout()) -> {ok, ssl:sslsocket()}.
+handshake(CSocket, Opts, Timeout) ->
+ case ssl:ssl_accept(CSocket, Opts, Timeout) of
ok ->
- ok;
+ {ok, CSocket};
%% Garbage was most likely sent to the socket, don't error out.
{error, {tls_alert, _}} ->
ok = close(CSocket),
diff --git a/src/ranch_tcp.erl b/src/ranch_tcp.erl
index bc0c75d..58cbb37 100644
--- a/src/ranch_tcp.erl
+++ b/src/ranch_tcp.erl
@@ -22,6 +22,7 @@
-export([disallowed_listen_options/0]).
-export([accept/2]).
-export([accept_ack/2]).
+-export([handshake/3]).
-export([connect/3]).
-export([connect/4]).
-export([recv/3]).
@@ -100,9 +101,14 @@ accept(LSocket, Timeout) ->
gen_tcp:accept(LSocket, Timeout).
-spec accept_ack(inet:socket(), timeout()) -> ok.
-accept_ack(_, _) ->
+accept_ack(CSocket, Timeout) ->
+ {ok, _} = handshake(CSocket, [], Timeout),
ok.
+-spec handshake(inet:socket(), opts(), timeout()) -> {ok, inet:socket()}.
+handshake(CSocket, _, _) ->
+ {ok, CSocket}.
+
%% @todo Probably filter Opts?
-spec connect(inet:ip_address() | inet:hostname(),
inet:port_number(), any())
diff --git a/src/ranch_transport.erl b/src/ranch_transport.erl
index b671cf5..9d3083f 100644
--- a/src/ranch_transport.erl
+++ b/src/ranch_transport.erl
@@ -17,6 +17,8 @@
-export([sendfile/6]).
-type socket() :: any().
+-export_type([socket/0]).
+
-type opts() :: any().
-type stats() :: any().
-type sendfile_opts() :: [{chunk_size, non_neg_integer()}].
@@ -28,7 +30,7 @@
-callback listen(opts()) -> {ok, socket()} | {error, atom()}.
-callback accept(socket(), timeout())
-> {ok, socket()} | {error, closed | timeout | atom()}.
--callback accept_ack(socket(), timeout()) -> ok.
+-callback handshake(socket(), opts(), timeout()) -> {ok, socket()}.
-callback connect(string(), inet:port_number(), opts())
-> {ok, socket()} | {error, atom()}.
-callback connect(string(), inet:port_number(), opts(), timeout())