Skip to content

Commit

Permalink
Add support for IDNA
Browse files Browse the repository at this point in the history
Signed-off-by: Julien Pivotto <roidelapluie@inuits.eu>
  • Loading branch information
Julien Pivotto authored and InsanePrawn committed Feb 8, 2024
1 parent 7ea9d35 commit d6f6a34
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 1 deletion.
4 changes: 3 additions & 1 deletion prober/dns.go
Original file line number Diff line number Diff line change
Expand Up @@ -253,11 +253,13 @@ func ProbeDNS(ctx context.Context, target string, module config.Module, registry
}
}

queryName := internationalizeDNSDomain(logger, module.DNS.QueryName)

msg := new(dns.Msg)
msg.Id = dns.Id()
msg.RecursionDesired = module.DNS.Recursion
msg.Question = make([]dns.Question, 1)
msg.Question[0] = dns.Question{dns.Fqdn(module.DNS.QueryName), qt, qc}
msg.Question[0] = dns.Question{dns.Fqdn(queryName), qt, qc}

level.Info(logger).Log("msg", "Making DNS query", "target", targetIP, "dial_protocol", dialProtocol, "query", module.DNS.QueryName, "type", qt, "class", qc)
timeoutDeadline, _ := ctx.Deadline()
Expand Down
17 changes: 17 additions & 0 deletions prober/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (

"github.com/go-kit/log"
"github.com/go-kit/log/level"
"golang.org/x/net/idna"

"github.com/prometheus/client_golang/prometheus"
)
Expand Down Expand Up @@ -60,6 +61,7 @@ func chooseProtocol(ctx context.Context, IPProtocol string, fallbackIPProtocol b
fallbackProtocol = "ip6"
}

target = internationalizeDNSDomain(logger, target)
level.Info(logger).Log("msg", "Resolving target address", "target", target, "ip_protocol", IPProtocol)
resolveStart := time.Now()

Expand Down Expand Up @@ -142,3 +144,18 @@ func ipHash(ip net.IP) float64 {
}
return float64(h.Sum32())
}

func internationalizeDNSDomain(logger log.Logger, domain string) string {
if net.ParseIP(domain) != nil {
// IP addresses don't need to be internationalized.
return domain
}
idnaDomain, err := idna.Lookup.ToASCII(domain)
if err != nil {
return domain
}
if idnaDomain != domain {
level.Info(logger).Log("msg", "Domain internationalized", "unicode", domain, "ascii", idnaDomain)
}
return idnaDomain
}
20 changes: 20 additions & 0 deletions prober/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -252,3 +252,23 @@ func checkMetrics(expected map[string]map[string]map[string]struct{}, mfs []*dto
}
}
}

func TestChooseProtocolIDNA(t *testing.T) {
if testing.Short() {
t.Skip("skipping network dependent test")
}
var (
ctx = context.Background()
registry = prometheus.NewPedanticRegistry()
w = log.NewSyncWriter(os.Stderr)
logger = log.NewLogfmtLogger(w)
)

ip, _, err := chooseProtocol(ctx, "ip4", true, "www.académie-française.fr", registry, logger)
if err != nil {
t.Error(err)
}
if ip == nil || ip.IP.To4() == nil {
t.Error("it should answer")
}
}

0 comments on commit d6f6a34

Please sign in to comment.