Browse Source

Automatically start crypto, public_key and ssl if needed.

Following mochiweb and misultin's example here even though I'm not
too thrilled about starting them and not stopping but it's optional
and the application's author can start/stop them as normal anyway.
Loïc Hoguin 14 years ago
parent
commit
0720d6b9e3
1 changed files with 11 additions and 0 deletions
  1. 11 0
      src/cowboy_ssl_transport.erl

+ 11 - 0
src/cowboy_ssl_transport.erl

@@ -30,6 +30,7 @@ messages() -> {ssl, ssl_closed, ssl_error}.
 	| {keyfile, KeyPath::string()} | {password, Password::string()}])
 	-> {ok, LSocket::ssl:sslsocket()} | {error, Reason::atom()}.
 listen(Opts) ->
+	require([crypto, public_key, ssl]),
 	{port, Port} = lists:keyfind(port, 1, Opts),
 	Backlog = proplists:get_value(backlog, Opts, 1024),
 	{certfile, CertFile} = lists:keyfind(certfile, 1, Opts),
@@ -80,6 +81,16 @@ close(Socket) ->
 
 %% Internal.
 
+-spec require(Apps::list(module())) -> ok.
+require([]) ->
+	ok;
+require([App|Tail]) ->
+	case application:start(App) of
+		ok -> ok;
+		{error, {already_started, App}} -> ok
+	end,
+	require(Tail).
+
 -spec ssl_accept(CSocket::ssl:sslsocket(), Timeout::timeout())
 	-> {ok, Socket::ssl:sslsocket()} | {error, Reason::closed | timeout | atom()}.
 ssl_accept(CSocket, Timeout) ->