tencent_sdk/transport/
mod.rs1use crate::core::TencentCloudError;
2use http::{Method, StatusCode};
3use std::{collections::HashMap, time::Duration};
4use url::Url;
5
6pub mod async_impl {
7 use super::*;
8 use async_trait::async_trait;
9 use reqwest::Client;
10
11 #[async_trait]
12 pub trait AsyncTransport: Clone + Send + Sync + 'static {
13 async fn send(
14 &self,
15 method: Method,
16 url: Url,
17 headers: HashMap<String, String>,
18 body: Option<String>,
19 timeout: Duration,
20 ) -> Result<(StatusCode, String), TencentCloudError>;
21 }
22
23 #[derive(Clone)]
24 pub struct ReqwestAsync {
25 client: Client,
26 }
27
28 impl ReqwestAsync {
29 pub fn new(
30 insecure: bool,
31 ua: &str,
32 timeout: Duration,
33 no_proxy: bool,
34 ) -> Result<Self, reqwest::Error> {
35 let mut builder = Client::builder()
36 .danger_accept_invalid_certs(insecure)
37 .user_agent(ua)
38 .timeout(timeout);
39
40 if no_proxy {
41 builder = builder.no_proxy();
42 }
43
44 let client = builder.build()?;
45 Ok(Self { client })
46 }
47 }
48
49 #[async_trait]
50 impl AsyncTransport for ReqwestAsync {
51 async fn send(
52 &self,
53 method: Method,
54 url: Url,
55 headers: HashMap<String, String>,
56 body: Option<String>,
57 timeout: Duration,
58 ) -> Result<(StatusCode, String), TencentCloudError> {
59 let mut req = self
60 .client
61 .request(method.clone(), url.clone())
62 .timeout(timeout);
63
64 for (key, value) in &headers {
65 req = req.header(key, value);
66 }
67 if let Some(body) = &body {
68 req = req.body(body.clone());
69 }
70
71 let response = req.send().await.map_err(|source| {
72 TencentCloudError::transport(source, method.clone(), url.clone())
73 })?;
74
75 let status = response.status();
76 let body = response.text().await.map_err(|source| {
77 TencentCloudError::transport(source, method.clone(), url.clone())
78 })?;
79 Ok((status, body))
80 }
81 }
82
83 pub type DefaultAsyncTransport = ReqwestAsync;
84}
85
86pub mod blocking_impl {
87 use super::*;
88 use reqwest::blocking::Client;
89
90 pub trait BlockingTransport: Clone + Send + Sync + 'static {
91 fn send(
92 &self,
93 method: Method,
94 url: Url,
95 headers: HashMap<String, String>,
96 body: Option<String>,
97 timeout: Duration,
98 ) -> Result<(StatusCode, String), TencentCloudError>;
99 }
100
101 #[derive(Clone)]
102 pub struct ReqwestBlocking {
103 client: Client,
104 }
105
106 impl ReqwestBlocking {
107 pub fn new(
108 insecure: bool,
109 ua: &str,
110 timeout: Duration,
111 no_proxy: bool,
112 ) -> Result<Self, reqwest::Error> {
113 let mut builder = Client::builder()
114 .danger_accept_invalid_certs(insecure)
115 .user_agent(ua)
116 .timeout(timeout);
117
118 if no_proxy {
119 builder = builder.no_proxy();
120 }
121
122 let client = builder.build()?;
123 Ok(Self { client })
124 }
125 }
126
127 impl BlockingTransport for ReqwestBlocking {
128 fn send(
129 &self,
130 method: Method,
131 url: Url,
132 headers: HashMap<String, String>,
133 body: Option<String>,
134 timeout: Duration,
135 ) -> Result<(StatusCode, String), TencentCloudError> {
136 let mut req = self
137 .client
138 .request(method.clone(), url.clone())
139 .timeout(timeout);
140
141 for (key, value) in &headers {
142 req = req.header(key, value);
143 }
144 if let Some(body) = &body {
145 req = req.body(body.clone());
146 }
147
148 let response = req.send().map_err(|source| {
149 TencentCloudError::transport(source, method.clone(), url.clone())
150 })?;
151
152 let status = response.status();
153 let body = response
154 .text()
155 .map_err(|source| TencentCloudError::transport(source, method, url))?;
156 Ok((status, body))
157 }
158 }
159
160 pub type DefaultBlockingTransport = ReqwestBlocking;
161}