func fromString()

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)
}