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