storage/curl: fix path comparison when the server escapes differently
Unescape the base path and the path coming from the server (href) to fix the comparison when the server uses different escaped characters. The outputted name need to be unescaped. Doing that before or after the HrefToEscapedName() call should not change the current behavior.
This commit is contained in:
parent
3d8067a041
commit
b18074f899
1
NEWS
1
NEWS
|
@ -1,6 +1,7 @@
|
|||
ver 0.21.23 (not yet released)
|
||||
* storage
|
||||
- curl: fix corrupt "href" values in the presence of XML entities
|
||||
- curl: unescape "href" values
|
||||
* output
|
||||
- alsa: implement channel mapping for 5.0 and 7.0
|
||||
* player
|
||||
|
|
|
@ -482,7 +482,7 @@ class HttpListDirectoryOperation final : public PropfindOperation {
|
|||
public:
|
||||
HttpListDirectoryOperation(CurlGlobal &curl, const char *uri)
|
||||
:PropfindOperation(curl, uri, 1),
|
||||
base_path(UriPathOrSlash(uri)) {}
|
||||
base_path(CurlUnescape(GetEasy(), UriPathOrSlash(uri))) {}
|
||||
|
||||
std::unique_ptr<StorageDirectoryReader> Perform() {
|
||||
DeferStart();
|
||||
|
@ -507,8 +507,7 @@ private:
|
|||
|
||||
/* kludge: ignoring case in this comparison to avoid
|
||||
false negatives if the web server uses a different
|
||||
case in hex digits in escaped characters; TODO:
|
||||
implement properly */
|
||||
case */
|
||||
path = StringAfterPrefixIgnoreCase(path, base_path.c_str());
|
||||
if (path == nullptr || *path == 0)
|
||||
return nullptr;
|
||||
|
@ -531,11 +530,12 @@ protected:
|
|||
if (r.status != 200)
|
||||
return;
|
||||
|
||||
const auto escaped_name = HrefToEscapedName(r.href.c_str());
|
||||
if (escaped_name.IsNull())
|
||||
std::string href = CurlUnescape(GetEasy(), r.href.c_str());
|
||||
const auto name = HrefToEscapedName(href.c_str());
|
||||
if (name.IsNull())
|
||||
return;
|
||||
|
||||
entries.emplace_front(CurlUnescape(GetEasy(), escaped_name));
|
||||
entries.emplace_front(std::string(name.data, name.size));
|
||||
|
||||
auto &info = entries.front().info;
|
||||
info = StorageFileInfo(r.collection
|
||||
|
|
Loading…
Reference in New Issue