From 252de8d046c3c3247e162f80dea992212a1d7ab1 Mon Sep 17 00:00:00 2001 From: Hari Sridharan Date: Mon, 14 Sep 2020 23:03:27 -0700 Subject: [PATCH 1/4] Update OneDriveLargeFileUploadTask.ts Trying to upload files with the '#' or '%' character in the filename ends with network errors of the form - 400 status response "The parameter item does not exist in method getByPath" Encoding the entire URL does not encode URL components correctly. When the SDK's client tries to encode these URL components in the parameters on the call to OneDriveLargeFileUploadTask.create, then the resultant file in OneDrive has the URL encoded filename (as opposed to the user-friendly/decoded filename). Therefore, fix the encoding in the SDK's URL components itself, directly. --- src/tasks/OneDriveLargeFileUploadTask.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tasks/OneDriveLargeFileUploadTask.ts b/src/tasks/OneDriveLargeFileUploadTask.ts index 2716f4a22..2a905b33d 100644 --- a/src/tasks/OneDriveLargeFileUploadTask.ts +++ b/src/tasks/OneDriveLargeFileUploadTask.ts @@ -59,7 +59,7 @@ export class OneDriveLargeFileUploadTask extends LargeFileUploadTask { if (path[path.length - 1] !== "/") { path = `${path}/`; } - return encodeURI(`/me/drive/root:${path}${fileName}:/createUploadSession`); + return `/me/drive/root:${path.split('/').map(p => encodeURIComponent(p)).join('/')}${encodeURIComponent(filename)}:/createUploadSession`; } /** From 6107b0b21fab772200fc1304f0ac13e7a38db06e Mon Sep 17 00:00:00 2001 From: Hari Sridharan Date: Mon, 14 Sep 2020 23:16:02 -0700 Subject: [PATCH 2/4] Update OneDriveLargeFileUploadTask.ts Fix typo --- src/tasks/OneDriveLargeFileUploadTask.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tasks/OneDriveLargeFileUploadTask.ts b/src/tasks/OneDriveLargeFileUploadTask.ts index 2a905b33d..8a354a073 100644 --- a/src/tasks/OneDriveLargeFileUploadTask.ts +++ b/src/tasks/OneDriveLargeFileUploadTask.ts @@ -59,7 +59,7 @@ export class OneDriveLargeFileUploadTask extends LargeFileUploadTask { if (path[path.length - 1] !== "/") { path = `${path}/`; } - return `/me/drive/root:${path.split('/').map(p => encodeURIComponent(p)).join('/')}${encodeURIComponent(filename)}:/createUploadSession`; + return `/me/drive/root:${path.split('/').map(p => encodeURIComponent(p)).join('/')}${encodeURIComponent(fileName)}:/createUploadSession`; } /** From 3b074edf7a2c58dfb8097a1c5b07b4cd58fd3eb9 Mon Sep 17 00:00:00 2001 From: Hari Sridharan Date: Tue, 15 Sep 2020 08:11:19 -0700 Subject: [PATCH 3/4] Update src/tasks/OneDriveLargeFileUploadTask.ts Updated comment Co-authored-by: Mustafa Zengin --- src/tasks/OneDriveLargeFileUploadTask.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tasks/OneDriveLargeFileUploadTask.ts b/src/tasks/OneDriveLargeFileUploadTask.ts index 8a354a073..cd3df8e83 100644 --- a/src/tasks/OneDriveLargeFileUploadTask.ts +++ b/src/tasks/OneDriveLargeFileUploadTask.ts @@ -59,6 +59,8 @@ export class OneDriveLargeFileUploadTask extends LargeFileUploadTask { if (path[path.length - 1] !== "/") { path = `${path}/`; } + // we choose to encode each component of the file path separately because when encoding full URI + // with encodeURI, special characters like # in the file name doesn't get encoded as desired return `/me/drive/root:${path.split('/').map(p => encodeURIComponent(p)).join('/')}${encodeURIComponent(fileName)}:/createUploadSession`; } From d6db0951cfb22292c2764f7848798aca11a650ae Mon Sep 17 00:00:00 2001 From: Hari Sridharan Date: Tue, 15 Sep 2020 08:12:11 -0700 Subject: [PATCH 4/4] Update OneDriveLargeFileUploadTask.ts Updated comment --- src/tasks/OneDriveLargeFileUploadTask.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tasks/OneDriveLargeFileUploadTask.ts b/src/tasks/OneDriveLargeFileUploadTask.ts index cd3df8e83..7f069ee28 100644 --- a/src/tasks/OneDriveLargeFileUploadTask.ts +++ b/src/tasks/OneDriveLargeFileUploadTask.ts @@ -60,7 +60,7 @@ export class OneDriveLargeFileUploadTask extends LargeFileUploadTask { path = `${path}/`; } // we choose to encode each component of the file path separately because when encoding full URI - // with encodeURI, special characters like # in the file name doesn't get encoded as desired + // with encodeURI, special characters like # or % in the file name doesn't get encoded as desired return `/me/drive/root:${path.split('/').map(p => encodeURIComponent(p)).join('/')}${encodeURIComponent(fileName)}:/createUploadSession`; }