strings_t Client::list(std::string remote_directory) noexcept { auto clientImpl = GetImpl(this); bool is_existed = this->check(remote_directory); if (!is_existed) return strings_t(); bool is_directory = this->is_dir(remote_directory); if (!is_directory) return strings_t(); auto target_urn = Urn(clientImpl->webdav_root, true) + remote_directory; target_urn = Urn(target_urn.path(), true); Header header = { "Accept: */*", "Depth: 1" }; Data data = { 0, 0, 0 }; Request request(clientImpl->options()); auto url = clientImpl->webdav_hostname + target_urn.quote(request.handle); request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); request.set(CURLOPT_URL, url.c_str()); request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); request.set(CURLOPT_HEADER, 0); request.set(CURLOPT_WRITEDATA, (size_t)&data); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); bool is_performed = request.perform(); if (!is_performed) return strings_t(); strings_t resources; pugi::xml_document document; document.load_buffer(data.buffer, (size_t)data.size); auto multistatus = document.select_single_node("d:multistatus").node(); auto responses = multistatus.select_nodes("d:response"); for(auto response : responses) { pugi::xml_node href = response.node().select_single_node("d:href").node(); std::string encode_file_name = href.first_child().value(); std::string resource_path = curl_unescape(encode_file_name.c_str(), (int) encode_file_name.length()); auto target_path = target_urn.path(); if (resource_path == target_path) continue; Urn resource_urn(resource_path); resources.push_back(resource_urn.name()); } return resources; }
strings_t Client::list(std::string remote_directory) noexcept { auto clientImpl = GetImpl(this); bool is_existed = this->check(remote_directory); if (!is_existed) return strings_t(); bool is_directory = this->is_dir(remote_directory); if (!is_directory) return strings_t(); auto target_urn = Urn(clientImpl->ftps_root, true) + remote_directory; target_urn = Urn(target_urn.path(), true); Header header = { "Accept: */*", "Depth: 1" }; Data data = { 0, 0, 0 }; Request request(clientImpl->options()); auto url = clientImpl->ftps_hostname + target_urn.quote(request.handle); request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); request.set(CURLOPT_URL, url.c_str()); request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); request.set(CURLOPT_HEADER, 0); request.set(CURLOPT_WRITEDATA, (size_t)&data); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); bool is_performed = request.perform(); if (!is_performed) return strings_t(); strings_t resources; // TODO return resources; }