Commit 464767c5 authored by Max Kellermann's avatar Max Kellermann

db/upnp/Util: move caturl() to util/UriUtil.cxx

parent a9c3ca86
......@@ -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>
......
......@@ -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),
......
......@@ -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)
{
......
......@@ -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");
......
......@@ -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;
}
......@@ -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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment