Files
netbird/relay/server/url.go
Zoltan Papp d2e48d4f5e [relay] Use instanceURL instead of Exposed address. (#4905)
Replaces string-based exposed address handling with URL-based InstanceURL() (type url.URL) across relay/server and relay/healthcheck; adds SchemeREL/SchemeRELS constants; updates getInstanceURL to return *url.URL with scheme and TLS validation; adjusts WS dialing and health-check logic to use URL fields.
2025-12-03 18:42:53 +01:00

44 lines
1.1 KiB
Go

package server
import (
"fmt"
"net/url"
"strings"
)
const (
SchemeREL = "rel"
SchemeRELS = "rels"
)
// getInstanceURL checks if user supplied a URL scheme otherwise adds to the
// provided address according to TLS definition and parses the address before returning it
func getInstanceURL(exposedAddress string, tlsSupported bool) (*url.URL, error) {
addr := exposedAddress
split := strings.Split(exposedAddress, "://")
switch {
case len(split) == 1 && tlsSupported:
addr = "rels://" + exposedAddress
case len(split) == 1 && !tlsSupported:
addr = "rel://" + exposedAddress
case len(split) > 2:
return nil, fmt.Errorf("invalid exposed address: %s", exposedAddress)
}
parsedURL, err := url.ParseRequestURI(addr)
if err != nil {
return nil, fmt.Errorf("invalid exposed address: %v", err)
}
if parsedURL.Scheme != SchemeREL && parsedURL.Scheme != SchemeRELS {
return nil, fmt.Errorf("invalid scheme: %s", parsedURL.Scheme)
}
// Validate scheme matches TLS configuration
if tlsSupported && parsedURL.Scheme == SchemeREL {
return nil, fmt.Errorf("non-TLS scheme '%s' provided but TLS is supported", SchemeREL)
}
return parsedURL, nil
}