THRIFT-2113 Erlang SSL Socket Support
Client: Erlang
Patch: David Robakowski
diff --git a/lib/erl/src/thrift_socket_server.erl b/lib/erl/src/thrift_socket_server.erl
index f7c7a02..233b992 100644
--- a/lib/erl/src/thrift_socket_server.erl
+++ b/lib/erl/src/thrift_socket_server.erl
@@ -38,7 +38,9 @@
listen=null,
acceptor=null,
socket_opts=[{recv_timeout, 500}],
- framed=false
+ framed=false,
+ ssltransport=false,
+ ssloptions=[]
}).
start(State=#thrift_socket_server{}) ->
@@ -103,8 +105,14 @@
Max
end,
parse_options(Rest, State#thrift_socket_server{max=MaxInt});
+
parse_options([{framed, Framed} | Rest], State) when is_boolean(Framed) ->
- parse_options(Rest, State#thrift_socket_server{framed=Framed}).
+ parse_options(Rest, State#thrift_socket_server{framed=Framed});
+
+parse_options([{ssltransport, SSLTransport} | Rest], State) when is_boolean(SSLTransport) ->
+ parse_options(Rest, State#thrift_socket_server{ssltransport=SSLTransport});
+parse_options([{ssloptions, SSLOptions} | Rest], State) when is_list(SSLOptions) ->
+ parse_options(Rest, State#thrift_socket_server{ssloptions=SSLOptions}).
start_server(State=#thrift_socket_server{name=Name}) ->
case Name of
@@ -168,25 +176,28 @@
State#thrift_socket_server{acceptor=null};
new_acceptor(State=#thrift_socket_server{listen=Listen,
service=Service, handler=Handler,
- socket_opts=Opts, framed=Framed
+ socket_opts=Opts, framed=Framed,
+ ssltransport=SslTransport, ssloptions=SslOptions
}) ->
Pid = proc_lib:spawn_link(?MODULE, acceptor_loop,
- [{self(), Listen, Service, Handler, Opts, Framed}]),
+ [{self(), Listen, Service, Handler, Opts, Framed, SslTransport, SslOptions}]),
State#thrift_socket_server{acceptor=Pid}.
-acceptor_loop({Server, Listen, Service, Handler, SocketOpts, Framed})
+acceptor_loop({Server, Listen, Service, Handler, SocketOpts, Framed, SslTransport, SslOptions})
when is_pid(Server), is_list(SocketOpts) ->
case catch gen_tcp:accept(Listen) of % infinite timeout
{ok, Socket} ->
gen_server:cast(Server, {accepted, self()}),
ProtoGen = fun() ->
- {ok, SocketTransport} = thrift_socket_transport:new(Socket, SocketOpts),
- {ok, Transport} =
- case Framed of
- true -> thrift_framed_transport:new(SocketTransport);
- false -> thrift_buffered_transport:new(SocketTransport)
- end,
- {ok, Protocol} = thrift_binary_protocol:new(Transport),
+ {ok, SocketTransport} = case SslTransport of
+ true -> thrift_sslsocket_transport:new(Socket, SocketOpts, SslOptions);
+ false -> thrift_socket_transport:new(Socket, SocketOpts)
+ end,
+ {ok, Transport} = case Framed of
+ true -> thrift_framed_transport:new(SocketTransport);
+ false -> thrift_buffered_transport:new(SocketTransport)
+ end,
+ {ok, Protocol} = thrift_binary_protocol:new(Transport),
{ok, Protocol}
end,
thrift_processor:init({Server, ProtoGen, Service, Handler});