diff --git a/redis.go b/redis.go index ffed085..0d15dc8 100644 --- a/redis.go +++ b/redis.go @@ -152,7 +152,13 @@ type options struct { } type Options struct { - Addr string + Network string + Addr string + + // Dialer creates new network connection and has priority over + // Network and Addr options. + Dialer func() (net.Conn, error) + Password string DB int64 @@ -196,10 +202,13 @@ type Client struct { *baseClient } -func newClient(clOpt *Options, network string) *Client { +func NewClient(clOpt *Options) *Client { opt := clOpt.options() - dialer := func() (net.Conn, error) { - return net.DialTimeout(network, clOpt.Addr, opt.DialTimeout) + dialer := clOpt.Dialer + if dialer == nil { + dialer = func() (net.Conn, error) { + return net.DialTimeout(clOpt.Network, clOpt.Addr, opt.DialTimeout) + } } return &Client{ baseClient: &baseClient{ @@ -209,10 +218,14 @@ func newClient(clOpt *Options, network string) *Client { } } +// Deprecated. Use NewClient instead. func NewTCPClient(opt *Options) *Client { - return newClient(opt, "tcp") + opt.Network = "tcp" + return NewClient(opt) } +// Deprecated. Use NewClient instead. func NewUnixClient(opt *Options) *Client { - return newClient(opt, "unix") + opt.Network = "unix" + return NewClient(opt) } diff --git a/redis_test.go b/redis_test.go index 9bd1e09..b1d5803 100644 --- a/redis_test.go +++ b/redis_test.go @@ -69,6 +69,18 @@ func (t *RedisConnectorTest) TestNewUnixClient(c *C) { c.Assert(client.Close(), IsNil) } +func (t *RedisConnectorTest) TestDialer(c *C) { + client := redis.NewClient(&redis.Options{ + Dialer: func() (net.Conn, error) { + return net.Dial("tcp", redisAddr) + }, + }) + ping := client.Ping() + c.Check(ping.Err(), IsNil) + c.Check(ping.Val(), Equals, "PONG") + c.Assert(client.Close(), IsNil) +} + func (t *RedisConnectorTest) TestClose(c *C) { client := redis.NewTCPClient(&redis.Options{ Addr: redisAddr,