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

xuanwo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git


The following commit(s) were added to refs/heads/main by this push:
     new 95eae352f fix(services/dropbox): Check if folder exists before calling 
create dir (#3513)
95eae352f is described below

commit 95eae352f909c68f9c9e54a4e905319132122022
Author: leenstx <[email protected]>
AuthorDate: Wed Nov 8 00:39:31 2023 +0800

    fix(services/dropbox): Check if folder exists before calling create dir 
(#3513)
    
    * feat: Check if folder exists before calling create #3463
    
    * fmt
    
    * feat: Check if folder exists before calling create #3463
    
    * feat: Check if folder exists before calling create #3463
    
    * fmt
    
    * feat: Check if folder exists before calling create
---
 core/src/services/dropbox/backend.rs | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

diff --git a/core/src/services/dropbox/backend.rs 
b/core/src/services/dropbox/backend.rs
index e250ea76c..498bb22cd 100644
--- a/core/src/services/dropbox/backend.rs
+++ b/core/src/services/dropbox/backend.rs
@@ -26,13 +26,14 @@ use http::StatusCode;
 use once_cell::sync::Lazy;
 use serde::Deserialize;
 
-use super::core::DropboxCore;
-use super::error::parse_error;
-use super::writer::DropboxWriter;
 use crate::raw::*;
 use crate::services::dropbox::error::DropboxErrorResponse;
 use crate::*;
 
+use super::core::DropboxCore;
+use super::error::parse_error;
+use super::writer::DropboxWriter;
+
 static BACKOFF: Lazy<ExponentialBuilder> = Lazy::new(|| {
     ExponentialBuilder::default()
         .with_max_delay(Duration::from_secs(10))
@@ -79,6 +80,23 @@ impl Accessor for DropboxBackend {
     }
 
     async fn create_dir(&self, path: &str, _args: OpCreateDir) -> 
Result<RpCreateDir> {
+        // Check if the folder already exists.
+        let resp = self.core.dropbox_get_metadata(path).await?;
+        if StatusCode::OK == resp.status() {
+            let bytes = resp.into_body().bytes().await?;
+            let decoded_response = 
serde_json::from_slice::<DropboxMetadataResponse>(&bytes)
+                .map_err(new_json_deserialize_error)?;
+            if "folder" == decoded_response.tag {
+                return Ok(RpCreateDir::default());
+            }
+            if "file" == decoded_response.tag {
+                return Err(Error::new(
+                    ErrorKind::NotADirectory,
+                    &format!("it's not a directory {}", path),
+                ));
+            }
+        }
+
         let resp = self.core.dropbox_create_folder(path).await?;
         let status = resp.status();
         match status {

Reply via email to