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:
parent
147872fe97
commit
29f78b18b1
2
NEWS
2
NEWS
|
@ -1,4 +1,6 @@
|
|||
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;
|
||||
|
||||
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 *
|
||||
|
|
Loading…
Reference in New Issue