def extract_response_for_path(content, path, hostname): """Extracts single response for specified remote resource. :param content: raw content of response as string. :param path: the path to needed remote resource. :param hostname: the server hostname. :return: XML object of response for the remote resource defined by path. """ prefix = urlparse(hostname).path try: tree = etree.fromstring(content.encode()) responses = tree.findall("{DAV:}response") n_path = Urn.normalize_path(path) for resp in responses: href = resp.findtext("{DAV:}href") if Urn.compare_path(n_path, href) is True: return resp href_without_prefix = href[len(prefix):] if href.startswith( prefix) else href if Urn.compare_path(n_path, href_without_prefix) is True: return resp raise RemoteResourceNotFound(path) except etree.XMLSyntaxError: raise MethodNotSupported(name="is_dir", server=hostname)
async def list( self, path: Optional[Union[str, "os.PathLike[str]"]] = ROOT, get_info: Optional[bool] = False ) -> Union[List[str], List[Dict[str, str]]]: """ Returns list of nested files and directories for remote WebDAV directory by path. More information you can find by link http://webdav.org/specs/rfc4918.html#METHOD_PROPFIN Parameters: path (``str``): Path to remote directory. get_info (``bool``, *optional*): Set true to get more information like cmd 'ls -l'. Returns: List of :obj:`str` | List of :obj:`Dict[str, str]`: On success, if get_info=False it returns list of nested file or directory names, otherwise it returns list of information, the information is a dictionary and it values with following keys: `created`: date of resource creation, `name`: name of resource, `size`: size of resource, `modified`: date of resource modification, `etag`: etag of resource, `isdir`: type of resource, `path`: path of resource. """ directory_urn = Urn(path, directory=True) if directory_urn.path() != Client.ROOT and not (await self.exists( directory_urn.path())): raise RemoteResourceNotFound(directory_urn.path()) path = Urn.normalize_path(self.get_full_path(directory_urn)) response = await self._execute_request(action='list', path=directory_urn.quote()) text = await response.text() if get_info: subfiles = WebDavXmlUtils.parse_get_list_info_response(text) return [ subfile for subfile in subfiles if Urn.compare_path(path, subfile.get('path')) is False ] urns = WebDavXmlUtils.parse_get_list_response(text) return [ urn.filename() for urn in urns if Urn.compare_path(path, urn.path()) is False ]