Skip to content

Commit 99feb63

Browse files
authored
Fix issue #3989. If an empty filter was specified, GetLifecycleConfiguration was failing. This fix allows an empty filter to be specified when retrieving lifecycle configurations via GetLifecycleConfiguration (#3990)
1 parent 4835f27 commit 99feb63

File tree

5 files changed

+102
-18
lines changed

5 files changed

+102
-18
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": "patch",
6+
"changeLogMessages": [
7+
"Fix issue #3989. If an empty filter was specified, GetLifecycleConfiguration was failing. This fix allows an empty filter to be specified when retrieving lifecycle configurations via GetLifecycleConfiguration."
8+
]
9+
}
10+
]
11+
}

generator/ServiceModels/s3/s3.customizations.json

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -171,14 +171,12 @@
171171
"private LifecycleRuleStatus _status = LifecycleRuleStatus.Disabled;"
172172
]
173173
}
174-
}
175-
],
176-
"predicateListUnmarshallers":[
174+
},
177175
{
178176
"Filter":
179177
{
180-
"predicateListUnmarshallerName": "LifecycleFilterPredicateListUnmarshaller",
181-
"filterPredicateName": "LifecycleFilterPredicate"
178+
"skipContextTestExpressionUnmarshallingLogic" : true,
179+
"injectXmlUnmarshallCode": ["FilterCustomUnmarshall(context, unmarshalledObject);"]
182180
}
183181
}
184182
]
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Globalization;
4+
using System.IO;
5+
using System.Net;
6+
using System.Text;
7+
using System.Xml.Serialization;
8+
9+
using Amazon.S3.Model;
10+
using Amazon.Runtime;
11+
using Amazon.Runtime.Internal;
12+
using Amazon.Runtime.Internal.Transform;
13+
using Amazon.Runtime.Internal.Util;
14+
15+
#pragma warning disable CS0612,CS0618
16+
namespace Amazon.S3.Model.Internal.MarshallTransformations
17+
{
18+
public partial class LifecycleRuleUnmarshaller : IXmlUnmarshaller<LifecycleRule, XmlUnmarshallerContext>
19+
{
20+
private static void FilterCustomUnmarshall(XmlUnmarshallerContext context, LifecycleRule rule)
21+
{
22+
var predicateList = LifecycleFilterPredicateListUnmarshaller.Instance.Unmarshall(context);
23+
24+
if (predicateList.Count == 1)
25+
{
26+
rule.Filter = new LifecycleFilter()
27+
{
28+
LifecycleFilterPredicate = predicateList[0]
29+
};
30+
}
31+
else if (predicateList.Count > 1)
32+
{
33+
var requestId = context.ResponseData.GetHeaderValue("x-amzn-RequestId");
34+
var message = "The Filter element must contain at most one 'Prefix', 'Tag', or 'And' predicate.";
35+
throw new AmazonUnmarshallingException(requestId, context.CurrentPath, context.ResponseBody, message, null);
36+
}
37+
return;
38+
}
39+
}
40+
}

sdk/src/Services/S3/Generated/Model/Internal/MarshallTransformations/LifecycleRuleUnmarshaller.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,7 @@ public LifecycleRule Unmarshall(XmlUnmarshallerContext context)
7070
}
7171
if (context.TestExpression("Filter", targetDepth))
7272
{
73-
var predicateList = LifecycleFilterPredicateListUnmarshaller.Instance.Unmarshall(context);
74-
unmarshalledObject.Filter = new LifecycleFilter();
75-
unmarshalledObject.Filter.LifecycleFilterPredicate = predicateList[0];
73+
FilterCustomUnmarshall(context, unmarshalledObject);
7674
continue;
7775
}
7876
if (context.TestExpression("ID", targetDepth))

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

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,23 @@
1313
* permissions and limitations under the License.
1414
*/
1515

16+
using Amazon;
17+
using Amazon.Runtime;
18+
using Amazon.S3;
19+
using Amazon.S3.Model;
20+
using Amazon.S3.Util;
21+
using AWSSDK_DotNet.IntegrationTests.Tests;
22+
using AWSSDK_DotNet.IntegrationTests.Tests.S3;
23+
using AWSSDK_DotNet.IntegrationTests.Utils;
24+
using Microsoft.VisualStudio.TestTools.UnitTesting;
1625
using System;
1726
using System.Collections.Generic;
27+
using System.Configuration;
1828
using System.Globalization;
1929
using System.IO;
2030
using System.Linq;
2131
using System.Reflection;
2232
using System.Threading;
23-
using Microsoft.VisualStudio.TestTools.UnitTesting;
24-
25-
using Amazon.Runtime;
26-
using Amazon.S3;
27-
using Amazon.S3.Model;
28-
using AWSSDK_DotNet.IntegrationTests.Tests;
29-
using AWSSDK_DotNet.IntegrationTests.Tests.S3;
30-
using Amazon.S3.Util;
31-
using AWSSDK_DotNet.IntegrationTests.Utils;
32-
using Amazon;
3333

3434
namespace S3UnitTest
3535
{
@@ -79,6 +79,43 @@ public void Cleanup()
7979
AmazonS3Util.DeleteS3BucketWithObjects(Client, bucketName);
8080
}
8181

82+
[TestMethod]
83+
[TestCategory("S3")]
84+
public void LifecycleEmptyFilterTest()
85+
{
86+
var s3Configuration = new LifecycleConfiguration
87+
{
88+
Rules = new List<LifecycleRule>
89+
{
90+
new LifecycleRule
91+
{
92+
Id = "Empty-filter-test",
93+
Filter = new LifecycleFilter{},
94+
Expiration = new LifecycleRuleExpiration
95+
{
96+
Days = 30
97+
}
98+
},
99+
}
100+
};
101+
Client.PutLifecycleConfiguration(new PutLifecycleConfigurationRequest
102+
{
103+
BucketName = bucketName,
104+
Configuration = s3Configuration
105+
});
106+
107+
var configuration = S3TestUtils.WaitForConsistency(() =>
108+
{
109+
var res = Client.GetLifecycleConfiguration(bucketName);
110+
return res.Configuration?.Rules?.Count == s3Configuration.Rules.Count ? res.Configuration : null;
111+
});
112+
113+
Assert.AreEqual<string>(configuration.Rules.First().Id, "Empty-filter-test");
114+
Assert.AreEqual<int?>(configuration.Rules.First().Expiration.Days, 30);
115+
}
116+
117+
118+
82119
[TestMethod]
83120
[TestCategory("S3")]
84121
public void LifecycleTest()

0 commit comments

Comments
 (0)