aboutsummaryrefslogtreecommitdiffstats
path: root/src/db/upnp/Util.cxx
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-01-22 17:12:46 +0100
committerMax Kellermann <max@duempel.org>2014-01-22 19:38:07 +0100
commit9fb5134f6402e3fd5bc3e10ff9ec0103b3f1eb59 (patch)
tree6ac0f45aed5ba1724e98ba4cf32b837c87872ad2 /src/db/upnp/Util.cxx
parent9aeb23dfe906ae22dd340f42930c7961f810e9cc (diff)
downloadmpd-9fb5134f6402e3fd5bc3e10ff9ec0103b3f1eb59.tar.gz
mpd-9fb5134f6402e3fd5bc3e10ff9ec0103b3f1eb59.tar.xz
mpd-9fb5134f6402e3fd5bc3e10ff9ec0103b3f1eb59.zip
db/upnp/Util: handle absolute URI paths properly in caturl()
Fixes problems with some UPnP servers.
Diffstat (limited to 'src/db/upnp/Util.cxx')
-rw-r--r--src/db/upnp/Util.cxx27
1 files changed, 20 insertions, 7 deletions
diff --git a/src/db/upnp/Util.cxx b/src/db/upnp/Util.cxx
index 86c9a65ab..ddc54bbe0 100644
--- a/src/db/upnp/Util.cxx
+++ b/src/db/upnp/Util.cxx
@@ -45,14 +45,27 @@ trimstring(std::string &s, const char *ws)
std::string
caturl(const std::string &s1, const std::string &s2)
{
- std::string out(s1);
- if (out.back() == '/') {
- if (s2.front() == '/')
- out.erase(out.size()-1);
- } else {
- if (s2.front() != '/')
- out.push_back('/');
+ if (s2.front() == '/') {
+ /* absolute path: replace the whole URI path in s1 */
+
+ auto i = s1.find("://");
+ if (i == s1.npos)
+ /* no scheme: override s1 completely */
+ return s2;
+
+ /* find the first slash after the host part */
+ i = s1.find('/', i + 3);
+ if (i == s1.npos)
+ /* there's no URI path - simply append s2 */
+ i = s1.length();
+
+ return s1.substr(0, i) + s2;
}
+
+ std::string out(s1);
+ if (out.back() != '/')
+ out.push_back('/');
+
out += s2;
return out;
}