aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeaEagle1 <seaeagle1@users.sourceforge.net>2023-05-12 17:53:27 +0200
committerSeaEagle1 <seaeagle1@users.sourceforge.net>2023-05-12 20:46:01 +0200
commit9352a243744d5d6805f80dc57792919f15ca5b90 (patch)
treefaebc356f2c419da4309e3733be2ec48ff9b305c
parent47290a8c3665f3adb859bda19deb66f438f2e5d0 (diff)
Rescue PlayTo function in case of malformed Xml response
(port from 10.8 fix)
-rw-r--r--Emby.Dlna/PlayTo/DlnaHttpClient.cs31
1 files changed, 26 insertions, 5 deletions
diff --git a/Emby.Dlna/PlayTo/DlnaHttpClient.cs b/Emby.Dlna/PlayTo/DlnaHttpClient.cs
index 75ff542dd..9930f0ede 100644
--- a/Emby.Dlna/PlayTo/DlnaHttpClient.cs
+++ b/Emby.Dlna/PlayTo/DlnaHttpClient.cs
@@ -2,9 +2,11 @@
using System;
using System.Globalization;
+using System.IO;
using System.Net.Http;
using System.Net.Mime;
using System.Text;
+using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
@@ -54,15 +56,34 @@ namespace Emby.Dlna.PlayTo
LoadOptions.None,
cancellationToken).ConfigureAwait(false);
}
- catch (XmlException ex)
+ catch (XmlException)
{
- _logger.LogError(ex, "Failed to parse response");
- if (_logger.IsEnabled(LogLevel.Debug))
+ // try correcting the Xml response with common errors
+ var xmlString = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
+
+ // find and replace unescaped ampersands (&)
+ Regex regex = new Regex(@"(&(?![a-z]*;))");
+ xmlString = regex.Replace(xmlString, @"&amp;");
+
+ try
{
- _logger.LogDebug("Malformed response: {Content}\n", await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false));
+ // retry reading Xml
+ var xmlReader = new StringReader(xmlString);
+ return await XDocument.LoadAsync(
+ xmlReader,
+ LoadOptions.None,
+ cancellationToken).ConfigureAwait(false);
}
+ catch (XmlException ex)
+ {
+ _logger.LogError(ex, "Failed to parse response");
+ if (_logger.IsEnabled(LogLevel.Debug))
+ {
+ _logger.LogDebug("Malformed response: {Content}\n", xmlString);
+ }
- return null;
+ return null;
+ }
}
}