aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/db/plugins/upnp/ContentDirectoryService.cxx1
-rw-r--r--src/lib/upnp/ContentDirectoryService.cxx3
-rw-r--r--src/lib/upnp/Util.cxx28
-rw-r--r--src/lib/upnp/Util.hxx3
-rw-r--r--src/util/UriUtil.cxx28
-rw-r--r--src/util/UriUtil.hxx8
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