Skip to content

Commit a474ec3

Browse files
Prevent duplicate entries in User Agent custom components
1 parent 3633a3f commit a474ec3

File tree

3 files changed

+52
-6
lines changed

3 files changed

+52
-6
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"core": {
3+
"changeLogMessages": [
4+
"Prevent duplicate entries in User Agent custom components"
5+
],
6+
"type": "patch",
7+
"updateMinimum": true
8+
}
9+
}

sdk/src/Core/Amazon.Runtime/Internal/UserAgent/UserAgentDetails.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class UserAgentDetails
2727
{
2828
private const int MaxSizeBytes = 1024; // 1 KB size limit
2929
private readonly HashSet<string> _trackedFeatureIds = new HashSet<string>();
30-
private readonly StringBuilder _userAgentBuilder = new StringBuilder();
30+
private readonly HashSet<string> _userAgentCustomComponents = new HashSet<string>();
3131

3232
/// <summary>
3333
/// Gets the list of tracked feature IDs.
@@ -40,9 +40,9 @@ public class UserAgentDetails
4040
/// <param name="component">The user-agent component to append.</param>
4141
public void AddUserAgentComponent(string component)
4242
{
43-
if (!string.IsNullOrEmpty(component))
43+
if (!string.IsNullOrWhiteSpace(component))
4444
{
45-
_userAgentBuilder.Append(' ').Append(component);
45+
_userAgentCustomComponents.Add(component.Trim());
4646
}
4747
}
4848

@@ -62,7 +62,7 @@ public void AddFeature(UserAgentFeatureId featureId)
6262
/// </summary>
6363
public string GetCustomUserAgentComponents()
6464
{
65-
return _userAgentBuilder.ToString().Trim();
65+
return string.Join(" ", _userAgentCustomComponents);
6666
}
6767

6868
/// <summary>
@@ -74,9 +74,9 @@ public string GenerateUserAgentWithMetrics()
7474
var metricsUserAgent = GenerateMetricsUserAgent();
7575
if (!string.IsNullOrEmpty(metricsUserAgent))
7676
{
77-
return $"{_userAgentBuilder.ToString().Trim()} {metricsUserAgent}";
77+
return $"{string.Join(" ", _userAgentCustomComponents)} {metricsUserAgent}";
7878
}
79-
return _userAgentBuilder.ToString().Trim();
79+
return string.Join(" ", _userAgentCustomComponents);
8080
}
8181

8282
/// <summary>

sdk/test/UnitTests/Custom/Runtime/UserAgentTests.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,43 @@ public void Test_AddsCustomUserAgentAddition()
232232
Assert.IsTrue(userAgentParts.Contains(userAgentAddition));
233233
}
234234

235+
[TestMethod]
236+
public void Test_AddsCustomUserAgentAddition_SkipDuplicates()
237+
{
238+
var userAgentAddition = "custom-feature/1.0";
239+
var userAgentAddition2 = "custom-feature/2.0";
240+
241+
var putObjectRequest = new PutObjectRequest
242+
{
243+
BucketName = "test-bucket",
244+
Key = "test-key",
245+
ContentBody = "test-content",
246+
};
247+
248+
var userAgentDetails = ((IAmazonWebServiceRequest)putObjectRequest).UserAgentDetails;
249+
250+
userAgentDetails.AddUserAgentComponent(userAgentAddition);
251+
userAgentDetails.AddUserAgentComponent(userAgentAddition);
252+
253+
userAgentDetails.AddUserAgentComponent(userAgentAddition2);
254+
userAgentDetails.AddUserAgentComponent(userAgentAddition2);
255+
userAgentDetails.AddUserAgentComponent(userAgentAddition2);
256+
257+
var config = new AmazonS3Config();
258+
var request = RunMockRequest(putObjectRequest, config, new PutObjectRequestMarshaller(), new PutObjectResponseUnmarshaller());
259+
260+
request.Headers.TryGetValue(HeaderKeys.UserAgentHeader, out string userAgentHeader);
261+
Assert.IsNotNull(userAgentHeader);
262+
263+
var userAgentParts = userAgentHeader.Split(' ');
264+
265+
Assert.IsTrue(userAgentParts.Contains(userAgentAddition));
266+
Assert.AreEqual(1, userAgentParts.Count(e => e == userAgentAddition));
267+
268+
Assert.IsTrue(userAgentParts.Contains(userAgentAddition2));
269+
Assert.AreEqual(1, userAgentParts.Count(e => e == userAgentAddition2));
270+
}
271+
235272
[TestMethod]
236273
public void ObservabilityFeatureIds_NoInUserAgentByDefault()
237274
{

0 commit comments

Comments
 (0)