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)?;
