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.
This commit is contained in:

committed by
Max Kellermann

parent
147872fe97
commit
29f78b18b1
@@ -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;
|
||||
|
||||
return PathTraitsUTF8::Build(base.c_str(), uri_utf8);
|
||||
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(), path_esc.c_str());
|
||||
}
|
||||
|
||||
const char *
|
||||
|
Reference in New Issue
Block a user