Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions generator/.DevConfigs/19ed68ce-9f46-4e1e-a0ff-45a2b3641947.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"services": [
{
"serviceName": "S3",
"type": "patch",
"changeLogMessages": [
"Fix signature calculation error when using the Content-Language header in S3 requests (e.g., PutObjectRequest)"
]
}
]
}
3 changes: 2 additions & 1 deletion generator/ServiceModels/s3/s3.customizations.json
Original file line number Diff line number Diff line change
Expand Up @@ -693,7 +693,8 @@
"SSECustomerAlgorithm",
"ServerSideEncryption",
"Expires",
"Restore"
"Restore",
"ContentLanguage"
],
"excludeFromUnmarshalling" : [
"Expiration"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,7 @@ public class HttpWebRequestMessage : IHttpRequest<HttpContent>
HeaderKeys.ContentRangeHeader,
HeaderKeys.ContentMD5Header,
HeaderKeys.ContentEncodingHeader,
HeaderKeys.ContentLanguageHeader,
HeaderKeys.ContentDispositionHeader,
HeaderKeys.Expires
};
Expand Down Expand Up @@ -731,6 +732,10 @@ private void WriteContentHeaders(IDictionary<string, string> contentHeaders)
_request.Content.Headers.TryAddWithoutValidation(HeaderKeys.ContentEncodingHeader,
contentEncodingHeader);

if (contentHeaders.TryGetValue(HeaderKeys.ContentLanguageHeader, out var contentLanguageHeader))
_request.Content.Headers.TryAddWithoutValidation(HeaderKeys.ContentLanguageHeader,
contentLanguageHeader);

if (contentHeaders.TryGetValue(HeaderKeys.ContentDispositionHeader, out var contentDispositionHeader))
_request.Content.Headers.TryAddWithoutValidation(HeaderKeys.ContentDispositionHeader,
contentDispositionHeader);
Expand Down
1 change: 1 addition & 0 deletions sdk/src/Core/Amazon.Util/HeaderKeys.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public abstract class HeaderKeys
public const string ContentMD5Header = "Content-MD5";
public const string ContentEncodingHeader = "Content-Encoding";
public const string ContentDispositionHeader = "Content-Disposition";
public const string ContentLanguageHeader = "Content-Language";
public const string ETagHeader = "ETag";
public const string Expires = "Expires";
public const string AuthorizationHeader = "Authorization";
Expand Down
19 changes: 18 additions & 1 deletion sdk/src/Services/S3/Custom/Model/GetObjectMetadataResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,24 @@ public MetadataCollection Metadata
}
}

/// <summary>
/// Gets and sets the property ContentLanguage.
/// <para>
/// The language the content is in.
/// </para>
/// </summary>
public string ContentLanguage
{
get { return this.Headers.ContentLanguage; }
set { this.Headers.ContentLanguage = value; }
}

// Check to see if ContentLanguage property is set
internal bool IsSetContentLanguage()
{
return this.Headers.ContentLanguage != null;
}

/// <summary>
/// Gets and sets the property DeleteMarker.
/// <para>
Expand Down Expand Up @@ -182,4 +200,3 @@ internal bool IsSetServerSideEncryptionCustomerMethod()
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ partial void PostUnmarshallCustomization(XmlUnmarshallerContext context, GetObje
response.Headers.ContentDisposition = S3Transforms.ToString(responseData.GetHeaderValue("Content-Disposition"));
if (responseData.IsHeaderPresent("Content-Encoding"))
response.Headers.ContentEncoding = S3Transforms.ToString(responseData.GetHeaderValue("Content-Encoding"));
if (responseData.IsHeaderPresent("Content-Language"))
response.Headers.ContentLanguage = S3Transforms.ToString(responseData.GetHeaderValue("Content-Language"));
if (responseData.IsHeaderPresent("Content-Length"))
response.Headers.ContentLength = long.Parse(responseData.GetHeaderValue("Content-Length"), CultureInfo.InvariantCulture);
if (responseData.IsHeaderPresent("Content-Type"))
Expand All @@ -74,4 +76,3 @@ partial void PostUnmarshallCustomization(XmlUnmarshallerContext context, GetObje
}
}
}

19 changes: 0 additions & 19 deletions sdk/src/Services/S3/Generated/Model/GetObjectMetadataResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ public partial class GetObjectMetadataResponse : AmazonWebServiceResponse
private ChecksumType _checksumType;
private string _contentDisposition;
private string _contentEncoding;
private string _contentLanguage;
private string _contentRange;
private string _contentType;
private string _eTag;
Expand Down Expand Up @@ -320,24 +319,6 @@ internal bool IsSetContentEncoding()
return this._contentEncoding != null;
}

/// <summary>
/// Gets and sets the property ContentLanguage.
/// <para>
/// The language the content is in.
/// </para>
/// </summary>
public string ContentLanguage
{
get { return this._contentLanguage; }
set { this._contentLanguage = value; }
}

// Check to see if ContentLanguage property is set
internal bool IsSetContentLanguage()
{
return this._contentLanguage != null;
}

/// <summary>
/// Gets and sets the property ContentRange.
/// <para>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,6 @@ public override AmazonWebServiceResponse Unmarshall(XmlUnmarshallerContext conte
response.ContentDisposition = context.ResponseData.GetHeaderValue("Content-Disposition");
if (context.ResponseData.IsHeaderPresent("Content-Encoding"))
response.ContentEncoding = context.ResponseData.GetHeaderValue("Content-Encoding");
if (context.ResponseData.IsHeaderPresent("Content-Language"))
response.ContentLanguage = context.ResponseData.GetHeaderValue("Content-Language");
if (context.ResponseData.IsHeaderPresent("Content-Length"))
response.ContentLength = long.Parse(context.ResponseData.GetHeaderValue("Content-Length"), CultureInfo.InvariantCulture);
if (context.ResponseData.IsHeaderPresent("Content-Range"))
Expand Down
35 changes: 34 additions & 1 deletion sdk/test/Services/S3/IntegrationTests/PutObjectTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -628,6 +628,39 @@ public void PutObjectWithContentEncodingTests()
PutObjectWithoutContentEncoding();
}

[TestMethod]
[TestCategory("S3")]
public void TestPutObjectWithContentLanguage()
{
var key = "contentLanguageTest" + random.Next();
var contentLanguage = "en-US";

var request = new PutObjectRequest
{
BucketName = bucketName,
Key = key,
ContentBody = testContent
};
request.Headers.ContentLanguage = contentLanguage;

// Put the object
var putResponse = Client.PutObject(request);
Assert.IsTrue(putResponse.ETag.Length > 0);

// Verify via GetObject
using (var getResponse = Client.GetObject(bucketName, key))
{
Assert.AreEqual(contentLanguage, getResponse.Headers.ContentLanguage);
Assert.AreEqual(contentLanguage, getResponse.ContentLanguage);

}

// Verify via GetObjectMetadata
var metadata = Client.GetObjectMetadata(bucketName, key);
Assert.AreEqual(contentLanguage, metadata.Headers.ContentLanguage);
Assert.AreEqual(contentLanguage, metadata.ContentLanguage);
}

private void PutObjectWithContentEncoding()
{
var request = CreatePutObjectRequest();
Expand Down Expand Up @@ -1538,4 +1571,4 @@ public override bool CanSeek
}
}
}
}
}