From b297499e13ce24806cc354ea601292b30cbb979f Mon Sep 17 00:00:00 2001 From: michael-coles Date: Wed, 6 Dec 2017 15:04:31 +0100 Subject: Add support for unix sockets --- src/gun.erl | 9 +++++++++ test/gun_SUITE.erl | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) 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. -- cgit v1.2.3