Skip to content

Commit 01b5951

Browse files
committed
refactor(services/cos): migrate to reqsign v2
1 parent 2893a49 commit 01b5951

File tree

5 files changed

+110
-90
lines changed

5 files changed

+110
-90
lines changed

core/Cargo.lock

Lines changed: 20 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/services/cos/Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ http = { workspace = true }
3636
log = { workspace = true }
3737
opendal-core = { path = "../../core", version = "0.55.0", default-features = false }
3838
quick-xml = { workspace = true, features = ["serialize", "overlapped-lists"] }
39-
reqsign = { workspace = true, features = [
40-
"services-tencent",
41-
"reqwest_request",
42-
] }
39+
reqsign-core = { version = "2.0.1", default-features = false }
40+
reqsign-file-read-tokio = { version = "2.0.1", default-features = false }
41+
reqsign-http-send-reqwest = { version = "2.0.1", default-features = false }
42+
reqsign-tencent-cos = { version = "2.0.2", default-features = false }
4343
reqwest = { version = "0.12.24", default-features = false, features = [
4444
"stream",
4545
] }

core/services/cos/src/backend.rs

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,15 @@ use http::Response;
2222
use http::StatusCode;
2323
use http::Uri;
2424
use log::debug;
25-
use reqsign::TencentCosConfig;
26-
use reqsign::TencentCosCredentialLoader;
27-
use reqsign::TencentCosSigner;
25+
use reqsign_core::Context;
26+
use reqsign_core::Env as _;
27+
use reqsign_core::OsEnv;
28+
use reqsign_core::Signer;
29+
use reqsign_file_read_tokio::TokioFileRead;
30+
use reqsign_http_send_reqwest::ReqwestHttpSend;
31+
use reqsign_tencent_cos::DefaultCredentialProvider;
32+
use reqsign_tencent_cos::RequestSigner;
33+
use reqsign_tencent_cos::StaticCredentialProvider;
2834

2935
use super::COS_SCHEME;
3036
use super::config::CosConfig;
@@ -175,21 +181,43 @@ impl Builder for CosBuilder {
175181
let endpoint = uri.host().unwrap().replace(&format!("//{bucket}."), "//");
176182
debug!("backend use endpoint {}", &endpoint);
177183

178-
let mut cfg = TencentCosConfig::default();
179-
if !self.config.disable_config_load {
180-
cfg = cfg.from_env();
181-
}
184+
let os_env = OsEnv;
185+
let envs = os_env.vars();
186+
let ctx = Context::new()
187+
.with_file_read(TokioFileRead)
188+
.with_http_send(ReqwestHttpSend::new(GLOBAL_REQWEST_CLIENT.clone()))
189+
.with_env(os_env);
190+
191+
let mut credential = if self.config.disable_config_load {
192+
DefaultCredentialProvider::builder()
193+
.disable_env(true)
194+
.disable_assume_role(true)
195+
.build()
196+
} else {
197+
DefaultCredentialProvider::new()
198+
};
182199

183-
if let Some(v) = self.config.secret_id {
184-
cfg.secret_id = Some(v);
200+
if let (Some(secret_id), Some(secret_key)) = (
201+
self.config.secret_id.as_deref(),
202+
self.config.secret_key.as_deref(),
203+
) {
204+
let security_token = envs
205+
.get("TENCENTCLOUD_TOKEN")
206+
.or_else(|| envs.get("TENCENTCLOUD_SECURITY_TOKEN"))
207+
.or_else(|| envs.get("QCLOUD_SECRET_TOKEN"));
208+
209+
let static_provider = if self.config.disable_config_load {
210+
StaticCredentialProvider::new(secret_id, secret_key)
211+
} else if let Some(token) = security_token {
212+
StaticCredentialProvider::with_security_token(secret_id, secret_key, token)
213+
} else {
214+
StaticCredentialProvider::new(secret_id, secret_key)
215+
};
216+
217+
credential = credential.push_front(static_provider);
185218
}
186-
if let Some(v) = self.config.secret_key {
187-
cfg.secret_key = Some(v);
188-
}
189-
190-
let cred_loader = TencentCosCredentialLoader::new(GLOBAL_REQWEST_CLIENT.clone(), cfg);
191219

192-
let signer = TencentCosSigner::new();
220+
let signer = Signer::new(ctx, credential, RequestSigner::new());
193221

194222
Ok(CosBackend {
195223
core: Arc::new(CosCore {
@@ -260,7 +288,6 @@ impl Builder for CosBuilder {
260288
root,
261289
endpoint: format!("{}://{}.{}", &scheme, &bucket, &endpoint),
262290
signer,
263-
loader: cred_loader,
264291
}),
265292
})
266293
}
@@ -399,8 +426,8 @@ impl Access for CosBackend {
399426
"operation is not supported",
400427
)),
401428
};
402-
let mut req = req?;
403-
self.core.sign_query(&mut req, args.expire()).await?;
429+
let req = req?;
430+
let req = self.core.sign_query(req, args.expire()).await?;
404431

405432
// We don't need this request anymore, consume it directly.
406433
let (parts, _) = req.into_parts();

core/services/cos/src/core.rs

Lines changed: 37 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,12 @@ use http::header::IF_MATCH;
2929
use http::header::IF_MODIFIED_SINCE;
3030
use http::header::IF_NONE_MATCH;
3131
use http::header::IF_UNMODIFIED_SINCE;
32-
use reqsign::TencentCosCredential;
33-
use reqsign::TencentCosCredentialLoader;
34-
use reqsign::TencentCosSigner;
32+
use reqsign_core::Signer;
33+
use reqsign_tencent_cos::Credential;
3534
use serde::Deserialize;
3635
use serde::Serialize;
3736

3837
use opendal_core::Buffer;
39-
use opendal_core::Error;
40-
use opendal_core::ErrorKind;
4138
use opendal_core::Result;
4239
use opendal_core::raw::*;
4340

@@ -53,8 +50,7 @@ pub struct CosCore {
5350
pub root: String,
5451
pub endpoint: String,
5552

56-
pub signer: TencentCosSigner,
57-
pub loader: TencentCosCredentialLoader,
53+
pub signer: Signer<Credential>,
5854
}
5955

6056
impl Debug for CosCore {
@@ -68,43 +64,26 @@ impl Debug for CosCore {
6864
}
6965

7066
impl CosCore {
71-
async fn load_credential(&self) -> Result<Option<TencentCosCredential>> {
72-
let cred = self
73-
.loader
74-
.load()
75-
.await
76-
.map_err(new_request_credential_error)?;
77-
78-
if let Some(cred) = cred {
79-
return Ok(Some(cred));
80-
}
81-
82-
Err(Error::new(
83-
ErrorKind::PermissionDenied,
84-
"no valid credential found and anonymous access is not allowed",
85-
))
86-
}
67+
pub async fn sign<T>(&self, req: Request<T>) -> Result<Request<T>> {
68+
let (mut parts, body) = req.into_parts();
8769

88-
pub async fn sign<T>(&self, req: &mut Request<T>) -> Result<()> {
89-
let cred = if let Some(cred) = self.load_credential().await? {
90-
cred
91-
} else {
92-
return Ok(());
93-
};
70+
self.signer
71+
.sign(&mut parts, None)
72+
.await
73+
.map_err(|e| new_request_sign_error(e.into()))?;
9474

95-
self.signer.sign(req, &cred).map_err(new_request_sign_error)
75+
Ok(Request::from_parts(parts, body))
9676
}
9777

98-
pub async fn sign_query<T>(&self, req: &mut Request<T>, duration: Duration) -> Result<()> {
99-
let cred = if let Some(cred) = self.load_credential().await? {
100-
cred
101-
} else {
102-
return Ok(());
103-
};
78+
pub async fn sign_query<T>(&self, req: Request<T>, duration: Duration) -> Result<Request<T>> {
79+
let (mut parts, body) = req.into_parts();
10480

10581
self.signer
106-
.sign_query(req, duration, &cred)
107-
.map_err(new_request_sign_error)
82+
.sign(&mut parts, Some(duration))
83+
.await
84+
.map_err(|e| new_request_sign_error(e.into()))?;
85+
86+
Ok(Request::from_parts(parts, body))
10887
}
10988

11089
#[inline]
@@ -120,9 +99,8 @@ impl CosCore {
12099
range: BytesRange,
121100
args: &OpRead,
122101
) -> Result<Response<HttpBody>> {
123-
let mut req = self.cos_get_object_request(path, range, args)?;
124-
125-
self.sign(&mut req).await?;
102+
let req = self.cos_get_object_request(path, range, args)?;
103+
let req = self.sign(req).await?;
126104

127105
self.info.http_client().fetch(req).await
128106
}
@@ -231,9 +209,8 @@ impl CosCore {
231209
}
232210

233211
pub async fn cos_head_object(&self, path: &str, args: &OpStat) -> Result<Response<Buffer>> {
234-
let mut req = self.cos_head_object_request(path, args)?;
235-
236-
self.sign(&mut req).await?;
212+
let req = self.cos_head_object_request(path, args)?;
213+
let req = self.sign(req).await?;
237214

238215
self.send(req).await
239216
}
@@ -293,9 +270,8 @@ impl CosCore {
293270

294271
let req = req.extension(Operation::Delete);
295272

296-
let mut req = req.body(Buffer::new()).map_err(new_request_build_error)?;
297-
298-
self.sign(&mut req).await?;
273+
let req = req.body(Buffer::new()).map_err(new_request_build_error)?;
274+
let req = self.sign(req).await?;
299275

300276
self.send(req).await
301277
}
@@ -345,13 +321,13 @@ impl CosCore {
345321
let source = format!("/{}/{}", self.bucket, percent_encode_path(&source));
346322
let url = format!("{}/{}", self.endpoint, percent_encode_path(&target));
347323

348-
let mut req = Request::put(&url)
324+
let req = Request::put(&url)
349325
.extension(Operation::Copy)
350326
.header("x-cos-copy-source", &source)
351327
.body(Buffer::new())
352328
.map_err(new_request_build_error)?;
353329

354-
self.sign(&mut req).await?;
330+
let req = self.sign(req).await?;
355331

356332
self.send(req).await
357333
}
@@ -380,12 +356,12 @@ impl CosCore {
380356
url = url.push("marker", next_marker);
381357
}
382358

383-
let mut req = Request::get(url.finish())
359+
let req = Request::get(url.finish())
384360
.extension(Operation::List)
385361
.body(Buffer::new())
386362
.map_err(new_request_build_error)?;
387363

388-
self.sign(&mut req).await?;
364+
let req = self.sign(req).await?;
389365

390366
self.send(req).await
391367
}
@@ -422,9 +398,8 @@ impl CosCore {
422398

423399
let req = req.extension(Operation::Write);
424400

425-
let mut req = req.body(Buffer::new()).map_err(new_request_build_error)?;
426-
427-
self.sign(&mut req).await?;
401+
let req = req.body(Buffer::new()).map_err(new_request_build_error)?;
402+
let req = self.sign(req).await?;
428403

429404
self.send(req).await
430405
}
@@ -453,9 +428,8 @@ impl CosCore {
453428
let req = req.extension(Operation::Write);
454429

455430
// Set body
456-
let mut req = req.body(body).map_err(new_request_build_error)?;
457-
458-
self.sign(&mut req).await?;
431+
let req = req.body(body).map_err(new_request_build_error)?;
432+
let req = self.sign(req).await?;
459433

460434
self.send(req).await
461435
}
@@ -486,11 +460,11 @@ impl CosCore {
486460

487461
let req = req.extension(Operation::Write);
488462

489-
let mut req = req
463+
let req = req
490464
.body(Buffer::from(Bytes::from(content)))
491465
.map_err(new_request_build_error)?;
492466

493-
self.sign(&mut req).await?;
467+
let req = self.sign(req).await?;
494468

495469
self.send(req).await
496470
}
@@ -510,11 +484,11 @@ impl CosCore {
510484
percent_encode_path(upload_id)
511485
);
512486

513-
let mut req = Request::delete(&url)
487+
let req = Request::delete(&url)
514488
.extension(Operation::Delete)
515489
.body(Buffer::new())
516490
.map_err(new_request_build_error)?;
517-
self.sign(&mut req).await?;
491+
let req = self.sign(req).await?;
518492
self.send(req).await
519493
}
520494

@@ -547,12 +521,12 @@ impl CosCore {
547521
url = url.push("version-id-marker", &percent_encode_path(version_id_marker));
548522
}
549523

550-
let mut req = Request::get(url.finish())
524+
let req = Request::get(url.finish())
551525
.extension(Operation::List)
552526
.body(Buffer::new())
553527
.map_err(new_request_build_error)?;
554528

555-
self.sign(&mut req).await?;
529+
let req = self.sign(req).await?;
556530

557531
self.send(req).await
558532
}

core/services/cos/src/writer.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,11 @@ impl CosWriter {
6969

7070
impl oio::MultipartWrite for CosWriter {
7171
async fn write_once(&self, size: u64, body: Buffer) -> Result<Metadata> {
72-
let mut req = self
72+
let req = self
7373
.core
7474
.cos_put_object_request(&self.path, Some(size), &self.op, body)?;
7575

76-
self.core.sign(&mut req).await?;
76+
let req = self.core.sign(req).await?;
7777

7878
let resp = self.core.send(req).await?;
7979

@@ -219,11 +219,11 @@ impl oio::AppendWrite for CosWriter {
219219
}
220220

221221
async fn append(&self, offset: u64, size: u64, body: Buffer) -> Result<Metadata> {
222-
let mut req = self
222+
let req = self
223223
.core
224224
.cos_append_object_request(&self.path, offset, size, &self.op, body)?;
225225

226-
self.core.sign(&mut req).await?;
226+
let req = self.core.sign(req).await?;
227227

228228
let resp = self.core.send(req).await?;
229229

0 commit comments

Comments
 (0)