You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by xu...@apache.org on 2025/04/08 11:19:41 UTC

(opendal) branch main updated: chore(services/cos): Use QueryPairsWriter for url write (#5987)

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/opendal.git


The following commit(s) were added to refs/heads/main by this push:
     new 1168beb4c chore(services/cos): Use QueryPairsWriter for url write (#5987)
1168beb4c is described below

commit 1168beb4c34f62e22e61bdfa6dba838d0152a32c
Author: Asuka Minato <i...@asukaminato.eu.org>
AuthorDate: Tue Apr 8 20:19:34 2025 +0900

    chore(services/cos): Use QueryPairsWriter for url write (#5987)
    
    * QueryPairsWriter
    
    * Update core.rs
    
    * allow v to be empty
    
    * save one call
---
 core/src/raw/http_util/uri.rs |  6 ++++--
 core/src/services/cos/core.rs | 42 +++++++++++++++---------------------------
 2 files changed, 19 insertions(+), 29 deletions(-)

diff --git a/core/src/raw/http_util/uri.rs b/core/src/raw/http_util/uri.rs
index da0ec35fd..b74de6677 100644
--- a/core/src/raw/http_util/uri.rs
+++ b/core/src/raw/http_util/uri.rs
@@ -101,8 +101,10 @@ impl QueryPairsWriter {
 
         // Append the key and value to the base string
         self.base.push_str(key);
-        self.base.push('=');
-        self.base.push_str(value);
+        if !value.is_empty() {
+            self.base.push('=');
+            self.base.push_str(value);
+        }
 
         self
     }
diff --git a/core/src/services/cos/core.rs b/core/src/services/cos/core.rs
index 2c5a2b2f2..41b96d691 100644
--- a/core/src/services/cos/core.rs
+++ b/core/src/services/cos/core.rs
@@ -17,7 +17,6 @@
 
 use std::fmt::Debug;
 use std::fmt::Formatter;
-use std::fmt::Write;
 use std::sync::Arc;
 use std::time::Duration;
 
@@ -344,27 +343,22 @@ impl CosCore {
     ) -> Result<Response<Buffer>> {
         let p = build_abs_path(&self.root, path);
 
-        let mut queries = vec![];
+        let mut url = QueryPairsWriter::new(&self.endpoint);
+
         if !p.is_empty() {
-            queries.push(format!("prefix={}", percent_encode_path(&p)));
+            url = url.push("prefix", &percent_encode_path(&p));
         }
         if !delimiter.is_empty() {
-            queries.push(format!("delimiter={delimiter}"));
+            url = url.push("delimiter", delimiter);
         }
         if let Some(limit) = limit {
-            queries.push(format!("max-keys={limit}"));
+            url = url.push("max-keys", &limit.to_string());
         }
         if !next_marker.is_empty() {
-            queries.push(format!("marker={next_marker}"));
+            url = url.push("marker", next_marker);
         }
 
-        let url = if queries.is_empty() {
-            self.endpoint.to_string()
-        } else {
-            format!("{}?{}", self.endpoint, queries.join("&"))
-        };
-
-        let mut req = Request::get(&url)
+        let mut req = Request::get(url.finish())
             .body(Buffer::new())
             .map_err(new_request_build_error)?;
 
@@ -503,32 +497,26 @@ impl CosCore {
     ) -> Result<Response<Buffer>> {
         let p = build_abs_path(&self.root, prefix);
 
-        let mut url = format!("{}?versions", self.endpoint);
+        let mut url = QueryPairsWriter::new(&self.endpoint);
+        url = url.push("versions", "");
         if !p.is_empty() {
-            write!(url, "&prefix={}", percent_encode_path(p.as_str()))
-                .expect("write into string must succeed");
+            url = url.push("prefix", &percent_encode_path(p.as_str()));
         }
         if !delimiter.is_empty() {
-            write!(url, "&delimiter={}", delimiter).expect("write into string must succeed");
+            url = url.push("delimiter", delimiter);
         }
 
         if let Some(limit) = limit {
-            write!(url, "&max-keys={}", limit).expect("write into string must succeed");
+            url = url.push("max-keys", &limit.to_string());
         }
         if !key_marker.is_empty() {
-            write!(url, "&key-marker={}", percent_encode_path(key_marker))
-                .expect("write into string must succeed");
+            url = url.push("key-marker", &percent_encode_path(key_marker));
         }
         if !version_id_marker.is_empty() {
-            write!(
-                url,
-                "&version-id-marker={}",
-                percent_encode_path(version_id_marker)
-            )
-            .expect("write into string must succeed");
+            url = url.push("version-id-marker", &percent_encode_path(version_id_marker));
         }
 
-        let mut req = Request::get(&url)
+        let mut req = Request::get(url.finish())
             .body(Buffer::new())
             .map_err(new_request_build_error)?;