From 19140af10d80239510885e5e7e6aa87a4427c949 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Mon, 20 Jan 2020 11:15:22 +0100 Subject: [PATCH] carddav: add Discover --- carddav/client.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/carddav/client.go b/carddav/client.go index 90271bc..60a258d 100644 --- a/carddav/client.go +++ b/carddav/client.go @@ -3,13 +3,42 @@ package carddav import ( "bytes" "fmt" + "net" "net/http" + "net/url" "github.com/emersion/go-vcard" "github.com/emersion/go-webdav" "github.com/emersion/go-webdav/internal" ) +// Discover performs a DNS-based CardDAV service discovery as described in +// RFC 6352 section 11. It returns the URL to the CardDAV server. +func Discover(domain string) (string, error) { + // Only lookup carddavs (not carddav), plaintext connections are insecure + _, addrs, err := net.LookupSRV("carddavs", "tcp", domain) + if dnsErr, ok := err.(*net.DNSError); ok { + if dnsErr.IsTemporary { + return "", err + } + } else if err != nil { + return "", err + } + + if len(addrs) == 0 { + return "", fmt.Errorf("carddav: domain doesn't have an SRV record") + } + addr := addrs[0] + + u := url.URL{Scheme: "https"} + if addr.Port == 443 { + u.Host = addr.Target + } else { + u.Host = fmt.Sprintf("%v:%v", addr.Target, addr.Port) + } + return u.String(), nil +} + type Client struct { *webdav.Client