Example #1
0
    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)
Example #2
0
    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
        ]