dict_t Client::info(std::string remote_resource) noexcept { auto clientImpl = GetImpl(this); auto root_urn = Urn(clientImpl->ftps_root, true); auto target_urn = root_urn + remote_resource; 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_WRITEDATA, (size_t)&data); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); bool is_performed = request.perform(); if (!is_performed) return dict_t(); // TODO return dict_t(); }
dict_t Client::info(std::string remote_resource) noexcept { auto clientImpl = GetImpl(this); auto root_urn = Urn(clientImpl->webdav_root, true); auto target_urn = root_urn + remote_resource; 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_WRITEDATA, (size_t)&data); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); bool is_performed = request.perform(); if (!is_performed) return dict_t(); 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(); auto target_path_without_sep = std::string(target_path, 0, target_path.rfind("/")+1); auto resource_path_without_sep = std::string(resource_path, 0, resource_path.rfind("/")+1); if (resource_path_without_sep.compare(target_path_without_sep) == 0) { auto propstat = response.node().select_single_node("d:propstat").node(); auto prop = propstat.select_single_node("d:prop").node(); auto creation_date = prop.select_single_node("d:creationdate").node(); auto display_name = prop.select_single_node("d:displayname").node(); auto content_length = prop.select_single_node("d:getcontentlength").node(); auto modified_date = prop.select_single_node("d:getlastmodified").node(); auto resource_type = prop.select_single_node("d:resourcetype").node(); dict_t information = { {"created", creation_date.first_child().value()}, {"name", display_name.first_child().value()}, {"size", content_length.first_child().value()}, {"modified", modified_date.first_child().value()}, {"type", resource_type.first_child().name()} }; return information; } } return dict_t(); }