summaryrefslogtreecommitdiff
path: root/deps/exo/src/exo_socket.erl
diff options
context:
space:
mode:
Diffstat (limited to 'deps/exo/src/exo_socket.erl')
-rw-r--r--deps/exo/src/exo_socket.erl81
1 files changed, 46 insertions, 35 deletions
diff --git a/deps/exo/src/exo_socket.erl b/deps/exo/src/exo_socket.erl
index dc961ac..6967a40 100644
--- a/deps/exo/src/exo_socket.erl
+++ b/deps/exo/src/exo_socket.erl
@@ -9,7 +9,7 @@
%%%---- END COPYRIGHT ---------------------------------------------------------
%%% @author Tony Rogvall <tony@rogvall.se>
%%% @doc
-%%% EXO socket
+%%% EXO socket
%%% @end
%%% Created : 15 Dec 2011 by Tony Rogvall <tony@rogvall.se>
@@ -17,7 +17,7 @@
-export([listen/1, listen/2, listen/3]).
--export([accept/1, accept/2]).
+-export([accept/1, accept/2, accept/3]).
-export([async_accept/1, async_accept/2]).
-export([connect/2, connect/3, connect/4, connect/5]).
%% -export([async_connect/2, async_connect/3, async_connect/4]).
@@ -85,7 +85,7 @@ listen(Port, Protos=[tcp|_], Opts0) ->
Error
end.
-%%
+%%
%%
%%
connect(Host, Port) ->
@@ -108,7 +108,7 @@ connect(Host, Port, Protos=[tcp|_], Opts0, Timeout) ->
TcpConnectOpts = [{active,false},{packet,0},{mode,binary}|TcpOpts1],
case gen_tcp:connect(Host, Port, TcpConnectOpts, Timeout) of
{ok, S} ->
- X =
+ X =
#exo_socket { mdata = gen_tcp,
mctl = inet,
protocol = Protos,
@@ -214,11 +214,11 @@ connect_upgrade(X, Protos0, Timeout) ->
{SSLOpts0,Opts1} = split_options(ssl_connect_opts(),Opts),
{_,SSLOpts} = split_options([ssl_imp], SSLOpts0),
?dbg("SSL upgrade, options = ~w\n", [SSLOpts]),
- ?dbg("exo_socket: before ssl:connect opts=~w\n",
+ ?dbg("exo_socket: before ssl:connect opts=~w\n",
[getopts(X, [active,packet,mode])]),
case ssl_connect(X#exo_socket.socket, SSLOpts, Timeout) of
{ok,S1} ->
- ?dbg("exo_socket: ssl:connect opt=~w\n",
+ ?dbg("exo_socket: ssl:connect opt=~w\n",
[ssl:getopts(S1, [active,packet,mode])]),
X1 = X#exo_socket { socket=S1,
mdata = ssl,
@@ -227,25 +227,25 @@ connect_upgrade(X, Protos0, Timeout) ->
tags={ssl,ssl_closed,ssl_error}},
connect_upgrade(X1, Protos1, Timeout);
Error={error,_Reason} ->
- ?dbg("exo_socket: ssl:connect error=~w\n",
+ ?dbg("exo_socket: ssl:connect error=~w\n",
[_Reason]),
Error
end;
[http|Protos1] ->
{_, Close,Error} = X#exo_socket.tags,
- X1 = X#exo_socket { packet = http,
+ X1 = X#exo_socket { packet = http,
tags = {http, Close, Error }},
connect_upgrade(X1, Protos1, Timeout);
[] ->
setopts(X, [{mode,X#exo_socket.mode},
{packet,X#exo_socket.packet},
{active,X#exo_socket.active}]),
- ?dbg("exo_socket: after upgrade opts=~w\n",
+ ?dbg("exo_socket: after upgrade opts=~w\n",
[getopts(X, [active,packet,mode])]),
{ok,X}
end.
-
-ssl_connect(Socket, Options, Timeout) ->
+
+ssl_connect(Socket, Options, Timeout) ->
case ssl:connect(Socket, Options, Timeout) of
{error, ssl_not_started} ->
ssl:start(),
@@ -288,28 +288,39 @@ async_socket(Listen, Socket, AuthOpts)
ok ->
{ok,Mod} = inet_db:lookup_socket(Listen#exo_socket.socket),
inet_db:register_socket(Socket, Mod),
- X = Listen#exo_socket { transport=Socket, socket=Socket },
- maybe_auth(
- accept_upgrade(X, tl(X#exo_socket.protocol), infinity),
- server,
- X#exo_socket.opts ++ AuthOpts);
+ {ok, Listen#exo_socket { transport=Socket, socket=Socket,
+ opts = Listen#exo_socket.opts ++ AuthOpts }};
Error ->
prim_inet:close(Socket),
Error
end;
Error ->
+ ?debug("getopts() -> ~p", [Error]),
prim_inet:close(Socket),
Error
end.
-
accept(X) when is_record(X, exo_socket) ->
- accept_upgrade(X, X#exo_socket.protocol, infinity).
-
-accept(X, Timeout) when
- is_record(X, exo_socket),
+ Timeout = proplists:get_value(accept_timeout, X#exo_socket.opts, infinity),
+ maybe_auth(
+ accept_upgrade(X, X#exo_socket.protocol, Timeout),
+ server,
+ X#exo_socket.opts).
+
+accept(X, Timeout) when
+ is_record(X, exo_socket),
(Timeout =:= infnity orelse (is_integer(Timeout) andalso Timeout >= 0)) ->
- accept_upgrade(X, X#exo_socket.protocol, Timeout).
+ maybe_auth(
+ accept_upgrade(X, X#exo_socket.protocol, Timeout),
+ server,
+ X#exo_socket.opts).
+
+accept(X, Protos, Timeout) when
+ is_record(X, exo_socket) ->
+ maybe_auth(
+ accept_upgrade(X, Protos, Timeout),
+ server,
+ X#exo_socket.opts).
accept_upgrade(X=#exo_socket { mdata = M }, Protos0, Timeout) ->
?dbg("exo_socket: accept protos=~w\n", [Protos0]),
@@ -327,11 +338,11 @@ accept_upgrade(X=#exo_socket { mdata = M }, Protos0, Timeout) ->
{SSLOpts0,Opts1} = split_options(ssl_listen_opts(),Opts),
{_,SSLOpts} = split_options([ssl_imp], SSLOpts0),
?dbg("SSL upgrade, options = ~w\n", [SSLOpts]),
- ?dbg("exo_socket: before ssl_accept opt=~w\n",
+ ?dbg("exo_socket: before ssl_accept opt=~w\n",
[getopts(X, [active,packet,mode])]),
case ssl_accept(X#exo_socket.socket, SSLOpts, Timeout) of
{ok,S1} ->
- ?dbg("exo_socket: ssl_accept opt=~w\n",
+ ?dbg("exo_socket: ssl_accept opt=~w\n",
[ssl:getopts(S1, [active,packet,mode])]),
X1 = X#exo_socket{socket=S1,
mdata = ssl,
@@ -340,7 +351,7 @@ accept_upgrade(X=#exo_socket { mdata = M }, Protos0, Timeout) ->
tags={ssl,ssl_closed,ssl_error}},
accept_upgrade(X1, Protos1, Timeout);
Error={error,_Reason} ->
- ?dbg("exo_socket: ssl:ssl_accept error=~w\n",
+ ?dbg("exo_socket: ssl:ssl_accept error=~w\n",
[_Reason]),
Error
end;
@@ -348,14 +359,14 @@ accept_upgrade(X=#exo_socket { mdata = M }, Protos0, Timeout) ->
accept_probe_ssl(X,Protos1,Timeout);
[http|Protos1] ->
{_, Close,Error} = X#exo_socket.tags,
- X1 = X#exo_socket { packet = http,
+ X1 = X#exo_socket { packet = http,
tags = {http, Close, Error }},
accept_upgrade(X1,Protos1,Timeout);
[] ->
setopts(X, [{mode,X#exo_socket.mode},
{packet,X#exo_socket.packet},
{active,X#exo_socket.active}]),
- ?dbg("exo_socket: after upgrade opts=~w\n",
+ ?dbg("exo_socket: after upgrade opts=~w\n",
[getopts(X, [active,packet,mode])]),
{ok,X}
end.
@@ -393,7 +404,7 @@ accept_probe_ssl(X=#exo_socket { mdata=M, socket=S,
Error
end.
-ssl_accept(Socket, Options, Timeout) ->
+ssl_accept(Socket, Options, Timeout) ->
case ssl:ssl_accept(Socket, Options, Timeout) of
{error, ssl_not_started} ->
ssl:start(),
@@ -417,7 +428,7 @@ request_type(<<ContentType:8, _Version:16, _Length:16, _/binary>>) ->
end;
request_type(_) ->
undefined.
-
+
%%
%% exo_socket wrapper for socket operations
%%
@@ -426,7 +437,7 @@ close(#exo_socket { mdata = M, socket = S}) ->
shutdown(#exo_socket { mdata = M, socket = S}, How) ->
M:shutdown(S, How).
-
+
send(#exo_socket { mdata = M,socket = S, mauth = A,auth_state = Sa} = X, Data) ->
if A == undefined ->
M:send(S, Data);
@@ -520,11 +531,11 @@ tcp_connect_options() ->
ssl_listen_opts() ->
- [versions, verify, verify_fun,
+ [versions, verify, verify_fun,
fail_if_no_peer_cert, verify_client_once,
- depth, cert, certfile, key, keyfile,
+ depth, cert, certfile, key, keyfile,
password, cacerts, cacertfile, dh, dhfile, cihpers,
- %% deprecated soon
+ %% deprecated soon
ssl_imp, %% always new!
%% server
verify_client_once,
@@ -533,9 +544,9 @@ ssl_listen_opts() ->
debug, hibernate_after, erl_dist ].
ssl_connect_opts() ->
- [versions, verify, verify_fun,
+ [versions, verify, verify_fun,
fail_if_no_peer_cert,
- depth, cert, certfile, key, keyfile,
+ depth, cert, certfile, key, keyfile,
password, cacerts, cacertfile, dh, dhfile, cihpers,
debug].