template-monorepo/internal/library/mongo/uri.go

73 lines
1.3 KiB
Go

package mongo
import (
"fmt"
"net"
"net/url"
)
func buildConnectionURI(c Conf) (string, error) {
scheme := c.Schema
if scheme == "" {
scheme = "mongodb"
}
host := c.Host
if host == "" {
return "", fmt.Errorf("mongo: host is required")
}
if c.Port > 0 && !hostHasPort(host) {
host = fmt.Sprintf("%s:%d", host, c.Port)
}
u := &url.URL{
Scheme: scheme,
Host: host,
}
if c.User != "" {
u.User = url.UserPassword(c.User, c.Password)
}
q := url.Values{}
if c.AuthSource != "" {
q.Set("authSource", c.AuthSource)
}
if c.ReplicaName != "" {
q.Set("replicaSet", c.ReplicaName)
}
if c.TLS {
q.Set("tls", "true")
}
if len(q) > 0 {
u.RawQuery = q.Encode()
}
return u.String(), nil
}
func hostHasPort(host string) bool {
// IPv6 [::1]:27017 or hostname:27017
if h, _, err := net.SplitHostPort(host); err == nil && h != "" {
return true
}
return false
}
func redactConnectionURI(uri string) string {
u, err := url.Parse(uri)
if err != nil || u.User == nil {
return uri
}
if _, hasPassword := u.User.Password(); !hasPassword {
return uri
}
u.User = url.UserPassword(u.User.Username(), "*****")
return u.String()
}
func defaultCompressors(c Conf) []string {
if len(c.Compressors) > 0 {
return c.Compressors
}
return []string{"zstd", "snappy"}
}