diff --git a/Minio.Tests/UtilsTest.cs b/Minio.Tests/UtilsTest.cs index c03a0da87..643d6435b 100644 --- a/Minio.Tests/UtilsTest.cs +++ b/Minio.Tests/UtilsTest.cs @@ -18,6 +18,7 @@ using System.Xml.Serialization; using Microsoft.VisualStudio.TestTools.UnitTesting; using Minio.DataModel; +using Minio.DataModel.Result; using Minio.Exceptions; using Minio.Helper; @@ -235,4 +236,22 @@ public void TestisValidEndpoint() Assert.IsTrue(RequestUtil.IsValidEndpoint("A.domain.com")); Assert.IsTrue(RequestUtil.IsValidEndpoint("A.domain1.com")); } + + [TestMethod] + public void TestXmlResultWithoutNamespace() + { + var xml = """ + + + + 2022-10-29T15:34:41.626Z + + + "ead3fcd881dee32547f1b6ca1fc29463" + + + """; + var result = Utils.DeserializeXml(xml); + Assert.IsNotNull(result); + } } diff --git a/Minio/Helper/AmazonAwsS3XmlReader.cs b/Minio/Helper/AmazonAwsS3XmlReader.cs index 7ddafe913..ef7f63c27 100644 --- a/Minio/Helper/AmazonAwsS3XmlReader.cs +++ b/Minio/Helper/AmazonAwsS3XmlReader.cs @@ -24,5 +24,9 @@ public AmazonAwsS3XmlReader(Stream stream) : base(stream) { } + public AmazonAwsS3XmlReader(TextReader textReader) : base(textReader) + { + } + public override string NamespaceURI => "http://s3.amazonaws.com/doc/2006-03-01/"; } diff --git a/Minio/Helper/Utils.cs b/Minio/Helper/Utils.cs index 4076342f1..42a187d56 100644 --- a/Minio/Helper/Utils.cs +++ b/Minio/Helper/Utils.cs @@ -1050,13 +1050,29 @@ public static string SerializeToXml(T anyobject) where T : class using var reader = new StreamReader(stream); var xmlContent = reader.ReadToEnd(); - return DeserializeXml(xmlContent); // Call the string overload + return DeserializeNonS3Xml(xmlContent); // Fallback to generic XML deserialization } public static T DeserializeXml(string xml) where T : class, new() { if (string.IsNullOrEmpty(xml)) return default; + var ns = GetNamespace(); + if (!string.IsNullOrWhiteSpace(ns) && string.Equals(ns, "http://s3.amazonaws.com/doc/2006-03-01/", + StringComparison.OrdinalIgnoreCase)) + { + using var stringReader = new StringReader(xml); + using var amazonAwsS3XmlReader = new AmazonAwsS3XmlReader(stringReader); + return (T)new XmlSerializer(typeof(T)).Deserialize(amazonAwsS3XmlReader); + } + + return DeserializeNonS3Xml(xml); // Fallback to generic XML deserialization + } + + private static T DeserializeNonS3Xml(string xml) where T : class, new() + { + if (string.IsNullOrEmpty(xml)) return default; + var settings = new XmlReaderSettings { // Disable DTD processing