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 {