aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormichael-coles <[email protected]>2017-12-06 15:04:31 +0100
committerLoïc Hoguin <[email protected]>2017-12-16 16:54:15 +0100
commitb297499e13ce24806cc354ea601292b30cbb979f (patch)
tree48b036f802cf93baaf38af99c555de2aa4fc86e9
parentbda5630b8770da0f6e99f1617777f3c37fca957c (diff)
downloadgun-b297499e13ce24806cc354ea601292b30cbb979f.tar.gz
gun-b297499e13ce24806cc354ea601292b30cbb979f.tar.bz2
gun-b297499e13ce24806cc354ea601292b30cbb979f.zip
Add support for unix sockets
-rw-r--r--src/gun.erl9
-rw-r--r--test/gun_SUITE.erl38
2 files changed, 47 insertions, 0 deletions
diff --git a/src/gun.erl b/src/gun.erl
index be9e15d..a584e01 100644
--- a/src/gun.erl
+++ b/src/gun.erl
@@ -17,6 +17,7 @@
%% Connection.
-export([open/2]).
-export([open/3]).
+-export([open_unix/2]).
-export([info/1]).
-export([close/1]).
-export([shutdown/1]).
@@ -132,6 +133,14 @@ open(Host, Port) ->
-spec open(inet:hostname(), inet:port_number(), opts())
-> {ok, pid()} | {error, any()}.
open(Host, Port, Opts) when is_list(Host); is_atom(Host) ->
+ do_open(Host, Port, Opts).
+
+-spec open_unix(Path::string(), opts())
+ -> {ok, pid()} | {error, any()}.
+open_unix(SocketPath, Opts) ->
+ do_open({local, SocketPath}, 0, Opts).
+
+do_open(Host, Port, Opts) ->
case check_options(maps:to_list(Opts)) of
ok ->
case supervisor:start_child(gun_sup, [self(), Host, Port, Opts]) of
diff --git a/test/gun_SUITE.erl b/test/gun_SUITE.erl
index 8fd17c0..4b00559 100644
--- a/test/gun_SUITE.erl
+++ b/test/gun_SUITE.erl
@@ -202,3 +202,41 @@ transform_header_name(_) ->
Ref = gun:get(Pid, "/", [{<<"host">>, <<"google.com">>}]),
{response, _, _, _} = gun:await(Pid, Ref),
ok.
+
+unix_socket_connect(_) ->
+ case os:type() of
+ {win32, _} ->
+ doc("Unix Domain Sockets are not available on Windows.");
+ _ ->
+ do_unix_socket_connect()
+ end.
+
+do_unix_socket_connect() ->
+ doc("Ensure we can send data via a unix domain socket."),
+ DataDir = "/tmp/gun",
+ SocketPath = filename:join(DataDir, "gun.sock"),
+ ok = filelib:ensure_dir(SocketPath),
+ _ = file:delete(SocketPath),
+ TCPOpts = [
+ {ifaddr, {local, SocketPath}},
+ binary, {nodelay, true}, {active, false},
+ {packet, raw}, {reuseaddr, true}
+ ],
+ {ok, LSock} = gen_tcp:listen(0, TCPOpts),
+ Tester = self(),
+ Acceptor = fun() ->
+ {ok, S} = gen_tcp:accept(LSock),
+ {ok, R} = gen_tcp:recv(S, 0),
+ Tester ! {recv, R},
+ ok = gen_tcp:close(S),
+ ok = gen_tcp:close(LSock)
+ end,
+ spawn(Acceptor),
+ {ok, Pid} = gun:open_unix(SocketPath, #{}),
+ _ = gun:get(Pid, "/", [{<<"host">>, <<"localhost">>}]),
+ receive
+ {recv, _} ->
+ ok
+ after 250 ->
+ error(timeout)
+ end.