diff options
author | Max Kellermann <max@duempel.org> | 2014-01-22 17:12:46 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2014-01-22 19:38:07 +0100 |
commit | 9fb5134f6402e3fd5bc3e10ff9ec0103b3f1eb59 (patch) | |
tree | 6ac0f45aed5ba1724e98ba4cf32b837c87872ad2 /src/db | |
parent | 9aeb23dfe906ae22dd340f42930c7961f810e9cc (diff) | |
download | mpd-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')
-rw-r--r-- | src/db/upnp/Util.cxx | 27 |
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; } |