Commit 29f78b18 authored by Joshua Wise's avatar Joshua Wise Committed by Max Kellermann

storage/plugins/CurlStorage: URL-encode paths in CurlStorage::MapUTF8

When using a database that was not created with a WebDAV music_directory (i.e., if using a remote database, on which updates happen locally) and using the Curl storage plugin, MPD would previously send GET requests that had unescaped spaces in them. This change uses Curl's URL-encode API to solve this.
parent 147872fe
ver 0.20.22 (not yet released)
* storage
- curl: URL-encode paths
ver 0.20.21 (2018/08/17)
* database
......
......@@ -34,6 +34,7 @@
#include "thread/Mutex.hxx"
#include "thread/Cond.hxx"
#include "util/ASCII.hxx"
#include "util/IterableSplitString.hxx"
#include "util/RuntimeError.hxx"
#include "util/StringCompare.hxx"
#include "util/StringFormat.hxx"
......@@ -79,9 +80,18 @@ CurlStorage::MapUTF8(const char *uri_utf8) const noexcept
if (StringIsEmpty(uri_utf8))
return base;
// TODO: escape the given URI
CurlEasy easy;
std::string path_esc;
for (auto elt: IterableSplitString(uri_utf8, '/')) {
char *elt_esc = easy.Escape(elt.data, elt.size);
if (!path_esc.empty())
path_esc.push_back('/');
path_esc += elt_esc;
curl_free(elt_esc);
}
return PathTraitsUTF8::Build(base.c_str(), uri_utf8);
return PathTraitsUTF8::Build(base.c_str(), path_esc.c_str());
}
const char *
......
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