Skip to content

Commit a9ea719

Browse files
Transfer MPU Validations, Part Size Updates, and passing all request fields to low level request (#4096)
* Increase multipart upload default part size to 8MB (#4032) * Update Generator to add s3 project to give unit test access * Add missing fields to Transfer Utility request objects (#4056) * Remove response related tests * Fix issue with HeadersCollection in ResponseMapperTests * Add additional validation to UploadPartRequests in Transfer Utility (#4083) * create tuabortmultipartuploadrequest (#4093) --------- Co-authored-by: Philippe El Asmar <[email protected]> Co-authored-by: Phil Asmar <[email protected]>
1 parent 0847c8f commit a9ea719

35 files changed

+2577
-690
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"services": [
3+
{
4+
"serviceName": "S3",
5+
"type": "minor",
6+
"changeLogMessages": [
7+
"Increasing the default part size for S3 multipart upload from 5MB to 8MB when no part size is specified. This will reduce the number of API calls for multipart uploads."
8+
]
9+
}
10+
]
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"services": [
3+
{
4+
"serviceName": "S3",
5+
"type": "patch",
6+
"changeLogMessages": [
7+
"Update AssemblyInfo to give S3 Unit Test project access to internals."
8+
]
9+
}
10+
]
11+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"services": [
3+
{
4+
"serviceName": "S3",
5+
"type": "patch",
6+
"changeLogMessages": [
7+
"Fixed issue where PartSize and IsLastPart fields were not properly set on Transfer Utility Upload Part Request.",
8+
"Add additional validations for Transfer Utility requests to ensure Upload Parts have the proper Content Length and File Offsets."
9+
]
10+
}
11+
]
12+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"services": [
3+
{
4+
"serviceName": "S3",
5+
"type": "patch",
6+
"changeLogMessages": [
7+
"Create AbortMultipartUploads api that takes in TransferUtilityAbortMultipartUploadRequest."
8+
]
9+
}
10+
]
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"services": [
3+
{
4+
"serviceName": "S3",
5+
"type": "patch",
6+
"changeLogMessages": [
7+
"Add missing fields to Transfer Utility request objects. ContentType on TransferUtilityUploadRequest and TransferUtilityUploadDirectoryRequest now directly updates the ContentType header, instead of being a separate field on those objects."
8+
]
9+
}
10+
]
11+
}

generator/ServiceClientGeneratorLib/Generators/SourceFiles/AssemblyInfo.cs

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace ServiceClientGenerator.Generators.SourceFiles
1515
/// Class to produce the template output
1616
/// </summary>
1717

18-
#line 1 "C:\codebase\v4\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
18+
#line 1 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
1919
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")]
2020
public partial class AssemblyInfo : BaseGenerator
2121
{
@@ -36,43 +36,43 @@ public override string TransformText()
3636
// associated with an assembly.
3737
[assembly: AssemblyTitle(""");
3838

39-
#line 12 "C:\codebase\v4\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
39+
#line 12 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
4040
this.Write(this.ToStringHelper.ToStringWithCulture(this.Config.AssemblyTitle));
4141

4242
#line default
4343
#line hidden
4444
this.Write("\")]\r\n#if BCL\r\n[assembly: AssemblyDescription(\"");
4545

46-
#line 14 "C:\codebase\v4\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
46+
#line 14 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
4747
this.Write(this.ToStringHelper.ToStringWithCulture(this.Config.AssemblyDescription(versionIdentifier: "4.7.2")));
4848

4949
#line default
5050
#line hidden
5151
this.Write("\")]\r\n#elif NETSTANDARD20\r\n[assembly: AssemblyDescription(\"");
5252

53-
#line 16 "C:\codebase\v4\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
53+
#line 16 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
5454
this.Write(this.ToStringHelper.ToStringWithCulture(this.Config.AssemblyDescription(versionIdentifier: "NetStandard 2.0")));
5555

5656
#line default
5757
#line hidden
5858
this.Write("\")]\r\n#elif NETCOREAPP3_1\r\n[assembly: AssemblyDescription(\"");
5959

60-
#line 18 "C:\codebase\v4\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
60+
#line 18 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
6161
this.Write(this.ToStringHelper.ToStringWithCulture(this.Config.AssemblyDescription(versionIdentifier: ".NET Core 3.1")));
6262

6363
#line default
6464
#line hidden
6565
this.Write("\")]\r\n#elif NET8_0\r\n[assembly: AssemblyDescription(\"");
6666

67-
#line 20 "C:\codebase\v4\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
67+
#line 20 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
6868
this.Write(this.ToStringHelper.ToStringWithCulture(this.Config.AssemblyDescription(versionIdentifier: ".NET 8.0")));
6969

7070
#line default
7171
#line hidden
7272
this.Write("\")]\r\n#else\r\n#error Unknown platform constant - unable to set correct AssemblyDesc" +
7373
"ription\r\n#endif\r\n\r\n");
7474

75-
#line 25 "C:\codebase\v4\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
75+
#line 25 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
7676
if (this.Config.AssemblyTitle=="AWSSDK.DynamoDBv2") {
7777

7878
#line default
@@ -81,7 +81,22 @@ public override string TransformText()
8181
[assembly: InternalsVisibleTo(""AWSSDK.UnitTests.NetFramework, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4"")]
8282
");
8383

84-
#line 28 "C:\codebase\v4\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
84+
#line 28 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
85+
}
86+
87+
#line default
88+
#line hidden
89+
90+
#line 29 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
91+
if (this.Config.AssemblyTitle=="AWSSDK.S3") {
92+
93+
#line default
94+
#line hidden
95+
this.Write(@"[assembly: InternalsVisibleTo(""AWSSDK.UnitTests.S3.NetFramework, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4"")]
96+
[assembly: InternalsVisibleTo(""AWSSDK.UnitTests.NetFramework, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4"")]
97+
");
98+
99+
#line 32 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
85100
}
86101

87102
#line default
@@ -110,14 +125,14 @@ public override string TransformText()
110125
// [assembly: AssemblyVersion(""1.0.*"")]
111126
[assembly: AssemblyVersion(""");
112127

113-
#line 51 "C:\codebase\v4\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
128+
#line 55 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
114129
this.Write(this.ToStringHelper.ToStringWithCulture(this.Config.ServiceVersion));
115130

116131
#line default
117132
#line hidden
118133
this.Write("\")]\r\n[assembly: AssemblyFileVersion(\"");
119134

120-
#line 52 "C:\codebase\v4\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
135+
#line 56 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
121136
this.Write(this.ToStringHelper.ToStringWithCulture(this.Config.ServiceFileVersion));
122137

123138
#line default

generator/ServiceClientGeneratorLib/Generators/SourceFiles/AssemblyInfo.tt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ using System.Runtime.CompilerServices;
2626
[assembly: InternalsVisibleTo("AWSSDK.UnitTests.DynamoDBv2.NetFramework, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4")]
2727
[assembly: InternalsVisibleTo("AWSSDK.UnitTests.NetFramework, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4")]
2828
<# } #>
29+
<# if (this.Config.AssemblyTitle=="AWSSDK.S3") { #>
30+
[assembly: InternalsVisibleTo("AWSSDK.UnitTests.S3.NetFramework, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4")]
31+
[assembly: InternalsVisibleTo("AWSSDK.UnitTests.NetFramework, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4")]
32+
<# } #>
2933
[assembly: AssemblyConfiguration("")]
3034
[assembly: AssemblyProduct("Amazon Web Services SDK for .NET")]
3135
[assembly: AssemblyCompany("Amazon.com, Inc")]

generator/ServiceModels/_manifest.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@
6060
"Custom\\Runtime\\TestResponses\\*.txt",
6161
"Custom\\Runtime\\EventStreams\\test_vectors\\*",
6262
"Custom\\Runtime\\TestEndpoints\\*.json",
63-
"Custom\\TestTools\\ComparerTest.json"
63+
"Custom\\TestTools\\ComparerTest.json",
64+
"..\\Services\\S3\\UnitTests\\Custom\\EmbeddedResource\\*"
6465
],
6566
"packageReferences": [
6667
{

sdk/src/Services/S3/Custom/Model/HeadersCollection.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,21 @@ internal bool IsSetContentType()
152152
return !string.IsNullOrEmpty(this.ContentType);
153153
}
154154

155+
/// <summary>
156+
/// The language that the content is in. For more information,
157+
/// see <a href="https://www.rfc-editor.org/rfc/rfc9110.html#name-content-language">https://www.rfc-editor.org/rfc/rfc9110.html#name-content-language</a>.
158+
/// </summary>
159+
public string ContentLanguage
160+
{
161+
get { return this["Content-Language"]; }
162+
set { this["Content-Language"] = value; }
163+
}
164+
165+
internal bool IsSetContentLanguage()
166+
{
167+
return !string.IsNullOrEmpty(this.ContentLanguage);
168+
}
169+
155170
/// <summary>
156171
/// <para>
157172
/// The date and time at which the object is no longer cacheable. For more information,

sdk/src/Services/S3/Custom/Transfer/BaseDownloadRequest.cs

Lines changed: 113 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
using System.Text;
2525

2626
using Amazon.Runtime.Internal;
27+
using Amazon.S3.Model;
2728

2829
namespace Amazon.S3.Transfer
2930
{
@@ -45,6 +46,11 @@ public abstract class BaseDownloadRequest
4546

4647
private RequestPayer requestPayer;
4748

49+
private string expectedBucketOwner;
50+
private string ifMatch;
51+
private string ifNoneMatch;
52+
private ResponseHeaderOverrides responseHeaders;
53+
4854
/// <summary>
4955
/// Gets or sets the name of the bucket.
5056
/// </summary>
@@ -66,7 +72,7 @@ public string BucketName
6672
/// </returns>
6773
internal bool IsSetBucketName()
6874
{
69-
return !System.String.IsNullOrEmpty(this.bucketName);
75+
return !String.IsNullOrEmpty(this.bucketName);
7076
}
7177

7278

@@ -91,7 +97,7 @@ public string Key
9197
/// </returns>
9298
internal bool IsSetKey()
9399
{
94-
return !System.String.IsNullOrEmpty(this.key);
100+
return !String.IsNullOrEmpty(this.key);
95101
}
96102

97103
/// <summary>
@@ -112,7 +118,7 @@ public string VersionId
112118
/// <returns>true if VersionId property is set.</returns>
113119
internal bool IsSetVersionId()
114120
{
115-
return !System.String.IsNullOrEmpty(this.versionId);
121+
return !String.IsNullOrEmpty(this.versionId);
116122
}
117123

118124
/// <summary>
@@ -220,5 +226,109 @@ public RequestPayer RequestPayer
220226
get { return this.requestPayer; }
221227
set { this.requestPayer = value; }
222228
}
229+
230+
/// <summary>
231+
/// Gets and sets the property ExpectedBucketOwner.
232+
/// <para>
233+
/// The account ID of the expected bucket owner. If the account ID that you provide does
234+
/// not match the actual owner of the bucket, the request fails with the HTTP status code
235+
/// <c>403 Forbidden</c> (access denied).
236+
/// </para>
237+
/// </summary>
238+
public string ExpectedBucketOwner
239+
{
240+
get { return this.expectedBucketOwner; }
241+
set { this.expectedBucketOwner = value; }
242+
}
243+
244+
/// <summary>
245+
/// Checks to see if ExpectedBucketOwner is set.
246+
/// </summary>
247+
/// <returns>true, if ExpectedBucketOwner property is set.</returns>
248+
internal bool IsSetExpectedBucketOwner()
249+
{
250+
return !String.IsNullOrEmpty(this.expectedBucketOwner);
251+
}
252+
253+
/// <summary>
254+
/// Gets and sets the property IfMatch.
255+
/// <para>
256+
/// Return the object only if its entity tag (ETag) is the same as the one specified in this header;
257+
/// otherwise, return a <c>412 Precondition Failed</c> error.
258+
/// </para>
259+
/// <para>
260+
/// If both of the <c>If-Match</c> and <c>If-Unmodified-Since</c> headers are present in the request as follows:
261+
/// <c>If-Match</c> condition evaluates to <c>true</c>, and; <c>If-Unmodified-Since</c> condition evaluates to <c>false</c>;
262+
/// then, S3 returns <c>200 OK</c> and the data requested.
263+
/// </para>
264+
/// <para>
265+
/// For more information about conditional requests, see <see href="https://tools.ietf.org/html/rfc7232">RFC 7232</see>.
266+
/// </para>
267+
/// The <see cref="IfMatch"/> property is equivalent to the <see cref="GetObjectRequest.EtagToMatch"/>.
268+
/// </summary>
269+
public string IfMatch
270+
{
271+
get { return this.ifMatch; }
272+
set { this.ifMatch = value; }
273+
}
274+
275+
/// <summary>
276+
/// Checks to see if IfMatch is set.
277+
/// </summary>
278+
/// <returns>true, if IfMatch property is set.</returns>
279+
internal bool IsSetIfMatch()
280+
{
281+
return !String.IsNullOrEmpty(this.ifMatch);
282+
}
283+
284+
/// <summary>
285+
/// Gets and sets the property IfNoneMatch.
286+
/// <para>
287+
/// Return the object only if its entity tag (ETag) is different from the one specified in this header;
288+
/// otherwise, return a <c>304 Not Modified</c> error.
289+
/// </para>
290+
/// <para>
291+
/// If both of the <c>If-None-Match</c> and <c>If-Modified-Since</c> headers are present in the request as follows:
292+
/// <c> If-None-Match</c> condition evaluates to <c>false</c>, and; <c>If-Modified-Since</c> condition evaluates to <c>true</c>;
293+
/// then, S3 returns <c>304 Not Modified</c> HTTP status code.
294+
/// </para>
295+
/// <para>
296+
/// For more information about conditional requests, see <see href="https://tools.ietf.org/html/rfc7232">RFC 7232</see>.
297+
/// </para>
298+
/// The <see cref="IfNoneMatch"/> property is equivalent to the <see cref="GetObjectRequest.EtagToNotMatch"/>.
299+
/// </summary>
300+
public string IfNoneMatch
301+
{
302+
get { return this.ifNoneMatch; }
303+
set { this.ifNoneMatch = value; }
304+
}
305+
306+
/// <summary>
307+
/// Checks to see if IfNoneMatch is set.
308+
/// </summary>
309+
/// <returns>true, if IfNoneMatch property is set.</returns>
310+
internal bool IsSetIfNoneMatch()
311+
{
312+
return !String.IsNullOrEmpty(this.ifNoneMatch);
313+
}
314+
315+
/// <summary>
316+
/// A set of response headers that should be returned with the object.
317+
/// </summary>
318+
public ResponseHeaderOverrides ResponseHeaderOverrides
319+
{
320+
get
321+
{
322+
if (this.responseHeaders == null)
323+
{
324+
this.responseHeaders = new ResponseHeaderOverrides();
325+
}
326+
return this.responseHeaders;
327+
}
328+
set
329+
{
330+
this.responseHeaders = value;
331+
}
332+
}
223333
}
224334
}

0 commit comments

Comments
 (0)