|
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