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)
|
ver 0.20.22 (not yet released)
|
||||||
|
* storage
|
||||||
|
- curl: URL-encode paths
|
||||||
|
|
||||||
ver 0.20.21 (2018/08/17)
|
ver 0.20.21 (2018/08/17)
|
||||||
* database
|
* database
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include "thread/Mutex.hxx"
|
#include "thread/Mutex.hxx"
|
||||||
#include "thread/Cond.hxx"
|
#include "thread/Cond.hxx"
|
||||||
#include "util/ASCII.hxx"
|
#include "util/ASCII.hxx"
|
||||||
|
#include "util/IterableSplitString.hxx"
|
||||||
#include "util/RuntimeError.hxx"
|
#include "util/RuntimeError.hxx"
|
||||||
#include "util/StringCompare.hxx"
|
#include "util/StringCompare.hxx"
|
||||||
#include "util/StringFormat.hxx"
|
#include "util/StringFormat.hxx"
|
||||||
|
@ -79,9 +80,18 @@ CurlStorage::MapUTF8(const char *uri_utf8) const noexcept
|
||||||
if (StringIsEmpty(uri_utf8))
|
if (StringIsEmpty(uri_utf8))
|
||||||
return base;
|
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 *
|
const char *
|
||||||
|
|
Loading…
Reference in New Issue