Skip to content

Commit 8202033

Browse files
authored
Fix issue with signature mismatch during retries (#4050)
1 parent becedaf commit 8202033

File tree

4 files changed

+91
-13
lines changed

4 files changed

+91
-13
lines changed

extensions/src/AWSSDK.Extensions.CrtIntegration/CrtAWS4aSigner.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,9 @@ public AwsSigningConfig PrepareCRTSigningConfig(AwsSignatureType signatureType,
346346
Encoding.ASCII.GetBytes(HeaderKeys.XAmznTraceIdHeader),
347347
Encoding.ASCII.GetBytes(HeaderKeys.TransferEncodingHeader),
348348
Encoding.ASCII.GetBytes(HeaderKeys.AmzSdkInvocationId),
349-
Encoding.ASCII.GetBytes(HeaderKeys.AmzSdkRequest)
349+
Encoding.ASCII.GetBytes(HeaderKeys.AmzSdkRequest),
350+
Encoding.ASCII.GetBytes(HeaderKeys.UserAgentHeader),
351+
Encoding.ASCII.GetBytes(HeaderKeys.XAmzUserAgentHeader)
350352
};
351353

352354
/// <summary>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"core": {
3+
"updateMinimum": true,
4+
"type": "patch",
5+
"changeLogMessages": [
6+
"Fix issue with signature mismatch during retries"
7+
]
8+
},
9+
"extensions": [
10+
{
11+
"extensionName": "Extensions.CrtIntegration",
12+
"type": "patch",
13+
"changeLogMessages": [
14+
"Fix issue with signature mismatch during retries"
15+
]
16+
}
17+
]
18+
}

sdk/src/Core/Amazon.Runtime/Internal/Auth/AWS4Signer.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ public class AWS4Signer : AbstractAWSSigner
6464
HeaderKeys.XAmznTraceIdHeader,
6565
HeaderKeys.TransferEncodingHeader,
6666
HeaderKeys.AmzSdkInvocationId,
67-
HeaderKeys.AmzSdkRequest
67+
HeaderKeys.AmzSdkRequest,
68+
HeaderKeys.UserAgentHeader,
69+
HeaderKeys.XAmzUserAgentHeader
6870
};
6971

7072
public AWS4Signer()

sdk/test/Services/S3/IntegrationTests/PutObjectTests.cs

Lines changed: 67 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
using Amazon;
2+
using Amazon.Runtime;
3+
using Amazon.Runtime.Internal.Util;
4+
using Amazon.S3;
5+
using Amazon.S3.Model;
6+
using Amazon.S3.Util;
7+
using Amazon.Util;
8+
using AWSSDK_DotNet.IntegrationTests.Utils;
9+
using Microsoft.VisualStudio.TestTools.UnitTesting;
110
using System;
211
using System.Collections.Generic;
312
using System.IO;
@@ -6,17 +15,6 @@
615
using System.Net;
716
using System.Text;
817
using System.Threading;
9-
using Microsoft.VisualStudio.TestTools.UnitTesting;
10-
11-
using Amazon;
12-
using Amazon.S3;
13-
using Amazon.S3.Model;
14-
using Amazon.S3.Util;
15-
using Amazon.Runtime;
16-
using Amazon.Runtime.Internal.Util;
17-
using AWSSDK_DotNet.IntegrationTests.Utils;
18-
using System.Diagnostics;
19-
using Amazon.Util;
2018
using System.Threading.Tasks;
2119

2220
namespace AWSSDK_DotNet.IntegrationTests.Tests.S3
@@ -1372,6 +1370,64 @@ public void TestResetStreamPosition()
13721370

13731371
}
13741372

1373+
[TestMethod]
1374+
[TestCategory("S3")]
1375+
public async Task ConfirmRetrySignature()
1376+
{
1377+
var config = new AmazonS3Config
1378+
{
1379+
RegionEndpoint = Client.Config.RegionEndpoint,
1380+
ResignRetries = true
1381+
};
1382+
var s3Client = new AmazonS3Client(config);
1383+
// This test is response to this PR https://github.com/aws/aws-sdk-net/pull/4050
1384+
// where retries started failing with signature mismatch due to user agent modifications.
1385+
// In this test we are confirming all retries are attempted and not failing with signature mismatch.
1386+
var stream = new FailOnceStream(new MemoryStream(Encoding.UTF8.GetBytes("ConfirmRetrySignature")));
1387+
PutObjectRequest request = new PutObjectRequest()
1388+
{
1389+
BucketName = bucketName,
1390+
Key = "thestream",
1391+
InputStream = stream,
1392+
AutoCloseStream = false,
1393+
DisablePayloadSigning = true
1394+
};
1395+
1396+
((Amazon.Runtime.Internal.IAmazonWebServiceRequest)request).UserAgentDetails.AddUserAgentComponent("Modifications");
1397+
1398+
await Client.PutObjectAsync(request);
1399+
}
1400+
1401+
private class FailOnceStream : WrapperStream
1402+
{
1403+
public FailOnceStream(MemoryStream memoryStream)
1404+
: base(memoryStream)
1405+
{
1406+
}
1407+
1408+
bool _firstRead = true;
1409+
1410+
1411+
public override int Read(byte[] buffer, int offset, int count)
1412+
{
1413+
if (_firstRead)
1414+
{
1415+
_firstRead = false;
1416+
throw new IOException("Fake Exception");
1417+
}
1418+
return base.Read(buffer, offset, count);
1419+
}
1420+
public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
1421+
{
1422+
if (_firstRead)
1423+
{
1424+
_firstRead = false;
1425+
throw new IOException("Fake Exception");
1426+
}
1427+
return base.ReadAsync(buffer, offset, count, cancellationToken);
1428+
}
1429+
}
1430+
13751431
private class ErrorStream : WrapperStream
13761432
{
13771433
private ErrorStream(Stream stream)

0 commit comments

Comments
 (0)