diff options
-rw-r--r-- | src/db/plugins/upnp/ContentDirectoryService.cxx | 1 | ||||
-rw-r--r-- | src/lib/upnp/ContentDirectoryService.cxx | 3 | ||||
-rw-r--r-- | src/lib/upnp/Util.cxx | 28 | ||||
-rw-r--r-- | src/lib/upnp/Util.hxx | 3 | ||||
-rw-r--r-- | src/util/UriUtil.cxx | 28 | ||||
-rw-r--r-- | src/util/UriUtil.hxx | 8 |
6 files changed, 39 insertions, 32 deletions
diff --git a/src/db/plugins/upnp/ContentDirectoryService.cxx b/src/db/plugins/upnp/ContentDirectoryService.cxx index c097f7644..88d4bd644 100644 --- a/src/db/plugins/upnp/ContentDirectoryService.cxx +++ b/src/db/plugins/upnp/ContentDirectoryService.cxx @@ -24,6 +24,7 @@ #include "lib/upnp/Action.hxx" #include "Directory.hxx" #include "util/NumberParser.hxx" +#include "util/UriUtil.hxx" #include "util/Error.hxx" #include <stdio.h> diff --git a/src/lib/upnp/ContentDirectoryService.cxx b/src/lib/upnp/ContentDirectoryService.cxx index ef8757ec5..ee7c0d7f5 100644 --- a/src/lib/upnp/ContentDirectoryService.cxx +++ b/src/lib/upnp/ContentDirectoryService.cxx @@ -24,11 +24,12 @@ #include "ixmlwrap.hxx" #include "Util.hxx" #include "Action.hxx" +#include "util/UriUtil.hxx" #include "util/Error.hxx" ContentDirectoryService::ContentDirectoryService(const UPnPDevice &device, const UPnPService &service) - :m_actionURL(caturl(device.URLBase, service.controlURL)), + :m_actionURL(uri_apply_base(device.URLBase, service.controlURL)), m_serviceType(service.serviceType), m_deviceId(device.UDN), m_friendlyName(device.friendlyName), diff --git a/src/lib/upnp/Util.cxx b/src/lib/upnp/Util.cxx index cf34a47d3..79cfb111c 100644 --- a/src/lib/upnp/Util.cxx +++ b/src/lib/upnp/Util.cxx @@ -39,34 +39,6 @@ trimstring(std::string &s, const char *ws) s.replace(pos + 1, std::string::npos, std::string()); } -std::string -caturl(const std::string &s1, const std::string &s2) -{ - 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; -} - static void path_catslash(std::string &s) { diff --git a/src/lib/upnp/Util.hxx b/src/lib/upnp/Util.hxx index 58e382faa..a59f23521 100644 --- a/src/lib/upnp/Util.hxx +++ b/src/lib/upnp/Util.hxx @@ -25,9 +25,6 @@ #include <string> #include <list> -std::string -caturl(const std::string& s1, const std::string& s2); - void trimstring(std::string &s, const char *ws = " \t\n"); diff --git a/src/util/UriUtil.cxx b/src/util/UriUtil.cxx index a549f7938..fdca47c00 100644 --- a/src/util/UriUtil.cxx +++ b/src/util/UriUtil.cxx @@ -137,3 +137,31 @@ uri_is_child_or_same(const char *parent, const char *child) { return strcmp(parent, child) == 0 || uri_is_child(parent, child); } + +std::string +uri_apply_base(const std::string &uri, const std::string &base) +{ + if (uri.front() == '/') { + /* absolute path: replace the whole URI path in base */ + + auto i = base.find("://"); + if (i == base.npos) + /* no scheme: override base completely */ + return uri; + + /* find the first slash after the host part */ + i = base.find('/', i + 3); + if (i == base.npos) + /* there's no URI path - simply append uri */ + i = base.length(); + + return base.substr(0, i) + uri; + } + + std::string out(base); + if (out.back() != '/') + out.push_back('/'); + + out += uri; + return out; +} diff --git a/src/util/UriUtil.hxx b/src/util/UriUtil.hxx index 8e00f8cd8..c2cc97a63 100644 --- a/src/util/UriUtil.hxx +++ b/src/util/UriUtil.hxx @@ -77,4 +77,12 @@ gcc_pure gcc_nonnull_all bool uri_is_child_or_same(const char *parent, const char *child); +/** + * Translate the given URI in the context of #base. For example, + * uri_apply_base("foo", "http://bar/a/")=="http://bar/a/foo". + */ +gcc_pure +std::string +uri_apply_base(const std::string &uri, const std::string &base); + #endif |