コード例 #1
0
    async def file_getter(request):
        tail = unquote(request.route_values.get('tail')).lstrip('/')

        resource_path = os.path.join(source_folder_name, tail)

        if '../' in tail:
            abs_path = os.path.abspath(resource_path)
            if not str(abs_path).lower().startswith(source_folder_full_path):
                # someone is trying to read out of the static folder
                raise NotFound()

        if not os.path.exists(resource_path) or os.path.islink(resource_path):
            raise NotFound()

        if os.path.isdir(resource_path):
            if discovery:
                return get_files_list_html_response(
                    files_list_template, tail.rstrip('/'),
                    list(get_files_to_serve(resource_path.rstrip('/'))))
            else:
                raise NotFound()

        file_extension = get_file_extension_from_name(resource_path)

        if file_extension not in extensions:
            raise NotFound()

        return get_response_for_file(request, resource_path, cache_time)
コード例 #2
0
def get_files_to_serve(source_folder,
                       extensions=None,
                       recurse=False,
                       root_folder=None):
    if extensions is None:
        extensions = get_default_extensions()

    if not root_folder:
        root_folder = source_folder

    p = Path(source_folder)

    if not p.exists():
        raise InvalidArgument('given root path does not exist')

    if not p.is_dir():
        raise InvalidArgument('given root path is not a directory')

    names = os.listdir(p)
    names.sort()
    dirs, nondirs = [], []

    for name in names:
        full_path = Path(os.path.join(source_folder, name))
        if os.path.isdir(full_path):
            dirs.append(full_path)
        else:
            nondirs.append(full_path)

    items = dirs + nondirs

    for item in items:
        item_path = str(item)

        if os.path.islink(item_path):
            continue

        if item.is_dir():
            if not recurse:
                yield {
                    'rel_path': item_path[len(root_folder) + 1:],
                    'full_path': item_path,
                    'is_dir': True
                }
            else:
                for v in get_files_to_serve(Path(item_path), extensions,
                                            recurse, root_folder):
                    yield v
        else:
            extension = get_file_extension_from_name(item_path)

            if extension in extensions:
                yield {
                    'rel_path': item_path[len(root_folder) + 1:],
                    'full_path': item_path,
                    'is_dir': False
                }
コード例 #3
0
def get_files_to_serve(source_folder,
                       extensions=None,
                       discovery=False,
                       root_folder=None):
    if extensions is None:
        extensions = get_default_extensions()

    if not root_folder:
        root_folder = source_folder

    p = Path(source_folder)

    if not p.exists():
        raise InvalidArgument('given root path does not exist')

    if not p.is_dir():
        raise InvalidArgument('given root path is not a directory')

    items = [x for x in p.iterdir()]
    items.sort(reverse=True)

    for item in items:
        item_path = str(item)

        if os.path.islink(item_path):
            continue

        if item.is_dir():
            if discovery:
                yield {
                    'rel_path': item_path[len(root_folder):],
                    'full_path': item_path,
                    'is_dir': True
                }
            for v in get_files_to_serve(Path(item_path), extensions, discovery,
                                        root_folder):
                yield v
        else:
            extension = get_file_extension_from_name(item_path)

            if extension in extensions:
                yield {
                    'rel_path': item_path[len(root_folder):],
                    'full_path': item_path
                }