From a170ed1b239a15d4b862774d74f0893bab40cced Mon Sep 17 00:00:00 2001 From: Anton Manakin Date: Wed, 7 May 2025 14:40:40 +0000 Subject: [PATCH 1/2] Add client config param IgnoreTURNResolveErrors --- client.go | 11 ++++++++--- client_test.go | 11 +++++++---- 2 files changed, 15 insertions(+), 7 deletions(-) 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..f53e8305 100644 --- a/client_test.go +++ b/client_test.go @@ -291,10 +291,13 @@ func TestTCPClientWithoutAddress(t *testing.T) { assert.NoError(t, err) client, err := NewClient(&ClientConfig{ - Conn: NewSTUNConn(conn), - Username: "foo", - Password: "pass", - RTO: time.Nanosecond, + TURNServerAddr: "unresolvable.turn.server.address:13478", + Conn: NewSTUNConn(conn), + Username: "foo", + Password: "pass", + RTO: time.Nanosecond, + + IgnoreTURNResolveErrors: true, }) assert.NoError(t, err) assert.NoError(t, client.Listen()) From 752326cecb7572159924ac1917510c151ad4a279 Mon Sep 17 00:00:00 2001 From: Anton Manakin Date: Wed, 7 May 2025 15:09:26 +0000 Subject: [PATCH 2/2] Add client turn addresss resolving test --- client_test.go | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/client_test.go b/client_test.go index f53e8305..c7de552c 100644 --- a/client_test.go +++ b/client_test.go @@ -291,13 +291,10 @@ func TestTCPClientWithoutAddress(t *testing.T) { assert.NoError(t, err) client, err := NewClient(&ClientConfig{ - TURNServerAddr: "unresolvable.turn.server.address:13478", - Conn: NewSTUNConn(conn), - Username: "foo", - Password: "pass", - RTO: time.Nanosecond, - - IgnoreTURNResolveErrors: true, + Conn: NewSTUNConn(conn), + Username: "foo", + Password: "pass", + RTO: time.Nanosecond, }) assert.NoError(t, err) assert.NoError(t, client.Listen()) @@ -328,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()) +}