From 5ada450fe10a5fc51b7f3f0900571a10547635a1 Mon Sep 17 00:00:00 2001 From: "j.uhlig" Date: Tue, 26 Jun 2018 17:07:13 +0200 Subject: 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. --- src/ranch.erl | 14 +++++++++++++- src/ranch_conns_sup.erl | 8 ++++---- src/ranch_ssl.erl | 14 ++++++++++++-- src/ranch_tcp.erl | 8 +++++++- src/ranch_transport.erl | 4 +++- 5 files changed, 39 insertions(+), 9 deletions(-) (limited to 'src') 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()) -- cgit v1.2.3