From 5155a52f94781fd52fb44aa53935d7bd35084ac9 Mon Sep 17 00:00:00 2001 From: Rong Zhou Date: Thu, 21 Jul 2022 14:42:44 +0800 Subject: [PATCH 1/7] add debug log for http-client call --- http-client/src/client/call/ip_addrs.rs | 31 ++++++++++++++++++++ http-client/src/client/call/ip_addrs_set.rs | 21 +++++++++++-- http-client/src/client/call/mod.rs | 1 + http-client/src/client/call/request_call.rs | 3 ++ http-client/src/client/call/try_endpoints.rs | 22 ++++++++++++-- 5 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 http-client/src/client/call/ip_addrs.rs diff --git a/http-client/src/client/call/ip_addrs.rs b/http-client/src/client/call/ip_addrs.rs new file mode 100644 index 00000000..7d4c2f2d --- /dev/null +++ b/http-client/src/client/call/ip_addrs.rs @@ -0,0 +1,31 @@ +use super::super::super::IpAddrWithPort; +use std::fmt::{self, Display}; + +#[derive(Default, Debug)] +pub(super) struct IpAddrs(Vec); + +impl From for Vec { + fn from(ips: IpAddrs) -> Self { + ips.0 + } +} + +impl From> for IpAddrs { + fn from(ips: Vec) -> Self { + Self(ips) + } +} + +impl Display for IpAddrs { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "[")?; + for (i, ip) in self.0.iter().enumerate() { + if i > 0 { + write!(f, ", ")?; + } + write!(f, "{}", ip)?; + } + write!(f, "]")?; + Ok(()) + } +} diff --git a/http-client/src/client/call/ip_addrs_set.rs b/http-client/src/client/call/ip_addrs_set.rs index 198732c2..31893fff 100644 --- a/http-client/src/client/call/ip_addrs_set.rs +++ b/http-client/src/client/call/ip_addrs_set.rs @@ -1,7 +1,10 @@ use super::super::super::IpAddrWithPort; -use std::collections::HashSet; +use std::{ + collections::HashSet, + fmt::{self, Display}, +}; -#[derive(Default)] +#[derive(Default, Debug)] pub(super) struct IpAddrsSet { set: HashSet, ordered: Vec, @@ -50,3 +53,17 @@ impl IpAddrsSet { .collect() } } + +impl Display for IpAddrsSet { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "[")?; + for (i, ip) in self.ordered.iter().enumerate() { + if i > 0 { + write!(f, ", ")?; + } + write!(f, "{}", ip)?; + } + write!(f, "]")?; + Ok(()) + } +} diff --git a/http-client/src/client/call/mod.rs b/http-client/src/client/call/mod.rs index ea555d44..de2f98ca 100644 --- a/http-client/src/client/call/mod.rs +++ b/http-client/src/client/call/mod.rs @@ -1,5 +1,6 @@ mod domain_or_ip_addr; mod error; +mod ip_addrs; mod ip_addrs_set; mod request_call; mod send_http_request; diff --git a/http-client/src/client/call/request_call.rs b/http-client/src/client/call/request_call.rs index 24f42ad0..d6d2e9ce 100644 --- a/http-client/src/client/call/request_call.rs +++ b/http-client/src/client/call/request_call.rs @@ -8,6 +8,7 @@ use super::{ ip_addrs_set::IpAddrsSet, try_endpoints::try_endpoints, }; +use log::debug; use qiniu_http::Extensions; pub(in super::super) fn request_call( @@ -34,6 +35,7 @@ pub(in super::super) fn request_call( { let (_, extensions) = err.split(); retried.switch_to_alternative_endpoints(); + debug!("Switch to alternative endpoints"); try_alternative_endpoints( endpoints.alternative(), &parts, @@ -103,6 +105,7 @@ pub(in super::super) async fn async_request_call( { let (_, extensions) = err.split(); retried.switch_to_alternative_endpoints(); + debug!("Switch to alternative endpoints"); try_alternative_endpoints( endpoints.alternative(), &parts, diff --git a/http-client/src/client/call/try_endpoints.rs b/http-client/src/client/call/try_endpoints.rs index 833f9eec..cbe4dd8f 100644 --- a/http-client/src/client/call/try_endpoints.rs +++ b/http-client/src/client/call/try_endpoints.rs @@ -5,10 +5,12 @@ use super::{ }, domain_or_ip_addr::DomainOrIpAddr, error::{TryError, TryErrorWithExtensions}, + ip_addrs::IpAddrs, ip_addrs_set::IpAddrsSet, try_domain_or_ip_addr::try_domain_or_ip_addr, utils::{choose, find_domains_with_port, find_ip_addr_with_port, resolve}, }; +use log::debug; use qiniu_http::{Extensions, SyncRequestBody}; use std::mem::take; use tap::TapFallible; @@ -25,6 +27,7 @@ pub(super) fn try_endpoints( let mut last_error: Option = None; for domain_with_port in find_domains_with_port(endpoints) { + debug!("Try domain with port: {}", domain_with_port); match try_domain_with_port( domain_with_port, tried_ips, @@ -49,6 +52,7 @@ pub(super) fn try_endpoints( let ips = find_ip_addr_with_port(endpoints).copied().collect::>(); if !ips.is_empty() { + debug!("Try IPs with port: {:?}", ips); match try_ips( &ips, tried_ips, @@ -86,6 +90,7 @@ pub(super) fn try_endpoints( ) -> Result> { retried.switch_endpoint(); return if parts.http_client().http_caller().is_resolved_ip_addrs_supported() { + debug!("Try domain with resolver: {}", domain_with_port); with_resolver( domain_with_port, tried_ips, @@ -96,6 +101,7 @@ pub(super) fn try_endpoints( is_endpoints_alternative, ) } else { + debug!("Try domain without resolver: {}", domain_with_port); without_resolver( domain_with_port, parts, @@ -211,8 +217,10 @@ pub(super) fn try_endpoints( remaining_ips.difference_slice(&chosen_ips); tried_ips.union_slice(&chosen_ips); retried.switch_ips(); + let chosen_ips = IpAddrs::from(chosen_ips); + debug!("Try domain with IPs: {}({})", domain_with_port, chosen_ips); match try_domain_or_single_ip( - &DomainOrIpAddr::new_from_domain(domain_with_port.to_owned(), chosen_ips), + &DomainOrIpAddr::new_from_domain(domain_with_port.to_owned(), chosen_ips.into()), parts, body, take(extensions), @@ -244,6 +252,7 @@ pub(super) fn try_endpoints( ips }; loop { + debug!("Try IPs: {}", remaining_ips); match try_remaining_ips( &mut remaining_ips, tried_ips, @@ -293,6 +302,7 @@ pub(super) fn try_endpoints( tried_ips.union_slice(&chosen_ips); for chosen_ip in chosen_ips.into_iter() { retried.switch_endpoint(); + debug!("Try single IP: {}", chosen_ip); match try_single_ip(chosen_ip, parts, body, extensions, retried, is_endpoints_alternative) { Ok(response) => return Ok(response), Err(SingleTryFlow::TryAgain(err)) => { @@ -379,6 +389,7 @@ pub(super) async fn async_try_endpoints( let mut last_error: Option = None; for domain_with_port in find_domains_with_port(endpoints) { + debug!("Try domain with port: {}", domain_with_port); match try_domain_with_port( domain_with_port, tried_ips, @@ -405,6 +416,7 @@ pub(super) async fn async_try_endpoints( let ips = find_ip_addr_with_port(endpoints).copied().collect::>(); if !ips.is_empty() { + debug!("Try IPs with port: {:?}", ips); match try_ips( &ips, tried_ips, @@ -444,6 +456,7 @@ pub(super) async fn async_try_endpoints( ) -> Result> { retried.switch_endpoint(); return if parts.http_client().http_caller().is_resolved_ip_addrs_supported() { + debug!("Try domain with resolver: {}", domain_with_port); with_resolver( domain_with_port, tried_ips, @@ -455,6 +468,7 @@ pub(super) async fn async_try_endpoints( ) .await } else { + debug!("Try domain without resolver: {}", domain_with_port); without_resolver( domain_with_port, parts, @@ -575,8 +589,10 @@ pub(super) async fn async_try_endpoints( remaining_ips.difference_slice(&chosen_ips); tried_ips.union_slice(&chosen_ips); retried.switch_ips(); + let chosen_ips = IpAddrs::from(chosen_ips); + debug!("Try domain with IPs: {}({})", domain_with_port, chosen_ips); match try_domain_or_single_ip( - &DomainOrIpAddr::new_from_domain(domain_with_port.to_owned(), chosen_ips), + &DomainOrIpAddr::new_from_domain(domain_with_port.to_owned(), chosen_ips.into()), parts, body, take(extensions), @@ -610,6 +626,7 @@ pub(super) async fn async_try_endpoints( ips }; loop { + debug!("Try IPs: {}", remaining_ips); match try_remaining_ips( &mut remaining_ips, tried_ips, @@ -662,6 +679,7 @@ pub(super) async fn async_try_endpoints( tried_ips.union_slice(&chosen_ips); for chosen_ip in chosen_ips.into_iter() { retried.switch_endpoint(); + debug!("Try single IP: {}", chosen_ip); match try_single_ip(chosen_ip, parts, body, extensions, retried, is_endpoints_alternative).await { Ok(response) => return Ok(response), Err(SingleTryFlow::TryAgain(err)) => { From b7c990c71b9b889bb68e712e093f9f6f14f286ee Mon Sep 17 00:00:00 2001 From: Rong Zhou Date: Thu, 28 Jul 2022 13:51:38 +0800 Subject: [PATCH 2/7] fix typo in docs --- http-client/src/client/authorization.rs | 2 +- .../bucket_domains_provider.rs | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/http-client/src/client/authorization.rs b/http-client/src/client/authorization.rs index 5c20b8bc..ae7bf794 100644 --- a/http-client/src/client/authorization.rs +++ b/http-client/src/client/authorization.rs @@ -32,7 +32,7 @@ pub trait AuthorizationProvider: Clone + Debug + Sync + Send { /// 该方法的异步版本为 [`Self::async_sign`]。 fn sign(&self, request: &mut SyncRequest) -> AuthorizationResult<()>; - /// 使用指定的鉴权方式对 HTTP 请求进行异步签名 + /// 使用指定的鉴权方式对异步 HTTP 请求进行签名 #[cfg(feature = "async")] #[cfg_attr(feature = "docs", doc(cfg(feature = "async")))] fn async_sign<'a>(&'a self, request: &'a mut AsyncRequest<'_>) -> BoxFuture<'a, AuthorizationResult<()>>; diff --git a/http-client/src/regions/endpoints_provider/bucket_domains_provider.rs b/http-client/src/regions/endpoints_provider/bucket_domains_provider.rs index 4e844289..d2ebeb83 100644 --- a/http-client/src/regions/endpoints_provider/bucket_domains_provider.rs +++ b/http-client/src/regions/endpoints_provider/bucket_domains_provider.rs @@ -81,19 +81,19 @@ pub struct BucketDomainsQueryerBuilder { } impl BucketDomainsQueryer { - /// 创建存储空间绑定区域查询构建器 + /// 创建存储空间绑定域名查询构建器 #[inline] pub fn builder() -> BucketDomainsQueryerBuilder { BucketDomainsQueryerBuilder::new() } - /// 创建存储空间绑定区域查询器 + /// 创建存储空间绑定域名查询器 #[inline] pub fn new() -> BucketDomainsQueryer { BucketDomainsQueryerBuilder::new().build() } - /// 查询存储空间相关区域 + /// 查询存储空间相关域名 pub fn query( &self, credential: impl CredentialProvider + 'static, @@ -127,7 +127,7 @@ impl Default for BucketDomainsQueryerBuilder { } impl BucketDomainsQueryerBuilder { - /// 创建存储空间绑定区域查询构建器 + /// 创建存储空间绑定域名查询构建器 #[inline] pub fn new() -> Self { Self::default() @@ -168,7 +168,7 @@ impl BucketDomainsQueryerBuilder { self } - /// 从文件系统加载或构建存储空间绑定区域查询器 + /// 从文件系统加载或构建存储空间绑定域名查询器 /// /// 可以选择是否启用自动持久化缓存功能 pub fn load_or_create_from(&mut self, path: impl AsRef, auto_persistent: bool) -> BucketDomainsQueryer { @@ -187,13 +187,13 @@ impl BucketDomainsQueryerBuilder { } } - /// 从默认文件系统路径加载或构建存储空间绑定区域查询器,并启用自动持久化缓存功能 + /// 从默认文件系统路径加载或构建存储空间绑定域名查询器,并启用自动持久化缓存功能 #[inline] pub fn build(&mut self) -> BucketDomainsQueryer { self.default_load_or_create_from(true) } - /// 从默认文件系统路径加载或构建存储空间绑定区域查询器 + /// 从默认文件系统路径加载或构建存储空间绑定域名查询器 /// /// 可以选择是否启用自动持久化缓存功能 pub fn default_load_or_create_from(&mut self, auto_persistent: bool) -> BucketDomainsQueryer { @@ -211,7 +211,7 @@ impl BucketDomainsQueryerBuilder { } } - /// 构建存储空间绑定区域查询器 + /// 构建存储空间绑定域名查询器 /// /// 不启用文件系统持久化缓存 pub fn in_memory(&mut self) -> BucketDomainsQueryer { @@ -226,7 +226,7 @@ impl BucketDomainsQueryerBuilder { } } -/// 存储空间绑定区域获取器 +/// 存储空间绑定域名获取器 #[derive(Debug, Clone)] pub struct BucketDomainsProvider { queryer: BucketDomainsQueryer, From da5311b122ab881fa323663c8ed46f6263797844 Mon Sep 17 00:00:00 2001 From: Rong Zhou Date: Mon, 1 Aug 2022 17:22:25 +0800 Subject: [PATCH 3/7] fix clippy --- http-client/src/regions/endpoint.rs | 54 ++++++++----------------- objects-manager/src/batch_operations.rs | 8 ++-- 2 files changed, 21 insertions(+), 41 deletions(-) diff --git a/http-client/src/regions/endpoint.rs b/http-client/src/regions/endpoint.rs index adafe019..c0d352b0 100644 --- a/http-client/src/regions/endpoint.rs +++ b/http-client/src/regions/endpoint.rs @@ -588,62 +588,42 @@ mod tests { #[test] fn test_from_str_to_ip_addr_with_port() -> Result<(), Box> { - let mut result: Result = "".parse(); - assert!(result.is_err()); - - result = "/".parse(); - assert!(result.is_err()); - - result = ":".parse(); - assert!(result.is_err()); - - result = ":8080".parse(); - assert!(result.is_err()); - - result = "127.0.0.1:8080".parse(); + "".parse::().unwrap_err(); + "/".parse::().unwrap_err(); + ":".parse::().unwrap_err(); + ":8080".parse::().unwrap_err(); + let ip = "127.0.0.1:8080".parse::()?; assert_eq!( - result.unwrap(), + ip, IpAddrWithPort::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), NonZeroU16::new(8080)), ); - result = "127.0.0.1:65536".parse(); - assert!(result.is_err()); + "127.0.0.1:65536".parse::().unwrap_err(); - result = "fe80::e31c:b4e6:5919:728f".parse(); + let ip = "fe80::e31c:b4e6:5919:728f".parse::()?; assert_eq!( - result.unwrap(), + ip, IpAddrWithPort::new( IpAddr::V6(Ipv6Addr::new(0xfe80, 0, 0, 0, 0xe31c, 0xb4e6, 0x5919, 0x728f,)), None ), ); - result = "[fe80::e31c:b4e6:5919:728f]:8080".parse(); + let ip = "[fe80::e31c:b4e6:5919:728f]:8080".parse::()?; assert_eq!( - result.unwrap(), + ip, IpAddrWithPort::new( IpAddr::V6(Ipv6Addr::new(0xfe80, 0, 0, 0, 0xe31c, 0xb4e6, 0x5919, 0x728f,)), NonZeroU16::new(8080) ), ); - result = "[127.0.0.1]:8080".parse(); - assert!(result.is_err()); - - result = "8080:8080".parse(); - assert!(result.is_err()); - - result = "8080".parse(); - assert!(result.is_err()); - - result = "8080:".parse(); - assert!(result.is_err()); - - result = "domain:".parse(); - assert!(result.is_err()); - - result = "domain:8080".parse(); - assert!(result.is_err()); + "[127.0.0.1]:8080".parse::().unwrap_err(); + "8080:8080".parse::().unwrap_err(); + "8080".parse::().unwrap_err(); + "8080:".parse::().unwrap_err(); + "domain:".parse::().unwrap_err(); + "domain:8080".parse::().unwrap_err(); Ok(()) } diff --git a/objects-manager/src/batch_operations.rs b/objects-manager/src/batch_operations.rs index 907209b0..963be10b 100644 --- a/objects-manager/src/batch_operations.rs +++ b/objects-manager/src/batch_operations.rs @@ -591,11 +591,11 @@ mod tests { let mut ops = batch_ops(&bucket); let mut iter = ops.call(); for _ in 0..5 { - assert!(iter.next().unwrap().is_ok()); + iter.next().unwrap().unwrap(); } assert_eq!( iter.next().unwrap().unwrap_err().kind(), - ResponseErrorKind::StatusCodeError(StatusCode::from_u16(612).unwrap()) + ResponseErrorKind::StatusCodeError(StatusCode::from_u16(612)?) ); Ok(()) } @@ -655,11 +655,11 @@ mod tests { let mut ops = batch_ops(&bucket); let mut iter = ops.async_call(); for _ in 0..5 { - assert!(iter.next().await.unwrap().is_ok()); + iter.next().await.unwrap().unwrap(); } assert_eq!( iter.next().await.unwrap().unwrap_err().kind(), - ResponseErrorKind::StatusCodeError(StatusCode::from_u16(612).unwrap()) + ResponseErrorKind::StatusCodeError(StatusCode::from_u16(612)?) ); Ok(()) } From f53bd4f47c0f6637619d813fec09a81e3d8c63fc Mon Sep 17 00:00:00 2001 From: Rong Zhou Date: Mon, 8 Aug 2022 18:01:50 +0800 Subject: [PATCH 4/7] fix wrong code in README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f755b9ee..2f87be7b 100644 --- a/README.md +++ b/README.md @@ -232,8 +232,8 @@ let mut uploader: AutoUploader = upload_manager.auto_uploader(); let params = AutoUploaderObjectParams::builder() .object_name(object_name) .file_name(object_name) - .insert_metadata("x:fname", "123.jpg") - .insert_metadata("x:age", "20") + .insert_custom_var("fname", "123.jpg") + .insert_custom_var("age", "20") .build(); uploader.upload_path("/home/qiniu/test.mp4", params)?; ``` From 888f89d8d815e3b396b9c669b691efea611d85f3 Mon Sep 17 00:00:00 2001 From: Rong Zhou Date: Tue, 9 Aug 2022 11:05:40 +0800 Subject: [PATCH 5/7] now set use_https in ObjectsManager / UploadManager works for query either --- objects-manager/src/objects_manager.rs | 22 +++++++++++++--------- upload-manager/src/upload_manager.rs | 22 +++++++++++++--------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/objects-manager/src/objects_manager.rs b/objects-manager/src/objects_manager.rs index 01d393ec..1f228ee8 100644 --- a/objects-manager/src/objects_manager.rs +++ b/objects-manager/src/objects_manager.rs @@ -117,14 +117,9 @@ impl ObjectsManagerBuilder { /// 设置 HTTP 客户端 pub fn http_client(&mut self, http_client: HttpClient) -> &mut Self { self.http_client = Some(http_client.to_owned()); - if let Some(queryer_builder) = self.queryer_builder.as_mut() { - queryer_builder.http_client(http_client); - } else { - let mut queryer_builder = BucketRegionsQueryer::builder(); + self.with_queryer_builder(|queryer_builder| { queryer_builder.http_client(http_client); - self.queryer_builder = Some(queryer_builder); - } - self + }) } /// 是否启用 HTTPS 协议 @@ -132,6 +127,9 @@ impl ObjectsManagerBuilder { /// 默认为 HTTPS 协议 pub fn use_https(&mut self, use_https: bool) -> &mut Self { self.http_client(HttpClient::build_default().use_https(use_https).build()) + .with_queryer_builder(|queryer_builder| { + queryer_builder.use_https(use_https); + }) } /// 设置存储空间相关区域查询器 @@ -143,11 +141,17 @@ impl ObjectsManagerBuilder { /// 设置存储空间管理终端地址 pub fn uc_endpoints(&mut self, endpoints: impl Into) -> &mut Self { - if let Some(queryer_builder) = self.queryer_builder.as_mut() { + self.with_queryer_builder(|queryer_builder| { queryer_builder.uc_endpoints(endpoints); + }) + } + + fn with_queryer_builder(&mut self, f: impl FnOnce(&mut BucketRegionsQueryerBuilder)) -> &mut Self { + if let Some(queryer_builder) = self.queryer_builder.as_mut() { + f(queryer_builder); } else { let mut queryer_builder = BucketRegionsQueryer::builder(); - queryer_builder.uc_endpoints(endpoints); + f(&mut queryer_builder); self.queryer_builder = Some(queryer_builder); } self diff --git a/upload-manager/src/upload_manager.rs b/upload-manager/src/upload_manager.rs index 59b4dea5..ec9a9bf9 100644 --- a/upload-manager/src/upload_manager.rs +++ b/upload-manager/src/upload_manager.rs @@ -146,14 +146,9 @@ impl UploadManagerBuilder { /// 设置 HTTP 客户端 pub fn http_client(&mut self, http_client: HttpClient) -> &mut Self { self.http_client = Some(http_client.to_owned()); - if let Some(queryer_builder) = self.queryer_builder.as_mut() { - queryer_builder.http_client(http_client); - } else { - let mut queryer_builder = BucketRegionsQueryer::builder(); + self.with_queryer_builder(|queryer_builder| { queryer_builder.http_client(http_client); - self.queryer_builder = Some(queryer_builder); - } - self + }) } /// 是否启用 HTTPS 协议 @@ -161,6 +156,9 @@ impl UploadManagerBuilder { /// 默认为 HTTPS 协议 pub fn use_https(&mut self, use_https: bool) -> &mut Self { self.http_client(HttpClient::build_default().use_https(use_https).build()) + .with_queryer_builder(|queryer_builder| { + queryer_builder.use_https(use_https); + }) } /// 设置存储空间相关区域查询器 @@ -172,11 +170,17 @@ impl UploadManagerBuilder { /// 设置存储空间管理终端地址 pub fn uc_endpoints(&mut self, endpoints: impl Into) -> &mut Self { - if let Some(queryer_builder) = self.queryer_builder.as_mut() { + self.with_queryer_builder(|queryer_builder| { queryer_builder.uc_endpoints(endpoints); + }) + } + + fn with_queryer_builder(&mut self, f: impl FnOnce(&mut BucketRegionsQueryerBuilder)) -> &mut Self { + if let Some(queryer_builder) = self.queryer_builder.as_mut() { + f(queryer_builder); } else { let mut queryer_builder = BucketRegionsQueryer::builder(); - queryer_builder.uc_endpoints(endpoints); + f(&mut queryer_builder); self.queryer_builder = Some(queryer_builder); } self From eefd0fbaee3ef17ae8f1d15a8d9154ab68a601e2 Mon Sep 17 00:00:00 2001 From: Rong Zhou Date: Tue, 9 Aug 2022 15:08:11 +0800 Subject: [PATCH 6/7] add marker() for ListIter / ListStream --- objects-manager/src/list.rs | 226 +++++++++++++++++++++--------------- 1 file changed, 132 insertions(+), 94 deletions(-) diff --git a/objects-manager/src/list.rs b/objects-manager/src/list.rs index d6d87af7..a6bc0cb6 100644 --- a/objects-manager/src/list.rs +++ b/objects-manager/src/list.rs @@ -135,6 +135,13 @@ pub struct ListIter<'a> { callbacks: Callbacks<'a>, } +impl ListIter<'_> { + /// 获取上一次列举返回的位置标记 + pub fn marker(&self) -> Option<&str> { + self.params.marker.as_ref() + } +} + impl Debug for ListIter<'_> { #[inline] fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -458,10 +465,7 @@ impl Iterator for ListIter<'_> { #[cfg(feature = "async")] mod async_list_stream { use super::*; - use futures::{ - future::BoxFuture, io::Lines as AsyncLines, ready, stream::BoxStream, AsyncBufReadExt, FutureExt, Stream, - StreamExt, - }; + use futures::{future::BoxFuture, io::Lines as AsyncLines, ready, AsyncBufReadExt, FutureExt, Stream, StreamExt}; use std::{ fmt::{self, Debug}, io::Result as IOResult, @@ -510,7 +514,11 @@ mod async_list_stream { } } - type ListedObjectEntryResultStream<'a> = BoxStream<'a, ApiResult>; + trait StreamWithMarker: Stream { + fn marker(&self) -> Option<&str>; + } + type BoxStreamWithMarker<'a, T> = Pin + Send + 'a>>; + type ListedObjectEntryResultStream<'a> = BoxStreamWithMarker<'a, ApiResult>; /// 对象列举流 /// @@ -543,6 +551,11 @@ mod async_list_stream { assert_impl!(Send: Self); // assert_impl!(Sync: Self); } + + /// 获取上一次列举返回的位置标记 + pub fn marker(&self) -> Option<&str> { + self.0.marker() + } } impl Stream for ListStream<'_> { @@ -583,12 +596,11 @@ mod async_list_stream { limit: Limit::new(limit, ListVersion::V1), marker: Marker::new(marker), }; - ListV1Stream { + Box::pin(ListV1Stream { params, callbacks, current_step: Default::default(), - } - .boxed() + }) } impl Stream for ListV1Stream<'_> { @@ -605,6 +617,12 @@ mod async_list_stream { } } + impl StreamWithMarker for ListV1Stream<'_> { + fn marker(&self) -> Option<&str> { + self.params.marker.as_ref() + } + } + impl ListV1Stream<'_> { fn read_from_buffer(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll::Item>> { if let AsyncListV1Step::FromBuffer { buffer } = &mut self.current_step { @@ -730,12 +748,11 @@ mod async_list_stream { limit: Limit::new(limit, ListVersion::V2), marker: Marker::new(marker), }; - ListV2Stream { + Box::pin(ListV2Stream { params, callbacks, current_step: Default::default(), - } - .boxed() + }) } impl Stream for ListV2Stream<'_> { @@ -753,6 +770,12 @@ mod async_list_stream { } } + impl StreamWithMarker for ListV2Stream<'_> { + fn marker(&self) -> Option<&str> { + self.params.marker.as_ref() + } + } + impl ListV2Stream<'_> { fn start(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll::Item>> { if let AsyncListV2Step::Start { .. } = &mut self.current_step { @@ -977,18 +1000,16 @@ mod tests { } let mut counter = 0usize; - for (i, entry) in get_bucket(FakeHttpCaller::default()) - .list() - .version(ListVersion::V1) - .iter() - .enumerate() - { + let bucket = get_bucket(FakeHttpCaller::default()); + let mut iter = bucket.list().version(ListVersion::V1).iter(); + for (i, entry) in (&mut iter).enumerate() { counter += 1; let entry = entry?; assert_eq!(entry.get_key_as_str(), &format!("fakeobj{}", i + 1)); assert_eq!(entry.get_hash_as_str(), &format!("fakeobj{}hash", i + 1)); assert_eq!(entry.get_size_as_u64(), i as u64 + 1); } + assert_eq!(iter.marker(), Some("")); assert_eq!(counter, 4usize); Ok(()) @@ -1110,6 +1131,7 @@ mod tests { ResponseErrorKind::StatusCodeError(StatusCode::from_u16(599)?) ); assert!(iter.next().is_none()); + assert_eq!(iter.marker(), Some("fakemarker")); assert_eq!(before_request_callback_counter.load(Ordering::Relaxed), 2usize); assert_eq!(after_response_ok_callback_counter.load(Ordering::Relaxed), 1usize); assert_eq!(after_response_error_callback_counter.load(Ordering::Relaxed), 1usize); @@ -1190,20 +1212,16 @@ mod tests { } let mut counter = 0usize; - for (i, entry) in get_bucket(FakeHttpCaller::default()) - .list() - .version(ListVersion::V1) - .prefix("fakeobj") - .limit(3) - .iter() - .enumerate() - { + let bucket = get_bucket(FakeHttpCaller::default()); + let mut iter = bucket.list().version(ListVersion::V1).prefix("fakeobj").limit(3).iter(); + for (i, entry) in (&mut iter).enumerate() { counter += 1; let entry = entry?; assert_eq!(entry.get_key_as_str(), &format!("fakeobj{}", i + 1)); assert_eq!(entry.get_hash_as_str(), &format!("fakeobj{}hash", i + 1)); assert_eq!(entry.get_size_as_u64(), i as u64 + 1); } + assert_eq!(iter.marker(), Some("")); assert_eq!(counter, 3usize); Ok(()) @@ -1262,35 +1280,41 @@ mod tests { } } - let counter = AtomicUsize::new(0); - for (i, entry) in get_bucket(FakeHttpCaller::default()) - .list() - .version(ListVersion::V1) - .before_request_callback(|_| { - if counter.load(Ordering::Relaxed) > 0 { - CallbackResult::Cancel + let counter = Arc::new(AtomicUsize::new(0)); + let bucket = get_bucket(FakeHttpCaller::default()); + { + let mut iter = bucket + .list() + .version(ListVersion::V1) + .before_request_callback({ + let counter = counter.to_owned(); + move |_| { + if counter.load(Ordering::Relaxed) > 0 { + CallbackResult::Cancel + } else { + CallbackResult::Continue + } + } + }) + .iter(); + for (i, entry) in (&mut iter).enumerate() { + if counter.fetch_add(1, Ordering::Relaxed) < 2 { + let entry = entry?; + assert_eq!(entry.get_key_as_str(), &format!("fakeobj{}", i + 1)); + assert_eq!(entry.get_hash_as_str(), &format!("fakeobj{}hash", i + 1)); + assert_eq!(entry.get_size_as_u64(), i as u64 + 1); } else { - CallbackResult::Continue + let err = entry.unwrap_err(); + assert!(matches!( + err.kind(), + ResponseErrorKind::HttpError(HttpResponseErrorKind::UserCanceled { .. }) + )); + break; } - }) - .iter() - .enumerate() - { - if counter.fetch_add(1, Ordering::Relaxed) < 2 { - let entry = entry?; - assert_eq!(entry.get_key_as_str(), &format!("fakeobj{}", i + 1)); - assert_eq!(entry.get_hash_as_str(), &format!("fakeobj{}hash", i + 1)); - assert_eq!(entry.get_size_as_u64(), i as u64 + 1); - } else { - let err = entry.unwrap_err(); - assert!(matches!( - err.kind(), - ResponseErrorKind::HttpError(HttpResponseErrorKind::UserCanceled { .. }) - )); - break; } + assert_eq!(iter.marker(), Some("fakemarker")); } - assert_eq!(counter.into_inner(), 3usize); + assert_eq!(Arc::try_unwrap(counter).unwrap().into_inner(), 3usize); Ok(()) } @@ -1391,12 +1415,9 @@ mod tests { } let mut counter = 0usize; - for (i, entry) in get_bucket(FakeHttpCaller::default()) - .list() - .version(ListVersion::V2) - .iter() - .enumerate() - { + let bucket = get_bucket(FakeHttpCaller::default()); + let mut iter = bucket.list().version(ListVersion::V2).iter(); + for (i, entry) in (&mut iter).enumerate() { counter += 1; let entry = entry?; assert_eq!(entry.get_key_as_str(), &format!("fakeobj{}", i + 1)); @@ -1404,6 +1425,7 @@ mod tests { assert_eq!(entry.get_size_as_u64(), i as u64 + 1); } assert_eq!(counter, 4usize); + assert_eq!(iter.marker(), Some("")); Ok(()) } @@ -1531,6 +1553,7 @@ mod tests { ResponseErrorKind::StatusCodeError(StatusCode::from_u16(599)?) ); assert!(iter.next().is_none()); + assert_eq!(iter.marker(), Some("fakemarkerobj2")); assert_eq!(before_request_callback_counter.load(Ordering::Relaxed), 2usize); assert_eq!(after_response_ok_callback_counter.load(Ordering::Relaxed), 1usize); assert_eq!(after_response_error_callback_counter.load(Ordering::Relaxed), 1usize); @@ -1598,35 +1621,41 @@ mod tests { } } - let counter = AtomicUsize::new(0); - for (i, entry) in get_bucket(FakeHttpCaller::default()) - .list() - .version(ListVersion::V2) - .before_request_callback(|_| { - if counter.load(Ordering::Relaxed) > 0 { - CallbackResult::Cancel + let counter = Arc::new(AtomicUsize::new(0)); + let bucket = get_bucket(FakeHttpCaller::default()); + { + let mut iter = bucket + .list() + .version(ListVersion::V2) + .before_request_callback({ + let counter = counter.to_owned(); + move |_| { + if counter.load(Ordering::Relaxed) > 0 { + CallbackResult::Cancel + } else { + CallbackResult::Continue + } + } + }) + .iter(); + for (i, entry) in (&mut iter).enumerate() { + if counter.fetch_add(1, Ordering::Relaxed) < 2 { + let entry = entry?; + assert_eq!(entry.get_key_as_str(), &format!("fakeobj{}", i + 1)); + assert_eq!(entry.get_hash_as_str(), &format!("fakeobj{}hash", i + 1)); + assert_eq!(entry.get_size_as_u64(), i as u64 + 1); } else { - CallbackResult::Continue + let err = entry.unwrap_err(); + assert!(matches!( + err.kind(), + ResponseErrorKind::HttpError(HttpResponseErrorKind::UserCanceled { .. }) + )); + break; } - }) - .iter() - .enumerate() - { - if counter.fetch_add(1, Ordering::Relaxed) < 2 { - let entry = entry?; - assert_eq!(entry.get_key_as_str(), &format!("fakeobj{}", i + 1)); - assert_eq!(entry.get_hash_as_str(), &format!("fakeobj{}hash", i + 1)); - assert_eq!(entry.get_size_as_u64(), i as u64 + 1); - } else { - let err = entry.unwrap_err(); - assert!(matches!( - err.kind(), - ResponseErrorKind::HttpError(HttpResponseErrorKind::UserCanceled { .. }) - )); - break; } + assert_eq!(iter.marker(), Some("fakemarkerobj2")); } - assert_eq!(counter.into_inner(), 3usize); + assert_eq!(Arc::try_unwrap(counter).unwrap().into_inner(), 3usize); Ok(()) } @@ -1713,14 +1742,16 @@ mod tests { let mut counter = 0usize; let bucket = get_bucket(FakeHttpCaller::default()); - let mut stream = bucket.list().version(ListVersion::V1).stream().enumerate(); - while let Some((i, entry)) = stream.next().await { + let mut stream = bucket.list().version(ListVersion::V1).stream(); + let mut iter = (&mut stream).enumerate(); + while let Some((i, entry)) = iter.next().await { counter += 1; let entry = entry?; assert_eq!(entry.get_key_as_str(), &format!("fakeobj{}", i + 1)); assert_eq!(entry.get_hash_as_str(), &format!("fakeobj{}hash", i + 1)); assert_eq!(entry.get_size_as_u64(), i as u64 + 1); } + assert_eq!(stream.marker(), Some("")); assert_eq!(counter, 4usize); Ok(()) @@ -1844,6 +1875,7 @@ mod tests { ResponseErrorKind::StatusCodeError(StatusCode::from_u16(599)?) ); assert!(iter.try_next().await?.is_none()); + assert_eq!(iter.marker(), Some("fakemarker")); assert_eq!(before_request_callback_counter.load(Ordering::Relaxed), 2usize); assert_eq!(after_response_ok_callback_counter.load(Ordering::Relaxed), 1usize); assert_eq!(after_response_error_callback_counter.load(Ordering::Relaxed), 1usize); @@ -1932,15 +1964,16 @@ mod tests { .version(ListVersion::V1) .prefix("fakeobj") .limit(3) - .stream() - .enumerate(); - while let Some((i, entry)) = stream.next().await { + .stream(); + let mut iter = (&mut stream).enumerate(); + while let Some((i, entry)) = iter.next().await { counter += 1; let entry = entry?; assert_eq!(entry.get_key_as_str(), &format!("fakeobj{}", i + 1)); assert_eq!(entry.get_hash_as_str(), &format!("fakeobj{}hash", i + 1)); assert_eq!(entry.get_size_as_u64(), i as u64 + 1); } + assert_eq!(stream.marker(), Some("")); assert_eq!(counter, 3usize); Ok(()) @@ -2017,9 +2050,9 @@ mod tests { } } }) - .stream() - .enumerate(); - while let Some((i, entry)) = stream.next().await { + .stream(); + let mut iter = (&mut stream).enumerate(); + while let Some((i, entry)) = iter.next().await { if counter.fetch_add(1, Ordering::Relaxed) < 2 { let entry = entry?; assert_eq!(entry.get_key_as_str(), &format!("fakeobj{}", i + 1)); @@ -2034,6 +2067,7 @@ mod tests { break; } } + assert_eq!(stream.marker(), Some("fakemarker")); } assert_eq!(Arc::try_unwrap(counter).unwrap().into_inner(), 3usize); @@ -2139,14 +2173,16 @@ mod tests { let mut counter = 0usize; let bucket = get_bucket(FakeHttpCaller::default()); - let mut stream = bucket.list().version(ListVersion::V2).stream().enumerate(); - while let Some((i, entry)) = stream.next().await { + let mut stream = bucket.list().version(ListVersion::V2).stream(); + let mut iter = (&mut stream).enumerate(); + while let Some((i, entry)) = iter.next().await { counter += 1; let entry = entry?; assert_eq!(entry.get_key_as_str(), &format!("fakeobj{}", i + 1)); assert_eq!(entry.get_hash_as_str(), &format!("fakeobj{}hash", i + 1)); assert_eq!(entry.get_size_as_u64(), i as u64 + 1); } + assert_eq!(stream.marker(), Some("")); assert_eq!(counter, 4usize); Ok(()) @@ -2277,6 +2313,7 @@ mod tests { ResponseErrorKind::StatusCodeError(StatusCode::from_u16(599)?) ); assert!(stream.try_next().await?.is_none()); + assert_eq!(stream.marker(), Some("fakemarkerobj2")); assert_eq!(before_request_callback_counter.load(Ordering::Relaxed), 2usize); assert_eq!(after_response_ok_callback_counter.load(Ordering::Relaxed), 1usize); assert_eq!(after_response_error_callback_counter.load(Ordering::Relaxed), 1usize); @@ -2362,9 +2399,9 @@ mod tests { } } }) - .stream() - .enumerate(); - while let Some((i, entry)) = stream.next().await { + .stream(); + let mut iter = (&mut stream).enumerate(); + while let Some((i, entry)) = iter.next().await { if counter.fetch_add(1, Ordering::Relaxed) < 2 { let entry = entry?; assert_eq!(entry.get_key_as_str(), &format!("fakeobj{}", i + 1)); @@ -2379,6 +2416,7 @@ mod tests { break; } } + assert_eq!(stream.marker(), Some("fakemarkerobj2")); } assert_eq!(Arc::try_unwrap(counter).unwrap().into_inner(), 3usize); From 135dbf896c830ef52d8bfce9c3e1053f581db8a9 Mon Sep 17 00:00:00 2001 From: Rong Zhou Date: Thu, 11 Aug 2022 10:51:34 +0800 Subject: [PATCH 7/7] Bump version to v0.1.4 --- CHANGELOG.md | 5 +++++ api-generator/Cargo.toml | 10 +++++----- apis/Cargo.toml | 6 +++--- apis/README.md | 6 +++--- credential/Cargo.toml | 4 ++-- credential/README.md | 4 ++-- download-manager/Cargo.toml | 4 ++-- download-manager/README.md | 6 +++--- etag/Cargo.toml | 4 ++-- etag/README.md | 4 ++-- http-client/Cargo.toml | 16 ++++++++-------- http-client/README.md | 6 +++--- http-isahc/Cargo.toml | 4 ++-- http-isahc/README.md | 4 ++-- http-reqwest/Cargo.toml | 4 ++-- http-reqwest/README.md | 4 ++-- http-ureq/Cargo.toml | 4 ++-- http-ureq/README.md | 2 +- http/Cargo.toml | 4 ++-- http/README.md | 4 ++-- objects-manager/Cargo.toml | 6 +++--- objects-manager/README.md | 6 +++--- sdk-examples/Cargo.toml | 4 ++-- sdk/Cargo.toml | 28 ++++++++++++++-------------- upload-manager/Cargo.toml | 8 ++++---- upload-manager/README.md | 6 +++--- upload-token/Cargo.toml | 6 +++--- upload-token/README.md | 4 ++-- utils/Cargo.toml | 2 +- 29 files changed, 90 insertions(+), 85 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d60b86b7..7af27fe9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Change log +## v0.1.4 + +- `ObjectsManagerBuilder` / `UploadManagerBuilder` 的 `use_https` 方法也对内置的 `BucketRegionsQueryerBuilder` 生效 +- `ListIter` / `ListStream` 添加 `marker` 方法,获取最近一次列举返回的位置标记 + ## v0.1.3 - 修复编译 `ureq` 出现 `pattern InsecureRequestHttpsOnly not covered` 的错误 diff --git a/api-generator/Cargo.toml b/api-generator/Cargo.toml index dc44124b..76c741f2 100644 --- a/api-generator/Cargo.toml +++ b/api-generator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qiniu-api-generator" -version = "0.1.3" +version = "0.1.4" authors = ["Rong Zhou ", "Shanghai Qiniu Information Technologies Co., Ltd."] edition = "2021" license = "MIT" @@ -28,8 +28,8 @@ walkdir = "2.3.2" [dev-dependencies] serde_json = "1.0.68" -qiniu-http = { version = "0.1.3", path = "../http" } -qiniu-http-client = { version = "0.1.3", path = "../http-client" } -qiniu-upload-token = { version = "0.1.3", path = "../upload-token" } -qiniu-utils = { version = "0.1.3", path = "../utils" } +qiniu-http = { version = "0.1.4", path = "../http" } +qiniu-http-client = { version = "0.1.4", path = "../http-client" } +qiniu-upload-token = { version = "0.1.4", path = "../upload-token" } +qiniu-utils = { version = "0.1.4", path = "../utils" } indexmap = "1.7.0" diff --git a/apis/Cargo.toml b/apis/Cargo.toml index bd922a6f..eac0b542 100644 --- a/apis/Cargo.toml +++ b/apis/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qiniu-apis" -version = "0.1.3" +version = "0.1.4" authors = ["Rong Zhou ", "Shanghai Qiniu Information Technologies Co., Ltd."] edition = "2021" rust-version = "1.60.0" @@ -21,8 +21,8 @@ indexmap = "1.7.0" futures = { version = "0.3.5", optional = true } async-std = { version = "1.9.0", optional = true } -qiniu-http-client = { version = "0.1.3", path = "../http-client", default-features = false } -qiniu-utils = { version = "0.1.3", path = "../utils" } +qiniu-http-client = { version = "0.1.4", path = "../http-client", default-features = false } +qiniu-utils = { version = "0.1.4", path = "../utils" } [dev-dependencies] anyhow = "1.0.43" diff --git a/apis/README.md b/apis/README.md index d71ca511..5e19a4a8 100644 --- a/apis/README.md +++ b/apis/README.md @@ -24,21 +24,21 @@ ```toml [dependencies] -qiniu-apis = { version = "0.1.3", features = ["ureq"] } +qiniu-apis = { version = "0.1.4", features = ["ureq"] } ``` ### 启用 Isahc 异步接口 ```toml [dependencies] -qiniu-apis = { version = "0.1.3", features = ["async", "isahc"] } +qiniu-apis = { version = "0.1.4", features = ["async", "isahc"] } ``` ### 启用 Reqwest 异步接口 ```toml [dependencies] -qiniu-apis = { version = "0.1.3", features = ["async", "reqwest"] } +qiniu-apis = { version = "0.1.4", features = ["async", "reqwest"] } ``` ### 其他功能 diff --git a/credential/Cargo.toml b/credential/Cargo.toml index 88a9a1d0..c50ae3a2 100644 --- a/credential/Cargo.toml +++ b/credential/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qiniu-credential" -version = "0.1.3" +version = "0.1.4" authors = ["Rong Zhou ", "Shanghai Qiniu Information Technologies Co., Ltd."] edition = "2021" rust-version = "1.60.0" @@ -24,7 +24,7 @@ assert-impl = "0.1.3" auto_impl = "1.0.0" futures-lite = { version = "1.12.0", optional = true } -qiniu-utils = { version = "0.1.3", path = "../utils" } +qiniu-utils = { version = "0.1.4", path = "../utils" } [dev-dependencies] anyhow = "1.0.44" diff --git a/credential/README.md b/credential/README.md index 1f72f115..b0a212f4 100644 --- a/credential/README.md +++ b/credential/README.md @@ -20,14 +20,14 @@ ```toml [dependencies] -qiniu-credential = "0.1.3" +qiniu-credential = "0.1.4" ``` ### 启用异步接口 ```toml [dependencies] -qiniu-credential = { version = "0.1.3", features = ["async"] } +qiniu-credential = { version = "0.1.4", features = ["async"] } ``` ## 代码示例 diff --git a/download-manager/Cargo.toml b/download-manager/Cargo.toml index c5257629..2a3fa041 100644 --- a/download-manager/Cargo.toml +++ b/download-manager/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qiniu-download-manager" -version = "0.1.3" +version = "0.1.4" authors = ["Rong Zhou ", "Shanghai Qiniu Information Technologies Co., Ltd."] edition = "2021" rust-version = "1.60.0" @@ -24,7 +24,7 @@ futures = { version = "0.3.5", optional = true } async-std = { version = "1.9.0", optional = true } smart-default = { version = "0.6.0", optional = true } -qiniu-apis = { version = "0.1.3", path = "../apis", default-features = false } +qiniu-apis = { version = "0.1.4", path = "../apis", default-features = false } [dev-dependencies] anyhow = "1.0.51" diff --git a/download-manager/README.md b/download-manager/README.md index 4cdbe5eb..cc31362f 100644 --- a/download-manager/README.md +++ b/download-manager/README.md @@ -16,21 +16,21 @@ ```toml [dependencies] -qiniu-download-manager = { version = "0.1.3", features = ["ureq"] } +qiniu-download-manager = { version = "0.1.4", features = ["ureq"] } ``` ### 启用 Isahc 异步接口 ```toml [dependencies] -qiniu-download-manager = { version = "0.1.3", features = ["async", "isahc"] } +qiniu-download-manager = { version = "0.1.4", features = ["async", "isahc"] } ``` ### 启用 Reqwest 异步接口 ```toml [dependencies] -qiniu-download-manager = { version = "0.1.3", features = ["async", "reqwest"] } +qiniu-download-manager = { version = "0.1.4", features = ["async", "reqwest"] } ``` ### 其他功能 diff --git a/etag/Cargo.toml b/etag/Cargo.toml index 40594c67..ede17c8e 100644 --- a/etag/Cargo.toml +++ b/etag/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qiniu-etag" -version = "0.1.3" +version = "0.1.4" authors = ["Rong Zhou ", "Shanghai Qiniu Information Technologies Co., Ltd."] edition = "2021" rust-version = "1.60.0" @@ -19,7 +19,7 @@ digest = "0.9.0" assert-impl = "0.1.3" futures-lite = { version = "1.12.0", optional = true } -qiniu-utils = { version = "0.1.3", path = "../utils" } +qiniu-utils = { version = "0.1.4", path = "../utils" } [dev-dependencies] async-std = { version = "1.9.0", features = ["attributes"] } diff --git a/etag/README.md b/etag/README.md index dceaa3c3..e206bb6e 100644 --- a/etag/README.md +++ b/etag/README.md @@ -18,14 +18,14 @@ ```toml [dependencies] -qiniu-etag = "0.1.3" +qiniu-etag = "0.1.4" ``` ### 启用异步接口 ```toml [dependencies] -qiniu-etag = { version = "0.1.3", features = ["async"] } +qiniu-etag = { version = "0.1.4", features = ["async"] } ``` ## 代码示例 diff --git a/http-client/Cargo.toml b/http-client/Cargo.toml index 806d4442..e54b417c 100644 --- a/http-client/Cargo.toml +++ b/http-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qiniu-http-client" -version = "0.1.3" +version = "0.1.4" authors = ["Rong Zhou ", "Shanghai Qiniu Information Technologies Co., Ltd."] edition = "2021" rust-version = "1.60.0" @@ -55,13 +55,13 @@ trust-dns-resolver = { version = "0.21.2", optional = true } async-std-resolver = { version = "0.21.2", optional = true } async-once-cell = { version = "0.3.0", optional = true } -qiniu-http = { version = "0.1.3", path = "../http" } -qiniu-credential = { version = "0.1.3", path = "../credential" } -qiniu-upload-token = { version = "0.1.3", path = "../upload-token" } -qiniu-reqwest = { version = "0.1.3", path = "../http-reqwest", optional = true } -qiniu-isahc = { version = "0.1.3", path = "../http-isahc", optional = true } -qiniu-ureq = { version = "0.1.3", path = "../http-ureq", optional = true } -qiniu-utils = { version = "0.1.3", path = "../utils" } +qiniu-http = { version = "0.1.4", path = "../http" } +qiniu-credential = { version = "0.1.4", path = "../credential" } +qiniu-upload-token = { version = "0.1.4", path = "../upload-token" } +qiniu-reqwest = { version = "0.1.4", path = "../http-reqwest", optional = true } +qiniu-isahc = { version = "0.1.4", path = "../http-isahc", optional = true } +qiniu-ureq = { version = "0.1.4", path = "../http-ureq", optional = true } +qiniu-utils = { version = "0.1.4", path = "../utils" } [dev-dependencies] async-std = { version = "1.9.0", features = ["attributes"] } diff --git a/http-client/README.md b/http-client/README.md index 27e9a304..9f31bfc0 100644 --- a/http-client/README.md +++ b/http-client/README.md @@ -105,21 +105,21 @@ ```toml [dependencies] -qiniu-http-client = { version = "0.1.3", features = ["ureq"] } +qiniu-http-client = { version = "0.1.4", features = ["ureq"] } ``` ### 启用 Isahc 异步接口 ```toml [dependencies] -qiniu-http-client = { version = "0.1.3", features = ["async", "isahc"] } +qiniu-http-client = { version = "0.1.4", features = ["async", "isahc"] } ``` ### 启用 Reqwest 异步接口 ```toml [dependencies] -qiniu-http-client = { version = "0.1.3", features = ["async", "reqwest"] } +qiniu-http-client = { version = "0.1.4", features = ["async", "reqwest"] } ``` ### 其他功能 diff --git a/http-isahc/Cargo.toml b/http-isahc/Cargo.toml index 182e0ed5..d0808060 100644 --- a/http-isahc/Cargo.toml +++ b/http-isahc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qiniu-isahc" -version = "0.1.3" +version = "0.1.4" authors = ["Rong Zhou ", "Shanghai Qiniu Information Technologies Co., Ltd."] edition = "2021" rust-version = "1.60.0" @@ -15,7 +15,7 @@ keywords = ["qiniu", "storage"] [dependencies] isahc = { version = "1.4.0" } -qiniu-http = { version = "0.1.3", path = "../http" } +qiniu-http = { version = "0.1.4", path = "../http" } futures = { version = "0.3.16", optional = true } [features] diff --git a/http-isahc/README.md b/http-isahc/README.md index add5ea75..3333f49e 100644 --- a/http-isahc/README.md +++ b/http-isahc/README.md @@ -18,14 +18,14 @@ ```toml [dependencies] -qiniu-isahc = "0.1.3" +qiniu-isahc = "0.1.4" ``` ### 启用异步接口 ```toml [dependencies] -qiniu-isahc = { version = "0.1.3", features = ["async"] } +qiniu-isahc = { version = "0.1.4", features = ["async"] } ``` ## 最低支持的 Rust 版本(MSRV) diff --git a/http-reqwest/Cargo.toml b/http-reqwest/Cargo.toml index e9b7a858..1af9fcf8 100644 --- a/http-reqwest/Cargo.toml +++ b/http-reqwest/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qiniu-reqwest" -version = "0.1.3" +version = "0.1.4" authors = ["Rong Zhou ", "Shanghai Qiniu Information Technologies Co., Ltd."] edition = "2021" rust-version = "1.60.0" @@ -15,7 +15,7 @@ keywords = ["qiniu", "storage"] [dependencies] reqwest = { version = "0.11.4", features = ["blocking", "stream"] } -qiniu-http = { version = "0.1.3", path = "../http" } +qiniu-http = { version = "0.1.4", path = "../http" } bytes = { version = "1.0.1", optional = true } futures = { version = "0.3.16", optional = true } diff --git a/http-reqwest/README.md b/http-reqwest/README.md index 6e286137..7b3a5919 100644 --- a/http-reqwest/README.md +++ b/http-reqwest/README.md @@ -18,14 +18,14 @@ ```toml [dependencies] -qiniu-reqwest = "0.1.3" +qiniu-reqwest = "0.1.4" ``` ### 启用异步接口 ```toml [dependencies] -qiniu-reqwest = { version = "0.1.3", features = ["async"] } +qiniu-reqwest = { version = "0.1.4", features = ["async"] } ``` ## 最低支持的 Rust 版本(MSRV) diff --git a/http-ureq/Cargo.toml b/http-ureq/Cargo.toml index b53a35fa..22ba3dbe 100644 --- a/http-ureq/Cargo.toml +++ b/http-ureq/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qiniu-ureq" -version = "0.1.3" +version = "0.1.4" authors = ["Rong Zhou ", "Shanghai Qiniu Information Technologies Co., Ltd."] edition = "2021" rust-version = "1.60.0" @@ -15,7 +15,7 @@ keywords = ["qiniu", "storage"] [dependencies] ureq = { version = "2.5.0" } -qiniu-http = { version = "0.1.3", path = "../http" } +qiniu-http = { version = "0.1.4", path = "../http" } [features] async = ["qiniu-http/async"] diff --git a/http-ureq/README.md b/http-ureq/README.md index 1c4c4935..eea9bd5b 100644 --- a/http-ureq/README.md +++ b/http-ureq/README.md @@ -14,7 +14,7 @@ ```toml [dependencies] -qiniu-ureq = "0.1.3" +qiniu-ureq = "0.1.4" ``` ## 最低支持的 Rust 版本(MSRV) diff --git a/http/Cargo.toml b/http/Cargo.toml index 7b2e588c..afd46ad7 100644 --- a/http/Cargo.toml +++ b/http/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qiniu-http" -version = "0.1.3" +version = "0.1.4" authors = ["Rong Zhou ", "Shanghai Qiniu Information Technologies Co., Ltd."] edition = "2021" rust-version = "1.60.0" @@ -23,7 +23,7 @@ smart-default = "0.6.0" auto_impl = "1.0.0" futures-lite = { version = "1.11.2", optional = true } -qiniu-utils = { version = "0.1.3", path = "../utils" } +qiniu-utils = { version = "0.1.4", path = "../utils" } [build-dependencies] rustc_version = "0.4.0" diff --git a/http/README.md b/http/README.md index d4db4e38..3cb011db 100644 --- a/http/README.md +++ b/http/README.md @@ -19,14 +19,14 @@ ```toml [dependencies] -qiniu-http = "0.1.3" +qiniu-http = "0.1.4" ``` ### 启用异步接口 ```toml [dependencies] -qiniu-http = { version = "0.1.3", features = ["async"] } +qiniu-http = { version = "0.1.4", features = ["async"] } ``` ## 最低支持的 Rust 版本(MSRV) diff --git a/objects-manager/Cargo.toml b/objects-manager/Cargo.toml index f6b61cd8..40b54e7f 100644 --- a/objects-manager/Cargo.toml +++ b/objects-manager/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qiniu-objects-manager" -version = "0.1.3" +version = "0.1.4" authors = ["Rong Zhou ", "Shanghai Qiniu Information Technologies Co., Ltd."] edition = "2021" rust-version = "1.60.0" @@ -25,8 +25,8 @@ assert-impl = "0.1.3" futures = { version = "0.3.5", optional = true } async-once-cell = { version = "0.3.0", optional = true } -qiniu-apis = { version = "0.1.3", path = "../apis", default-features = false } -qiniu-utils = { version = "0.1.3", path = "../utils" } +qiniu-apis = { version = "0.1.4", path = "../apis", default-features = false } +qiniu-utils = { version = "0.1.4", path = "../utils" } [dev-dependencies] env_logger = "0.9.0" diff --git a/objects-manager/README.md b/objects-manager/README.md index 72da98e5..8a7b3313 100644 --- a/objects-manager/README.md +++ b/objects-manager/README.md @@ -17,21 +17,21 @@ ```toml [dependencies] -qiniu-objects-manager = { version = "0.1.3", features = ["ureq"] } +qiniu-objects-manager = { version = "0.1.4", features = ["ureq"] } ``` ### 启用 Isahc 异步接口 ```toml [dependencies] -qiniu-objects-manager = { version = "0.1.3", features = ["async", "isahc"] } +qiniu-objects-manager = { version = "0.1.4", features = ["async", "isahc"] } ``` ### 启用 Reqwest 异步接口 ```toml [dependencies] -qiniu-objects-manager = { version = "0.1.3", features = ["async", "reqwest"] } +qiniu-objects-manager = { version = "0.1.4", features = ["async", "reqwest"] } ``` ### 其他功能 diff --git a/sdk-examples/Cargo.toml b/sdk-examples/Cargo.toml index 26894ca2..eec27ed2 100644 --- a/sdk-examples/Cargo.toml +++ b/sdk-examples/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qiniu-sdk-examples" -version = "0.1.3" +version = "0.1.4" authors = ["Rong Zhou ", "Shanghai Qiniu Information Technologies Co., Ltd."] edition = "2021" rust-version = "1.60.0" @@ -15,7 +15,7 @@ anyhow = "1.0.44" async-std = { version = "1.6.3", features = ["attributes"] } env_logger = "0.9.0" log = "0.4.14" -qiniu-sdk = { version = "0.1.3", path = "../sdk", features = ["apis", "upload", "objects", "async", "isahc", "trust_dns"] } +qiniu-sdk = { version = "0.1.4", path = "../sdk", features = ["apis", "upload", "objects", "async", "isahc", "trust_dns"] } structopt = "0.3.23" [dependencies] diff --git a/sdk/Cargo.toml b/sdk/Cargo.toml index 4fec964d..19ca3d2e 100644 --- a/sdk/Cargo.toml +++ b/sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qiniu-sdk" -version = "0.1.3" +version = "0.1.4" authors = ["Rong Zhou ", "Shanghai Qiniu Information Technologies Co., Ltd."] edition = "2021" rust-version = "1.60.0" @@ -14,19 +14,19 @@ keywords = ["qiniu", "storage"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -qiniu-utils = { version = "0.1.3", path = "../utils", optional = true } -qiniu-etag = { version = "0.1.3", path = "../etag", optional = true } -qiniu-credential = { version = "0.1.3", path = "../credential", optional = true } -qiniu-upload-token = { version = "0.1.3", path = "../upload-token", optional = true } -qiniu-http = { version = "0.1.3", path = "../http", optional = true } -qiniu-ureq = { version = "0.1.3", path = "../http-ureq", optional = true } -qiniu-isahc = { version = "0.1.3", path = "../http-isahc", optional = true } -qiniu-reqwest = { version = "0.1.3", path = "../http-reqwest", optional = true } -qiniu-http-client = { version = "0.1.3", path = "../http-client", optional = true, default-features = false } -qiniu-apis = { version = "0.1.3", path = "../apis", optional = true, default-features = false } -qiniu-objects-manager = { version = "0.1.3", path = "../objects-manager", optional = true, default-features = false } -qiniu-upload-manager = { version = "0.1.3", path = "../upload-manager", optional = true, default-features = false } -qiniu-download-manager = { version = "0.1.3", path = "../download-manager", optional = true, default-features = false } +qiniu-utils = { version = "0.1.4", path = "../utils", optional = true } +qiniu-etag = { version = "0.1.4", path = "../etag", optional = true } +qiniu-credential = { version = "0.1.4", path = "../credential", optional = true } +qiniu-upload-token = { version = "0.1.4", path = "../upload-token", optional = true } +qiniu-http = { version = "0.1.4", path = "../http", optional = true } +qiniu-ureq = { version = "0.1.4", path = "../http-ureq", optional = true } +qiniu-isahc = { version = "0.1.4", path = "../http-isahc", optional = true } +qiniu-reqwest = { version = "0.1.4", path = "../http-reqwest", optional = true } +qiniu-http-client = { version = "0.1.4", path = "../http-client", optional = true, default-features = false } +qiniu-apis = { version = "0.1.4", path = "../apis", optional = true, default-features = false } +qiniu-objects-manager = { version = "0.1.4", path = "../objects-manager", optional = true, default-features = false } +qiniu-upload-manager = { version = "0.1.4", path = "../upload-manager", optional = true, default-features = false } +qiniu-download-manager = { version = "0.1.4", path = "../download-manager", optional = true, default-features = false } [features] default = ["ureq"] diff --git a/upload-manager/Cargo.toml b/upload-manager/Cargo.toml index 2f59f399..659a968b 100644 --- a/upload-manager/Cargo.toml +++ b/upload-manager/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qiniu-upload-manager" -version = "0.1.3" +version = "0.1.4" authors = ["Rong Zhou ", "Shanghai Qiniu Information Technologies Co., Ltd."] edition = "2021" rust-version = "1.60.0" @@ -34,9 +34,9 @@ futures = { version = "0.3.5", optional = true } async-once-cell = { version = "0.3.0", optional = true } async-std = { version = "1.10.0", optional = true } -qiniu-apis = { version = "0.1.3", path = "../apis", default-features = false } -qiniu-upload-token = { version = "0.1.3", path = "../upload-token" } -qiniu-utils = { version = "0.1.3", path = "../utils" } +qiniu-apis = { version = "0.1.4", path = "../apis", default-features = false } +qiniu-upload-token = { version = "0.1.4", path = "../upload-token" } +qiniu-utils = { version = "0.1.4", path = "../utils" } [dev-dependencies] anyhow = "1.0.11" diff --git a/upload-manager/README.md b/upload-manager/README.md index 54d95c20..742d7684 100644 --- a/upload-manager/README.md +++ b/upload-manager/README.md @@ -16,21 +16,21 @@ ```toml [dependencies] -qiniu-upload-manager = { version = "0.1.3", features = ["ureq"] } +qiniu-upload-manager = { version = "0.1.4", features = ["ureq"] } ``` ### 启用 Isahc 异步接口 ```toml [dependencies] -qiniu-upload-manager = { version = "0.1.3", features = ["async", "isahc"] } +qiniu-upload-manager = { version = "0.1.4", features = ["async", "isahc"] } ``` ### 启用 Reqwest 异步接口 ```toml [dependencies] -qiniu-upload-manager = { version = "0.1.3", features = ["async", "reqwest"] } +qiniu-upload-manager = { version = "0.1.4", features = ["async", "reqwest"] } ``` ### 其他功能 diff --git a/upload-token/Cargo.toml b/upload-token/Cargo.toml index abff26dd..401cca73 100644 --- a/upload-token/Cargo.toml +++ b/upload-token/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qiniu-upload-token" -version = "0.1.3" +version = "0.1.4" authors = ["Rong Zhou ", "Shanghai Qiniu Information Technologies Co., Ltd."] edition = "2021" rust-version = "1.60.0" @@ -24,8 +24,8 @@ serde = { version = "1.0.130", features = ["derive"] } auto_impl = "1.0.0" futures = { version = "0.3.16", optional = true } -qiniu-credential = { version = "0.1.3", path = "../credential" } -qiniu-utils = { version = "0.1.3", path = "../utils" } +qiniu-credential = { version = "0.1.4", path = "../credential" } +qiniu-utils = { version = "0.1.4", path = "../utils" } [dev-dependencies] anyhow = "1.0.44" diff --git a/upload-token/README.md b/upload-token/README.md index fe4ca21c..117e56f2 100644 --- a/upload-token/README.md +++ b/upload-token/README.md @@ -24,14 +24,14 @@ ```toml [dependencies] -qiniu-upload-token = "0.1.3" +qiniu-upload-token = "0.1.4" ``` ### 启用异步接口 ```toml [dependencies] -qiniu-upload-token = { version = "0.1.3", features = ["async"] } +qiniu-upload-token = { version = "0.1.4", features = ["async"] } ``` ## 代码示例 diff --git a/utils/Cargo.toml b/utils/Cargo.toml index 4569ce90..5e15df46 100644 --- a/utils/Cargo.toml +++ b/utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qiniu-utils" -version = "0.1.3" +version = "0.1.4" authors = ["Rong Zhou ", "Shanghai Qiniu Information Technologies Co., Ltd."] edition = "2021" rust-version = "1.60.0"