diff --git a/sdk/src/Core/Amazon.Util/AWSSDKUtils.cs b/sdk/src/Core/Amazon.Util/AWSSDKUtils.cs index 9e45563d1ee6..9b9f2a137d91 100644 --- a/sdk/src/Core/Amazon.Util/AWSSDKUtils.cs +++ b/sdk/src/Core/Amazon.Util/AWSSDKUtils.cs @@ -668,33 +668,32 @@ public static string DetermineRegion(string url) /// public static string DetermineService(string url) { - int delimIndex = url.IndexOf("//", StringComparison.Ordinal); - if (delimIndex >= 0) - url = url.Substring(delimIndex + 2); + var urlSpan = url.AsSpan(); - string[] urlParts = url.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries); - if (urlParts == null || urlParts.Length == 0) - return string.Empty; + var doubleSlashIndex = urlSpan.IndexOf(DoubleSlash, StringComparison.Ordinal); + if (doubleSlashIndex >= 0) + urlSpan = urlSpan.Slice(doubleSlashIndex + 2); - string servicePart = urlParts[0]; - int hyphenated = servicePart.IndexOf('-'); - string service; - if (hyphenated < 0) - { service = servicePart; } - else - { service = servicePart.Substring(0, hyphenated); } + var dotIndex = urlSpan.IndexOf('.'); - // Check for SQS : return "sqs" incase service is determined to be "queue" as per the URL. - if (service.Equals("queue")) - { - return "sqs"; - } - else + if (dotIndex < 0) + return string.Empty; + + var servicePartSpan = urlSpan.Slice(0, dotIndex); + var hyphenIndex = servicePartSpan.IndexOf('-'); + if (hyphenIndex > 0) { - return service; + servicePartSpan = servicePartSpan.Slice(0, hyphenIndex); } + + // Check for SQS : return "sqs" in case service is determined to be "queue" as per the URL. + return servicePartSpan.Equals(Queue, StringComparison.OrdinalIgnoreCase) ? "sqs" : servicePartSpan.ToString(); } + // Compiler trick to directly refer to static data in the assembly + private static ReadOnlySpan DoubleSlash => new[] { '/', '/' }; + private static ReadOnlySpan Queue => new[] { 'q', 'u', 'e', 'u', 'e' }; + /// /// Utility method for converting Unix epoch seconds to DateTime structure. /// diff --git a/sdk/test/NetStandard/UnitTests/Core/AWSSDKUtilsTests.cs b/sdk/test/NetStandard/UnitTests/Core/AWSSDKUtilsTests.cs index 1513b21f6920..bc67bc647c54 100644 --- a/sdk/test/NetStandard/UnitTests/Core/AWSSDKUtilsTests.cs +++ b/sdk/test/NetStandard/UnitTests/Core/AWSSDKUtilsTests.cs @@ -32,5 +32,18 @@ public void CompressSpaces() var compressed = AWSSDKUtils.CompressSpaces(data); Assert.Equal("Hello, World!", compressed); } + + [Theory] + [InlineData("https://s3.amazonaws.com", "s3")] + [InlineData("sqs.us-west-2.amazonaws.com", "sqs")] + [InlineData("queue.amazonaws.com", "sqs")] + [InlineData("https://sns.us-west-2.amazonaws.com", "sns")] + [InlineData("https://s3-external-1.amazonaws.com", "s3")] + public void DetermineService(string url, string expectedService) + { + var service = AWSSDKUtils.DetermineService(url); + + Assert.Equal(expectedService, service); + } } }