You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by er...@apache.org on 2026/08/14 15:04:49 UTC

(opendal) 01/01: fix(services/onedrive): build upload session URL from full path

This is an automated email from the ASF dual-hosted git repository.

erickguan pushed a commit to branch fix/onedrive-upload-session-url
in repository https://gitbox.apache.org/repos/asf/opendal.git

commit 329f22750f4d87d4939656fead7f0e561c5d77d6
Author: Erick Guan <29...@users.noreply.github.com>
AuthorDate: Fri Aug 14 22:50:49 2026 +0800

    fix(services/onedrive): build upload session URL from full path
---
 core/services/onedrive/src/core.rs | 51 ++++++++++++++++++++++++++++++++------
 1 file changed, 44 insertions(+), 7 deletions(-)

diff --git a/core/services/onedrive/src/core.rs b/core/services/onedrive/src/core.rs
index 4e7a7c207..0fd5e3a59 100644
--- a/core/services/onedrive/src/core.rs
+++ b/core/services/onedrive/src/core.rs
@@ -447,17 +447,15 @@ impl OneDriveCore {
     /// This endpoint supports `If-None-Match` but [`onedrive_upload_simple()`] doesn't.
     ///
     /// Read more at https://learn.microsoft.com/en-us/onedrive/developer/rest-api/api/driveitem_createuploadsession?view=odsp-graph-online#upload-bytes-to-the-upload-session
-    pub(crate) async fn onedrive_create_upload_session(
+    pub(crate) fn onedrive_create_upload_session_request(
         &self,
-        ctx: &OperationContext,
         path: &str,
         args: &OpWrite,
-    ) -> Result<Response<Buffer>> {
-        let parent_path = get_parent(path);
+    ) -> Result<Request<Buffer>> {
         let file_name = get_basename(path);
         let url = format!(
             "{}:/createUploadSession",
-            self.onedrive_item_url(parent_path, true) + "/" + file_name,
+            self.onedrive_item_url(path, true),
         );
         let mut request = Request::post(url).header(header::CONTENT_TYPE, "application/json");
 
@@ -468,11 +466,20 @@ impl OneDriveCore {
         let body = OneDriveUploadSessionCreationRequestBody::new(file_name.to_string());
         let body_bytes = serde_json::to_vec(&body).map_err(new_json_serialize_error)?;
         let body = Buffer::from(Bytes::from(body_bytes));
-        let mut request = request
+        request
             .extension(Operation::Write)
             .extension(ServiceOperation("CreateUploadSession"))
             .body(body)
-            .map_err(new_request_build_error)?;
+            .map_err(new_request_build_error)
+    }
+
+    pub(crate) async fn onedrive_create_upload_session(
+        &self,
+        ctx: &OperationContext,
+        path: &str,
+        args: &OpWrite,
+    ) -> Result<Response<Buffer>> {
+        let mut request = self.onedrive_create_upload_session_request(path, args)?;
 
         self.sign(ctx, &mut request).await?;
 
@@ -892,6 +899,36 @@ mod tests {
         );
     }
 
+    #[test]
+    fn upload_session_request_for_root_file_uses_path_addressing() {
+        let core = test_core("/");
+        let request = core
+            .onedrive_create_upload_session_request("file.bin", &OpWrite::default())
+            .unwrap();
+        assert_eq!(
+            request.uri().to_string(),
+            format!(
+                "{}:/file.bin:/createUploadSession",
+                OneDriveCore::DRIVE_ROOT_URL
+            )
+        );
+    }
+
+    #[test]
+    fn upload_session_request_percent_encodes_file_name() {
+        let core = test_core("/");
+        let request = core
+            .onedrive_create_upload_session_request("upload session #1.bin", &OpWrite::default())
+            .unwrap();
+        assert_eq!(
+            request.uri().to_string(),
+            format!(
+                "{}:/upload%20session%20%231.bin:/createUploadSession",
+                OneDriveCore::DRIVE_ROOT_URL
+            )
+        );
+    }
+
     #[tokio::test]
     async fn list_root_returns_entries() {
         let core = test_core("/");