|
15 | 15 | package sip |
16 | 16 |
|
17 | 17 | import ( |
18 | | - "encoding/json" |
| 18 | + "context" |
19 | 19 | "fmt" |
20 | | - "io" |
21 | 20 | "net" |
22 | | - "net/http" |
23 | 21 | "net/netip" |
| 22 | + "time" |
24 | 23 |
|
| 24 | + "github.com/livekit/mediatransportutil/pkg/rtcconfig" |
| 25 | + "github.com/livekit/protocol/logger" |
25 | 26 | "github.com/livekit/sip/pkg/config" |
| 27 | + "github.com/pkg/errors" |
26 | 28 | ) |
27 | 29 |
|
28 | 30 | func GetServiceConfig(conf *config.Config) (*ServiceConfig, error) { |
@@ -65,29 +67,18 @@ func GetServiceConfig(conf *config.Config) (*ServiceConfig, error) { |
65 | 67 | } |
66 | 68 |
|
67 | 69 | func getPublicIP() (netip.Addr, error) { |
68 | | - req, err := http.Get("http://ip-api.com/json/") |
69 | | - if err != nil { |
70 | | - return netip.Addr{}, err |
71 | | - } |
72 | | - defer req.Body.Close() |
73 | | - |
74 | | - body, err := io.ReadAll(req.Body) |
75 | | - if err != nil { |
76 | | - return netip.Addr{}, err |
77 | | - } |
78 | | - |
79 | | - ip := struct { |
80 | | - Query string |
81 | | - }{} |
82 | | - if err = json.Unmarshal(body, &ip); err != nil { |
83 | | - return netip.Addr{}, err |
84 | | - } |
85 | | - |
86 | | - if ip.Query == "" { |
87 | | - return netip.Addr{}, fmt.Errorf("Query entry was not populated") |
| 70 | + var err error |
| 71 | + for i := 0; i < 3; i++ { |
| 72 | + var ip string |
| 73 | + ip, err = rtcconfig.GetExternalIP(context.Background(), rtcconfig.DefaultStunServers, nil) |
| 74 | + if err == nil { |
| 75 | + return netip.ParseAddr(ip) |
| 76 | + } else { |
| 77 | + time.Sleep(500 * time.Millisecond) |
| 78 | + } |
88 | 79 | } |
89 | | - |
90 | | - return netip.ParseAddr(ip.Query) |
| 80 | + logger.Warnw("could not resolve external IP", err) |
| 81 | + return netip.Addr{}, errors.Errorf("could not resolve external IP: %v", err) |
91 | 82 | } |
92 | 83 |
|
93 | 84 | func getLocalIP(localNet string) (netip.Addr, error) { |
|
0 commit comments