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

suyanhanx pushed a commit to branch dropbox-range-read
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git

commit d5a77c120c2c459c8688e198893b36bd03194570
Author: suyanhanx <[email protected]>
AuthorDate: Fri Aug 11 15:55:16 2023 +0800

    feat(services/dropbox): read support range
    
    Signed-off-by: suyanhanx <[email protected]>
---
 core/src/services/dropbox/backend.rs |  5 +++--
 core/src/services/dropbox/core.rs    | 20 ++++++++++++++++----
 2 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/core/src/services/dropbox/backend.rs 
b/core/src/services/dropbox/backend.rs
index 5567285d0..1994b4c94 100644
--- a/core/src/services/dropbox/backend.rs
+++ b/core/src/services/dropbox/backend.rs
@@ -63,6 +63,7 @@ impl Accessor for DropboxBackend {
                 stat: true,
 
                 read: true,
+                read_with_range: true,
 
                 write: true,
 
@@ -93,8 +94,8 @@ impl Accessor for DropboxBackend {
         }
     }
 
-    async fn read(&self, path: &str, _args: OpRead) -> Result<(RpRead, 
Self::Reader)> {
-        let resp = self.core.dropbox_get(path).await?;
+    async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, 
Self::Reader)> {
+        let resp = self.core.dropbox_get(path, args).await?;
         let status = resp.status();
         match status {
             StatusCode::OK => {
diff --git a/core/src/services/dropbox/core.rs 
b/core/src/services/dropbox/core.rs
index 4f5be56bf..3e5c6590a 100644
--- a/core/src/services/dropbox/core.rs
+++ b/core/src/services/dropbox/core.rs
@@ -33,7 +33,6 @@ use serde::Deserialize;
 use serde::Serialize;
 use tokio::sync::Mutex;
 
-use crate::raw::build_rooted_abs_path;
 use crate::raw::new_json_deserialize_error;
 use crate::raw::new_json_serialize_error;
 use crate::raw::new_request_build_error;
@@ -43,6 +42,7 @@ use crate::raw::HttpClient;
 use crate::raw::IncomingAsyncBody;
 use crate::raw::RpBatch;
 use crate::raw::RpDelete;
+use crate::raw::{build_rooted_abs_path, OpRead};
 use crate::services::dropbox::backend::DropboxDeleteBatchResponse;
 use crate::services::dropbox::backend::DropboxDeleteBatchResponseEntry;
 use crate::services::dropbox::error::parse_error;
@@ -71,16 +71,28 @@ impl DropboxCore {
         path.trim_end_matches('/').to_string()
     }
 
-    pub async fn dropbox_get(&self, path: &str) -> 
Result<Response<IncomingAsyncBody>> {
+    pub async fn dropbox_get(
+        &self,
+        path: &str,
+        args: OpRead,
+    ) -> Result<Response<IncomingAsyncBody>> {
         let url: String = 
"https://content.dropboxapi.com/2/files/download".to_string();
         let download_args = DropboxDownloadArgs {
             path: build_rooted_abs_path(&self.root, path),
         };
         let request_payload =
             
serde_json::to_string(&download_args).map_err(new_json_serialize_error)?;
-        let mut request = Request::post(&url)
+
+        let mut req = Request::post(&url)
             .header("Dropbox-API-Arg", request_payload)
-            .header(CONTENT_LENGTH, 0)
+            .header(CONTENT_LENGTH, 0);
+
+        let range = args.range();
+        if !range.is_full() {
+            req = req.header(header::RANGE, range.to_header());
+        }
+
+        let mut request = req
             .body(AsyncBody::Empty)
             .map_err(new_request_build_error)?;
 

Reply via email to