From 246c60ae4d25e5b6bdd85dd3860b90fb5fcc75ba Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Mon, 25 Mar 2019 23:58:53 +0000 Subject: [PATCH] Experimental (read: badly tested) support for srv:// and txt:// handlers --- src/yggdrasil/link.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/yggdrasil/link.go b/src/yggdrasil/link.go index bfec714b..8e2e50f5 100644 --- a/src/yggdrasil/link.go +++ b/src/yggdrasil/link.go @@ -102,6 +102,33 @@ func (l *link) call(uri string, sintf string) error { } pathtokens := strings.Split(strings.Trim(u.Path, "/"), "/") switch u.Scheme { + case "srv": + for _, proto := range []string{"tcp"} { + if cname, srv, err := net.LookupSRV("yggdrasil", proto, u.Host); err == nil { + for _, record := range srv { + l.core.log.Debugln("SRV lookup for", u.Host, "found:", cname, record.Target, record.Port) + switch proto { + case "tcp": + saddr := fmt.Sprintf("%s:%d", record.Target, record.Port) + l.tcp.call(saddr, nil, sintf) + } + } + } else { + l.core.log.Debugln("SRV lookup for", u.Host, "failed:", err) + } + } + case "txt": + recordname := fmt.Sprintf("_yggdrasil.%s", u.Host) + if records, err := net.LookupTXT(recordname); err == nil { + for _, record := range records { + l.core.log.Debugln("Found TXT record:", record) + if !strings.HasPrefix(record, "txt://") { + l.call(record, sintf) + } + } + } else { + l.core.log.Debugln("TXT lookup failed:", err) + } case "tcp": l.tcp.call(u.Host, nil, sintf) case "socks":