From 5f438561e9cb3656f289c6c438b3f8a8dfaf5c66 Mon Sep 17 00:00:00 2001 From: Hunter Morris Date: Tue, 21 Jun 2011 13:39:06 +0100 Subject: Pass {ip, Ip} configuration through for TCP and SSL transports --- src/cowboy_ssl_transport.erl | 13 ++++++++++--- src/cowboy_tcp_transport.erl | 13 ++++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/cowboy_ssl_transport.erl b/src/cowboy_ssl_transport.erl index ea3f482..8e569ec 100644 --- a/src/cowboy_ssl_transport.erl +++ b/src/cowboy_ssl_transport.erl @@ -25,7 +25,8 @@ name() -> ssl. messages() -> {ssl, ssl_closed, ssl_error}. -spec listen([{port, inet:ip_port()} | {certfile, string()} - | {keyfile, string()} | {password, string()}]) + | {keyfile, string()} | {password, string()} + | {ip, inet:ip_address()}]) -> {ok, ssl:sslsocket()} | {error, atom()}. listen(Opts) -> require([crypto, public_key, ssl]), @@ -34,9 +35,15 @@ listen(Opts) -> {certfile, CertFile} = lists:keyfind(certfile, 1, Opts), {keyfile, KeyFile} = lists:keyfind(keyfile, 1, Opts), {password, Password} = lists:keyfind(password, 1, Opts), - ssl:listen(Port, [binary, {active, false}, + ListenOpts0 = [binary, {active, false}, {backlog, Backlog}, {packet, raw}, {reuseaddr, true}, - {certfile, CertFile}, {keyfile, KeyFile}, {password, Password}]). + {certfile, CertFile}, {keyfile, KeyFile}, {password, Password}], + ListenOpts = + case lists:keyfind(ip, 1, Opts) of + false -> ListenOpts0; + Ip -> [Ip|ListenOpts0] + end, + ssl:listen(Port, ListenOpts). -spec accept(ssl:sslsocket(), timeout()) -> {ok, ssl:sslsocket()} | {error, closed | timeout | atom()}. diff --git a/src/cowboy_tcp_transport.erl b/src/cowboy_tcp_transport.erl index cf00bbc..1597b88 100644 --- a/src/cowboy_tcp_transport.erl +++ b/src/cowboy_tcp_transport.erl @@ -24,12 +24,19 @@ name() -> tcp. -spec messages() -> {tcp, tcp_closed, tcp_error}. messages() -> {tcp, tcp_closed, tcp_error}. --spec listen([{port, inet:ip_port()}]) -> {ok, inet:socket()} | {error, atom()}. +-spec listen([{port, inet:ip_port()} | {ip, inet:ip_address()}]) + -> {ok, inet:socket()} | {error, atom()}. listen(Opts) -> {port, Port} = lists:keyfind(port, 1, Opts), Backlog = proplists:get_value(backlog, Opts, 1024), - gen_tcp:listen(Port, [binary, {active, false}, - {backlog, Backlog}, {packet, raw}, {reuseaddr, true}]). + ListenOpts0 = [binary, {active, false}, + {backlog, Backlog}, {packet, raw}, {reuseaddr, true}], + ListenOpts = + case lists:keyfind(ip, 1, Opts) of + false -> ListenOpts0; + Ip -> [Ip|ListenOpts0] + end, + gen_tcp:listen(Port, ListenOpts). -spec accept(inet:socket(), timeout()) -> {ok, inet:socket()} | {error, closed | timeout | atom()}. -- cgit v1.2.3