in pulsar/internal/service_uri.go [67:123]
func fromString(uriStr string) (*PulsarServiceURI, error) {
if uriStr == "" || len(uriStr) == 0 {
return nil, errors.New("service uriStr string is null")
}
if strings.Contains(uriStr, "[") && strings.Contains(uriStr, "]") {
// deal with ipv6 address
hosts := strings.FieldsFunc(uriStr, splitURI)
if len(hosts) > 1 {
// deal with ipv6 address
firstHost := hosts[0]
lastHost := hosts[len(hosts)-1]
hasPath := strings.Contains(lastHost, "/")
path := ""
if hasPath {
idx := strings.Index(lastHost, "/")
path = lastHost[idx:]
}
firstHost += path
url, err := url.Parse(firstHost)
if err != nil {
return nil, err
}
serviceURI, err := fromURL(url)
if err != nil {
return nil, err
}
var mHosts []string
var multiHosts []string
mHosts = append(mHosts, serviceURI.ServiceHosts[0])
mHosts = append(mHosts, hosts[1:]...)
for _, v := range mHosts {
h, err := validateHostName(serviceURI.ServiceName, serviceURI.ServiceInfos, v)
if err == nil {
multiHosts = append(multiHosts, h)
} else {
return nil, err
}
}
return &PulsarServiceURI{
serviceURI.ServiceName,
serviceURI.ServiceInfos,
multiHosts,
serviceURI.servicePath,
serviceURI.URL,
}, nil
}
}
url, err := url.Parse(uriStr)
if err != nil {
return nil, err
}
return fromURL(url)
}