internal static ParsedConnectionString Parse()

in src/Microsoft.Azure.SignalR.Common/Utilities/ConnectionStringParser.cs [78:153]


    internal static ParsedConnectionString Parse(string connectionString)
    {
        var dict = ToDictionary(connectionString);

        // parse and validate endpoint.
        if (!dict.TryGetValue(EndpointProperty, out var endpoint))
        {
            throw new ArgumentException(MissingEndpointProperty, nameof(connectionString));
        }
        endpoint = endpoint.TrimEnd('/');

        if (!TryCreateEndpointUri(endpoint, out var endpointUri))
        {
            throw new ArgumentException(InvalidEndpointProperty, nameof(connectionString));
        }
        var builder = new UriBuilder(endpointUri!);

        // parse and validate version.
        if (dict.TryGetValue(VersionProperty, out var version))
        {
            if (!Regex.IsMatch(version, ValidVersionRegex))
            {
                throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, InvalidVersionValueFormat, version), nameof(connectionString));
            }
        }

        // parse and validate port.
        if (dict.TryGetValue(PortProperty, out var s))
        {
            builder.Port = int.TryParse(s, out var port) && port > 0 && port <= 0xFFFF
                ? port
                : throw new ArgumentException(InvalidPortValue, nameof(connectionString));
        }

        Uri? clientEndpointUri = null;
        Uri? serverEndpointUri = null;

        // parse and validate clientEndpoint.
        if (dict.TryGetValue(ClientEndpointProperty, out var clientEndpoint))
        {
            if (!TryCreateEndpointUri(clientEndpoint, out clientEndpointUri))
            {
                throw new ArgumentException(InvalidClientEndpointProperty, nameof(connectionString));
            }
        }

        // parse and validate clientEndpoint.
        if (dict.TryGetValue(ServerEndpointProperty, out var serverEndpoint))
        {
            if (!TryCreateEndpointUri(serverEndpoint, out serverEndpointUri))
            {
                throw new ArgumentException(InvalidServerEndpointProperty, nameof(connectionString));
            }
        }

        // try building accesskey.
        dict.TryGetValue(AuthTypeProperty, out var type);
        var tokenCredential = type?.ToLower() switch
        {
            TypeAzureApp => BuildApplicationCredential(dict),
            TypeAzureMsi => BuildManagedIdentityCredential(dict),
#pragma warning disable CS0612 // Type or member is obsolete
            TypeAzureAD => BuildAzureTokenCredential(dict),
#pragma warning restore CS0612 // Type or member is obsolete
            _ => new DefaultAzureCredential(),
        };

        dict.TryGetValue(AccessKeyProperty, out var accessKey);

        return new ParsedConnectionString(builder.Uri, tokenCredential)
        {
            AccessKey = accessKey,
            ClientEndpoint = clientEndpointUri,
            ServerEndpoint = serverEndpointUri
        };
    }