From 9bde9bdab01b9bd6241e103812b3b0f1a9122759 Mon Sep 17 00:00:00 2001 From: myl7 Date: Mon, 24 Jan 2022 22:00:08 +0800 Subject: [PATCH] report handleable error in downloading --- components/FileListing.tsx | 6 +++++- components/MultiFileDownloader.tsx | 22 ++++++++++++++++------ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/components/FileListing.tsx b/components/FileListing.tsx index 8043f76..a947055 100644 --- a/components/FileListing.tsx +++ b/components/FileListing.tsx @@ -297,7 +297,11 @@ const FileListing: FC<{ query?: ParsedUrlQuery }> = ({ query }) => { // Folder recursive download const handleFolderDownload = (path: string, id: string, name?: string) => () => { const files = (async function* () { - for await (const { meta: c, path: p, isFolder } of traverseFolder(path)) { + for await (const { meta: c, path: p, isFolder, error } of traverseFolder(path)) { + if (error) { + toast.error(`Failed to download folder ${p}: ${error[0]} ${error[1]} Skipped it to continue.`) + continue + } yield { name: c?.name, url: c ? c['@microsoft.graph.downloadUrl'] : undefined, diff --git a/components/MultiFileDownloader.tsx b/components/MultiFileDownloader.tsx index 0fd1bd6..e08a96b 100644 --- a/components/MultiFileDownloader.tsx +++ b/components/MultiFileDownloader.tsx @@ -161,12 +161,14 @@ export async function downloadTreelikeMultipleFiles({ * @param path Folder to be traversed * @returns Array of items representing folders and files of traversed folder in BFS order and excluding root folder. * Due to BFS, folder items are ALWAYS in front of its children items. + * Error key in the item will contain the error when there is a handleable error. */ export async function* traverseFolder(path: string): AsyncGenerator< { path: string meta: any isFolder: boolean + error?: [number, string] }, void, undefined @@ -182,9 +184,14 @@ export async function* traverseFolder(path: string): AsyncGenerator< try { data = await fetcher(`/api?path=${fp}`, hashedToken ?? undefined) } catch (error: any) { - // Skip errors caused by the client - if (Math.floor(error.response.status / 100) === 4) { - return null + console.log(error) + // 4xx errors are identified as handleable errors + if (Math.floor(error.status / 100) === 4) { + return { + path: fp, + isFolder: true, + error: [error.status as number, error.message.error as string] + } } else { throw error } @@ -202,8 +209,11 @@ export async function* traverseFolder(path: string): AsyncGenerator< ) ) - const items = itemLists.filter(Boolean).flat() as { path: string; meta: any; isFolder: boolean }[] - yield* items - folderPaths = items.filter(i => i.isFolder).map(i => i.path) + const items = itemLists.flat() as { path: string; meta: any; isFolder: boolean; error?: [number, string] }[] + yield * items + folderPaths = items + .filter(({ error }) => !error) + .filter(i => i.isFolder) + .map(i => i.path) } }