github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/chat/unfurl/utils.go (about) 1 package unfurl 2 3 import ( 4 "errors" 5 "net/url" 6 "strings" 7 8 "github.com/keybase/client/go/chat/types" 9 "github.com/keybase/client/go/protocol/chat1" 10 "golang.org/x/net/publicsuffix" 11 ) 12 13 func GetDefaultFaviconURL(uri string) (string, error) { 14 parsed, err := url.Parse(uri) 15 if err != nil { 16 return "", err 17 } 18 parsed.Path = "favicon.ico" 19 parsed.RawQuery = "" 20 return parsed.String(), nil 21 } 22 23 func GetDefaultAppleTouchURL(uri string) (string, error) { 24 parsed, err := url.Parse(uri) 25 if err != nil { 26 return "", err 27 } 28 parsed.Path = "apple-touch-icon.png" 29 parsed.RawQuery = "" 30 return parsed.String(), nil 31 } 32 33 func GetHostname(uri string) (string, error) { 34 parsed, err := url.Parse(uri) 35 if err != nil { 36 return "", err 37 } 38 return parsed.Hostname(), nil 39 } 40 41 func GetDomain(uri string) (res string, err error) { 42 hostname, err := GetHostname(uri) 43 if err != nil { 44 return res, err 45 } 46 if len(hostname) == 0 { 47 return res, errors.New("no hostname") 48 } 49 if hostname == types.MapsDomain { 50 return hostname, nil 51 } 52 return publicsuffix.EffectiveTLDPlusOne(hostname) 53 } 54 55 func IsDomain(domain, target string) bool { 56 return strings.Contains(domain, target+".") 57 } 58 59 func ClassifyDomain(domain string) chat1.UnfurlType { 60 switch { 61 case domain == "gph.is": 62 fallthrough 63 case IsDomain(domain, "giphy"): 64 return chat1.UnfurlType_GIPHY 65 case domain == types.MapsDomain: 66 return chat1.UnfurlType_MAPS 67 default: 68 return chat1.UnfurlType_GENERIC 69 } 70 } 71 72 func ClassifyDomainFromURI(uri string) (typ chat1.UnfurlType, domain string, err error) { 73 if domain, err = GetDomain(uri); err != nil { 74 return typ, domain, err 75 } 76 return ClassifyDomain(domain), domain, nil 77 }