diff --git a/client.go b/client.go index 68d40c86..12567f57 100644 --- a/client.go +++ b/client.go @@ -47,6 +47,8 @@ type ClientConfig struct { Conn net.PacketConn // Listening socket (net.PacketConn) Net transport.Net LoggerFactory logging.LoggerFactory + + IgnoreTURNResolveErrors bool // TURN server address is not required for some configurations (e.g. proxy) } // Client is a STUN server client. @@ -114,10 +116,13 @@ func NewClient(config *ClientConfig) (*Client, error) { if len(config.TURNServerAddr) > 0 { turnServ, err = config.Net.ResolveUDPAddr("udp4", config.TURNServerAddr) if err != nil { - return nil, err + if !config.IgnoreTURNResolveErrors { + return nil, err + } + log.Debugf("Failed to resolve TURN server %s: %s", config.TURNServerAddr, err) + } else { + log.Debugf("Resolved TURN server %s to %s", config.TURNServerAddr, turnServ) } - - log.Debugf("Resolved TURN server %s to %s", config.TURNServerAddr, turnServ) } client := &Client{ diff --git a/client_test.go b/client_test.go index 5df03d6c..c7de552c 100644 --- a/client_test.go +++ b/client_test.go @@ -325,3 +325,27 @@ func TestTCPClientWithoutAddress(t *testing.T) { assert.NoError(t, conn.Close()) assert.NoError(t, server.Close()) } + +func TestClientTURNResolving(t *testing.T) { + listener, err := net.Listen("tcp4", "0.0.0.0:13478") //nolint: gosec + assert.NoError(t, err) + + conn, err := net.Dial("tcp", "127.0.0.1:13478") + assert.NoError(t, err) + + _, err = NewClient(&ClientConfig{ + TURNServerAddr: "unresolvable.turn.server.address:13478", + Conn: NewSTUNConn(conn), + }) + assert.Error(t, err) + + _, err = NewClient(&ClientConfig{ + TURNServerAddr: "unresolvable.turn.server.address:13478", + Conn: NewSTUNConn(conn), + IgnoreTURNResolveErrors: true, + }) + assert.NoError(t, err) + + assert.NoError(t, conn.Close()) + assert.NoError(t, listener.Close()) +}