From 1e6bfcebe093a97f97ffc2faa4cebb85bb33e093 Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Fri, 15 Aug 2025 10:57:32 +0200 Subject: [PATCH] Fix deserialization with missing XML namespace --- Minio.Tests/UtilsTest.cs | 19 +++++++++++++++++++ Minio/Helper/AmazonAwsS3XmlReader.cs | 4 ++++ Minio/Helper/Utils.cs | 18 +++++++++++++++++- 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/Minio.Tests/UtilsTest.cs b/Minio.Tests/UtilsTest.cs index c03a0da878..643d6435bc 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 7ddafe9132..ef7f63c27f 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 4076342f14..42a187d56e 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