From 7ca59b92aa057ec8b7b851e970b9bdd4c510dc60 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Wed, 28 Sep 2011 21:39:05 -0700 Subject: [PATCH] Replace '&' with its XML encoded equivalent, before parsing XML. Added test to check for proper XML parsing with illegal characters. --- NzbDrone.Core.Test/XbmcProviderTest.cs | 33 +++++++++++++++++++++++++ NzbDrone.Core/Providers/XbmcProvider.cs | 2 +- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/NzbDrone.Core.Test/XbmcProviderTest.cs b/NzbDrone.Core.Test/XbmcProviderTest.cs index 5b92c7247..8e17ac008 100644 --- a/NzbDrone.Core.Test/XbmcProviderTest.cs +++ b/NzbDrone.Core.Test/XbmcProviderTest.cs @@ -271,6 +271,39 @@ namespace NzbDrone.Core.Test Assert.AreEqual("", result); } + [Test] + public void GetXbmcSeriesPath_special_characters() + { + //Setup + var mocker = new AutoMoqer(MockBehavior.Strict); + + var queryResult = @"smb://xbmc:xbmc@HOMESERVER/TV/Law & Order- Special Victims Unit/"; + + var host = "localhost:8080"; + var username = "xbmc"; + var password = "xbmc"; + + var setResponseUrl = "http://localhost:8080/xbmcCmds/xbmcHttp?command=SetResponseFormat(webheader;false;webfooter;false;header;;footer;;opentag;;closetag;;closefinaltag;false)"; + var resetResponseUrl = "http://localhost:8080/xbmcCmds/xbmcHttp?command=SetResponseFormat()"; + var query = String.Format("http://localhost:8080/xbmcCmds/xbmcHttp?command=QueryVideoDatabase(select path.strPath from path, tvshow, tvshowlinkpath where tvshow.c12 = 79488 and tvshowlinkpath.idShow = tvshow.idShow and tvshowlinkpath.idPath = path.idPath)"); + + + //var fakeUdpProvider = mocker.GetMock(); + var fakeHttp = mocker.GetMock(); + fakeHttp.Setup(s => s.DownloadString(setResponseUrl, username, password)).Returns("OK"); + fakeHttp.Setup(s => s.DownloadString(resetResponseUrl, username, password)).Returns(@" +
  • OK + "); + fakeHttp.Setup(s => s.DownloadString(query, username, password)).Returns(queryResult); + + //Act + var result = mocker.Resolve().GetXbmcSeriesPath(host, 79488, username, username); + + //Assert + mocker.VerifyAllMocks(); + result.Should().Be("smb://xbmc:xbmc@HOMESERVER/TV/Law & Order- Special Victims Unit/"); + } + [Test] public void Clean() { diff --git a/NzbDrone.Core/Providers/XbmcProvider.cs b/NzbDrone.Core/Providers/XbmcProvider.cs index cc1b1a444..76de9579f 100644 --- a/NzbDrone.Core/Providers/XbmcProvider.cs +++ b/NzbDrone.Core/Providers/XbmcProvider.cs @@ -187,7 +187,7 @@ namespace NzbDrone.Core.Providers if (String.IsNullOrEmpty(response)) return String.Empty; - var xDoc = XDocument.Load(new StringReader(response)); + var xDoc = XDocument.Load(new StringReader(response.Replace("&", "&"))); var xml = (from x in xDoc.Descendants("xml") select x).FirstOrDefault(); if (xml == null)