wreq-rb 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +257 -102
  3. data/ext/wreq_rb/Cargo.toml +4 -4
  4. data/ext/wreq_rb/src/client.rs +1 -1
  5. data/lib/wreq-rb/version.rb +1 -1
  6. data/patches/0001-add-transfer-size-tracking.patch +11 -15
  7. data/vendor/wreq/Cargo.toml +9 -8
  8. data/vendor/wreq/README.md +5 -5
  9. data/vendor/wreq/bench/support/bench.rs +6 -2
  10. data/vendor/wreq/bench/support/client.rs +88 -1
  11. data/vendor/wreq/bench/support/exec.rs +0 -0
  12. data/vendor/wreq/bench/support/rt.rs +34 -0
  13. data/vendor/wreq/bench/support/server.rs +1 -1
  14. data/vendor/wreq/bench/support.rs +1 -15
  15. data/vendor/wreq/examples/cert_store.rs +13 -13
  16. data/vendor/wreq/examples/request_with_emulate.rs +1 -1
  17. data/vendor/wreq/examples/tcp_linger.rs +22 -0
  18. data/vendor/wreq/src/client/layer/client/pool.rs +17 -17
  19. data/vendor/wreq/src/client/layer/client.rs +2 -0
  20. data/vendor/wreq/src/client/layer/decoder.rs +71 -17
  21. data/vendor/wreq/src/client/layer/redirect/future.rs +49 -63
  22. data/vendor/wreq/src/client/layer/redirect/policy.rs +2 -26
  23. data/vendor/wreq/src/client/layer/redirect.rs +48 -60
  24. data/vendor/wreq/src/client/layer/retry.rs +12 -15
  25. data/vendor/wreq/src/client/layer/timeout/body.rs +27 -21
  26. data/vendor/wreq/src/client/layer/timeout/future.rs +33 -58
  27. data/vendor/wreq/src/client/layer/timeout.rs +8 -14
  28. data/vendor/wreq/src/client/request.rs +4 -0
  29. data/vendor/wreq/src/client.rs +53 -31
  30. data/vendor/wreq/src/conn/connector.rs +99 -129
  31. data/vendor/wreq/src/conn/http.rs +25 -18
  32. data/vendor/wreq/src/conn/net/tcp.rs +601 -107
  33. data/vendor/wreq/src/conn/proxy/socks.rs +6 -6
  34. data/vendor/wreq/src/conn/timeout.rs +166 -0
  35. data/vendor/wreq/src/conn.rs +5 -4
  36. data/vendor/wreq/src/cookie/jar.rs +1225 -0
  37. data/vendor/wreq/src/cookie/store.rs +321 -0
  38. data/vendor/wreq/src/cookie.rs +108 -612
  39. data/vendor/wreq/src/dns/resolve.rs +8 -2
  40. data/vendor/wreq/src/dns.rs +4 -4
  41. data/vendor/wreq/src/error.rs +53 -20
  42. data/vendor/wreq/src/lib.rs +1 -0
  43. data/vendor/wreq/src/proxy/matcher.rs +26 -12
  44. data/vendor/wreq/src/proxy/win.rs +39 -9
  45. data/vendor/wreq/src/redirect.rs +515 -100
  46. data/vendor/wreq/src/tls/conn.rs +3 -11
  47. data/vendor/wreq/src/tls/session.rs +7 -8
  48. data/vendor/wreq/src/tls/trust/store.rs +4 -4
  49. data/vendor/wreq/src/util.rs +23 -0
  50. data/vendor/wreq/tests/badssl.rs +72 -7
  51. data/vendor/wreq/tests/brotli.rs +1 -1
  52. data/vendor/wreq/tests/client.rs +24 -0
  53. data/vendor/wreq/tests/connector_layers.rs +8 -4
  54. data/vendor/wreq/tests/cookie.rs +59 -0
  55. data/vendor/wreq/tests/deflate.rs +1 -1
  56. data/vendor/wreq/tests/gzip.rs +53 -1
  57. data/vendor/wreq/tests/layers.rs +8 -4
  58. data/vendor/wreq/tests/redirect.rs +180 -97
  59. data/vendor/wreq/tests/timeouts.rs +47 -12
  60. data/vendor/wreq/tests/zstd.rs +1 -1
  61. metadata +7 -1
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "wreq_rb"
3
- version = "0.6.0"
3
+ version = "0.6.1"
4
4
  edition = "2021"
5
5
  publish = false
6
6
 
@@ -10,7 +10,7 @@ crate-type = ["cdylib"]
10
10
  [dependencies]
11
11
  magnus = { version = "0.8", features = ["rb-sys"] }
12
12
  rb-sys = "0.9"
13
- wreq = { path = "../../vendor/wreq", version = "=6.0.0-rc.29", features = [
13
+ wreq = { path = "../../vendor/wreq", version = "=0.16.1", features = [
14
14
  "cookies",
15
15
  "json",
16
16
  "gzip",
@@ -24,7 +24,7 @@ wreq = { path = "../../vendor/wreq", version = "=6.0.0-rc.29", features = [
24
24
  "query",
25
25
  "form",
26
26
  ] }
27
- wreq-util = { version = "=3.0.0-rc.12", features = ["emulation", "emulation-serde", "emulation-compression"] }
27
+ wreq-util = { version = "=0.2.0", features = ["emulation", "emulation-serde", "emulation-compression"] }
28
28
  tokio = { version = "1", features = ["full"] }
29
29
  tokio-util = "0.7"
30
30
  serde_json = "1.0"
@@ -32,6 +32,6 @@ bytes = "1"
32
32
  http = "1"
33
33
 
34
34
  [target.'cfg(target_os = "linux")'.dependencies]
35
- wreq = { path = "../../vendor/wreq", version = "=6.0.0-rc.29", features = [
35
+ wreq = { path = "../../vendor/wreq", version = "=0.16.1", features = [
36
36
  "prefix-symbols",
37
37
  ] }
@@ -201,7 +201,7 @@ async fn execute_batch(reqs: Vec<wreq::RequestBuilder>, concurrency: usize) -> V
201
201
  // --------------------------------------------------------------------------
202
202
 
203
203
  /// The default browser profile to apply when none is specified.
204
- const DEFAULT_EMULATION: BrowserProfile = BrowserProfile::Chrome148;
204
+ const DEFAULT_EMULATION: BrowserProfile = BrowserProfile::Chrome149;
205
205
 
206
206
  /// Parse a Ruby string like "chrome_143" into a BrowserProfile variant.
207
207
  fn parse_emulation(name: &str) -> Result<BrowserProfile, magnus::Error> {
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Wreq
4
- VERSION = "0.6.0"
4
+ VERSION = "0.6.1"
5
5
  end
@@ -1,5 +1,5 @@
1
1
  diff --git a/src/client.rs b/src/client.rs
2
- index 4abe25d8..76e709a8 100644
2
+ index 214fe423..ccbdb0e9 100644
3
3
  --- a/src/client.rs
4
4
  +++ b/src/client.rs
5
5
  @@ -49,6 +49,7 @@ use self::{
@@ -10,18 +10,14 @@ index 4abe25d8..76e709a8 100644
10
10
  },
11
11
  request::{Request, RequestBuilder},
12
12
  response::Response,
13
- @@ -115,25 +116,30 @@ type MaybeDecompressionBody<T> = tower_http::decompression::DecompressionBody<T>
13
+ @@ -116,24 +117,26 @@ type MaybeDecompressionBody<T> = tower_http::decompression::DecompressionBody<T>
14
+
14
15
  type ClientService = Timeout<
15
16
  ConfigService<
16
- MaybeDecompression<
17
- - Retry<RetryPolicy, FollowRedirect<HttpClient<Connector, Body>, FollowRedirectPolicy>>,
18
- + TransferSizeService<
19
- + Retry<
20
- + RetryPolicy,
21
- + FollowRedirect<HttpClient<Connector, Body>, FollowRedirectPolicy>,
22
- + >,
23
- + >,
24
- >,
17
+ - MaybeDecompression<Retry<RetryPolicy, FollowRedirect<HttpClient<Connector, Body>>>>,
18
+ + MaybeDecompression<
19
+ + TransferSizeService<Retry<RetryPolicy, FollowRedirect<HttpClient<Connector, Body>>>>,
20
+ + >,
25
21
  >,
26
22
  >;
27
23
 
@@ -45,7 +41,7 @@ index 4abe25d8..76e709a8 100644
45
41
  BoxError,
46
42
  >;
47
43
 
48
- @@ -593,6 +599,10 @@ impl ClientBuilder {
44
+ @@ -597,6 +600,10 @@ impl ClientBuilder {
49
45
  })
50
46
  .service(service);
51
47
 
@@ -56,7 +52,7 @@ index 4abe25d8..76e709a8 100644
56
52
  #[cfg(any(
57
53
  feature = "gzip",
58
54
  feature = "zstd",
59
- @@ -1585,7 +1595,7 @@ impl ClientBuilder {
55
+ @@ -1607,7 +1614,7 @@ impl ClientBuilder {
60
56
  L: Layer<
61
57
  BoxCloneSyncService<
62
58
  http::Request<Body>,
@@ -65,7 +61,7 @@ index 4abe25d8..76e709a8 100644
65
61
  BoxError,
66
62
  >,
67
63
  > + Clone
68
- @@ -1594,7 +1604,7 @@ impl ClientBuilder {
64
+ @@ -1616,7 +1623,7 @@ impl ClientBuilder {
69
65
  + 'static,
70
66
  L::Service: Service<
71
67
  http::Request<Body>,
@@ -266,7 +262,7 @@ index 00000000..f155ec8d
266
262
  + }
267
263
  +}
268
264
  diff --git a/src/client/response.rs b/src/client/response.rs
269
- index 3d3532af..ed478804 100644
265
+ index 3d3532af..7d29ec45 100644
270
266
  --- a/src/client/response.rs
271
267
  +++ b/src/client/response.rs
272
268
  @@ -18,6 +18,7 @@ use mime::Mime;
@@ -1,7 +1,7 @@
1
1
  [package]
2
2
  name = "wreq"
3
- version = "6.0.0-rc.29"
4
- description = "An ergonomic Rust HTTP Client with TLS fingerprint"
3
+ version = "0.16.1"
4
+ description = "An ergonomic, privacy-aware Rust HTTP Client"
5
5
  keywords = ["http", "client", "websocket", "ja3", "ja4"]
6
6
  categories = ["web-programming::http-client"]
7
7
  repository = "https://github.com/0x676e67/wreq"
@@ -10,8 +10,8 @@ authors = ["0x676e67 <gngppz@gmail.com>"]
10
10
  readme = "README.md"
11
11
  license = "Apache-2.0"
12
12
  edition = "2024"
13
- rust-version = "1.85"
14
- include = ["README.md", "LICENSE", "src/**/*.rs"]
13
+ rust-version = "1.98"
14
+ include = ["/README.md", "/LICENSE", "/src/**/*.rs"]
15
15
 
16
16
  [package.metadata.docs.rs]
17
17
  all-features = true
@@ -92,10 +92,10 @@ http = "1.4.0"
92
92
  http2 = "0.5.17"
93
93
  httparse = "1.10.1"
94
94
  http-body = "1.0.1"
95
- http-body-util = "0.1.3"
95
+ http-body-util = "0.1.4"
96
96
  percent-encoding = "2.3.2"
97
97
  pin-project-lite = "0.2.17"
98
- futures-util = { version = "0.3.32", default-features = false }
98
+ futures-util = { version = "0.3.33", default-features = false }
99
99
  socket2 = { version = "0.6.3", features = ["all"] }
100
100
  ipnet = "2.12.0"
101
101
  lru = "0.18.0"
@@ -103,7 +103,7 @@ btls = "0.5.6"
103
103
  btls-sys = "0.5.6"
104
104
  tokio-btls = "0.5.6"
105
105
  tokio = { version = "1.52.3", default-features = false }
106
- compio = { version = "0.19.0-rc.1", features = ["io", "io-compat"], optional = true }
106
+ compio = { version = "0.19.2", features = ["io", "io-compat"], optional = true }
107
107
  wreq-rt = { version = "0.2.2-rc.2", default-features = false }
108
108
  wreq-proto = { version = "0.2.3", default-features = false }
109
109
  tower = { version = "0.5.3", default-features = false, features = [
@@ -174,7 +174,7 @@ tokio = { version = "1.0", default-features = false, features = [
174
174
  "macros",
175
175
  "rt-multi-thread",
176
176
  ] }
177
- compio = { version = "0.19.0-rc.1", features = ["macros", "net", "runtime", "time", "io", "io-compat"] }
177
+ compio = { version = "0.19.2", features = ["macros", "net", "runtime", "time", "io", "io-compat"] }
178
178
  hyper = { version = "1.7.0", default-features = false, features = [
179
179
  "http1",
180
180
  "http2",
@@ -202,6 +202,7 @@ zstd = "0.13.3"
202
202
  sysinfo = { version = "0.39.1", default-features = false, features = ["system"] }
203
203
  criterion = { version = "0.8.2", features = ["async_tokio"] }
204
204
  reqwest = { version = "0.13.3", default-features = false, features = ["rustls", "stream", "http2"] }
205
+ cyper = { version = "0.9.0", default-features = false, features = ["rustls", "stream"] }
205
206
 
206
207
  [profile.release]
207
208
  codegen-units = 1
@@ -2,8 +2,8 @@
2
2
 
3
3
  [![CI](https://github.com/0x676e67/wreq/actions/workflows/ci.yml/badge.svg)](https://github.com/0x676e67/wreq/actions/workflows/ci.yml)
4
4
  [![Crates.io License](https://img.shields.io/crates/l/wreq)](https://github.com/0x676e67/wreq/blob/main/LICENSE)
5
- [![Crates.io MSRV](https://img.shields.io/crates/msrv/wreq?logo=rust)](https://crates.io/crates/wreq)
6
- [![crates.io](https://img.shields.io/crates/v/wreq.svg?logo=rust)](https://crates.io/crates/wreq)
5
+ [![Crates.io MSRV](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fcrates.io%2Fapi%2Fv1%2Fcrates%2Fwreq%2Fversions%3Fsort%3Ddate%26per_page%3D1&query=%24.versions%5B0%5D.rust_version&suffix=.0&label=MSRV&color=blue&logo=rust)](https://crates.io/crates/wreq)
6
+ [![crates.io](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fcrates.io%2Fapi%2Fv1%2Fcrates%2Fwreq&query=%24.crate.max_stable_version&prefix=v&label=crates.io&color=orange&logo=rust)](https://crates.io/crates/wreq)
7
7
  [![Discord chat][discord-badge]][discord-url]
8
8
 
9
9
  [discord-badge]: https://img.shields.io/discord/1486741856397164788.svg?logo=discord
@@ -35,8 +35,8 @@ The following example uses the [Tokio](https://tokio.rs) runtime with optional f
35
35
  ```toml
36
36
  [dependencies]
37
37
  tokio = { version = "1", features = ["full"] }
38
- wreq = "6.0.0-rc"
39
- wreq-util = "3.0.0-rc"
38
+ wreq = "0.16"
39
+ wreq-util = "0.2"
40
40
  ```
41
41
 
42
42
  And then the code:
@@ -53,7 +53,7 @@ async fn main() -> wreq::Result<()> {
53
53
  .build()?;
54
54
 
55
55
  // Use the API you're already familiar with
56
- let resp = client.get("https://tls.peet.ws/api/all").send().await?;
56
+ let resp = client.get("https://pingly.us.kg/api/all").send().await?;
57
57
  println!("{}", resp.text().await?);
58
58
  Ok(())
59
59
  }
@@ -1,8 +1,10 @@
1
1
  use criterion::Criterion;
2
2
 
3
3
  use crate::support::{
4
- BoxError, HttpVersion, Tls, client::bench_clients, current_thread_runtime,
5
- multi_thread_runtime, server::with_server,
4
+ BoxError, HttpVersion, Tls,
5
+ client::bench_clients,
6
+ rt::{current_thread_runtime, multi_thread_runtime},
7
+ server::with_server,
6
8
  };
7
9
 
8
10
  pub const CURRENT_THREAD_LABEL: &str = "current_thread";
@@ -54,6 +56,7 @@ pub fn bench(
54
56
  bench_clients(
55
57
  &mut group,
56
58
  current_thread_runtime,
59
+ true,
57
60
  addr,
58
61
  tls,
59
62
  http_version,
@@ -74,6 +77,7 @@ pub fn bench(
74
77
  bench_clients(
75
78
  &mut group,
76
79
  multi_thread_runtime,
80
+ false,
77
81
  addr,
78
82
  tls,
79
83
  http_version,
@@ -2,10 +2,11 @@ use std::{convert::Infallible, net::SocketAddr, sync::Arc};
2
2
 
3
3
  use bytes::Bytes;
4
4
  use criterion::{BenchmarkGroup, measurement::WallTime};
5
+ use futures::{StreamExt, TryStreamExt};
5
6
  use http_body_util::BodyExt;
6
7
  use tokio::{runtime::Runtime, sync::Semaphore};
7
8
 
8
- use super::{BoxError, HttpVersion, Tls};
9
+ use super::{BoxError, HttpVersion, Tls, rt::CompioBenchExecutor};
9
10
 
10
11
  fn create_wreq_client(tls: Tls, http_version: HttpVersion) -> Result<wreq::Client, BoxError> {
11
12
  let builder = wreq::Client::builder()
@@ -35,6 +36,20 @@ fn create_reqwest_client(tls: Tls, http_version: HttpVersion) -> Result<reqwest:
35
36
  Ok(builder.build()?)
36
37
  }
37
38
 
39
+ fn create_cyper_client(tls: Tls, http_version: HttpVersion) -> Result<cyper::Client, BoxError> {
40
+ let builder = cyper::Client::builder()
41
+ .no_proxy()
42
+ .redirect(cyper::redirect::Policy::none())
43
+ .danger_accept_invalid_certs(matches!(tls, Tls::Enabled));
44
+
45
+ let builder = match http_version {
46
+ HttpVersion::Http1 => builder,
47
+ HttpVersion::Http2 => builder.http2_prior_knowledge(),
48
+ };
49
+
50
+ Ok(builder.build()?)
51
+ }
52
+
38
53
  async fn wreq_body_assert(mut response: wreq::Response, expected_body_size: usize) {
39
54
  let mut body_size = 0;
40
55
  while let Some(Ok(chunk)) = response.frame().await {
@@ -59,6 +74,17 @@ async fn reqwest_body_assert(mut response: reqwest::Response, expected_body_size
59
74
  );
60
75
  }
61
76
 
77
+ async fn cyper_body_assert(mut response: cyper::Response, expected_body_size: usize) {
78
+ let mut body_size = 0;
79
+ while let Some(Ok(chunk)) = response.next().await {
80
+ body_size += chunk.len();
81
+ }
82
+ assert!(
83
+ body_size == expected_body_size,
84
+ "Unexpected response body: got {body_size} bytes, expected {expected_body_size} bytes"
85
+ );
86
+ }
87
+
62
88
  fn stream_from_bytes(
63
89
  body: &'static [u8],
64
90
  chunk_size: usize,
@@ -94,6 +120,16 @@ fn reqwest_body(stream: bool, (body, chunk_size): (&'static [u8], usize)) -> req
94
120
  }
95
121
  }
96
122
 
123
+ #[inline]
124
+ fn cyper_body(stream: bool, (body, chunk_size): (&'static [u8], usize)) -> cyper::Body {
125
+ if stream {
126
+ let stream = stream_from_bytes(body, chunk_size).map_err(|never| match never {});
127
+ cyper::Body::stream(stream)
128
+ } else {
129
+ cyper::Body::from(body)
130
+ }
131
+ }
132
+
97
133
  async fn wreq_requests_concurrent(
98
134
  client: &wreq::Client,
99
135
  url: &str,
@@ -158,10 +194,44 @@ async fn reqwest_requests_concurrent(
158
194
  futures_util::future::join_all(handles).await;
159
195
  }
160
196
 
197
+ async fn cyper_requests_concurrent(
198
+ client: &cyper::Client,
199
+ url: &str,
200
+ num_requests: usize,
201
+ concurrent_limit: usize,
202
+ body: (&'static [u8], usize),
203
+ stream: bool,
204
+ ) {
205
+ let semaphore = Arc::new(Semaphore::new(concurrent_limit));
206
+ let mut handles = Vec::with_capacity(num_requests);
207
+ for _ in 0..num_requests {
208
+ let client = client.clone();
209
+ let url = url.to_string();
210
+ let semaphore = semaphore.clone();
211
+ let fut = async move {
212
+ let _permit = semaphore
213
+ .acquire()
214
+ .await
215
+ .expect("Semaphore should be acquirable");
216
+ let response = client
217
+ .post(url)
218
+ .expect("Unexpected request failure")
219
+ .body(cyper_body(stream, body))
220
+ .send()
221
+ .await
222
+ .expect("Unexpected request failure");
223
+ cyper_body_assert(response, body.0.len()).await;
224
+ };
225
+ handles.push(compio::runtime::spawn(fut));
226
+ }
227
+ futures_util::future::join_all(handles).await;
228
+ }
229
+
161
230
  #[allow(clippy::too_many_arguments)]
162
231
  pub fn bench_clients(
163
232
  group: &mut BenchmarkGroup<'_, WallTime>,
164
233
  rt: fn() -> Runtime,
234
+ include_cyper: bool,
165
235
  addr: SocketAddr,
166
236
  tls: Tls,
167
237
  http_version: HttpVersion,
@@ -211,6 +281,23 @@ pub fn bench_clients(
211
281
  })
212
282
  });
213
283
  ::std::mem::drop(client);
284
+
285
+ if include_cyper {
286
+ let compio_executor = CompioBenchExecutor::new()?;
287
+ let client = create_cyper_client(tls, http_version)?;
288
+ group.bench_function(make_benchmark_label::<cyper::Client>(stream), |b| {
289
+ b.to_async(&compio_executor).iter(|| {
290
+ cyper_requests_concurrent(
291
+ &client,
292
+ &url,
293
+ num_requests,
294
+ concurrent_limit,
295
+ body,
296
+ stream,
297
+ )
298
+ })
299
+ });
300
+ }
214
301
  }
215
302
 
216
303
  Ok(())
File without changes
@@ -0,0 +1,34 @@
1
+ use criterion::async_executor::AsyncExecutor;
2
+
3
+ pub struct CompioBenchExecutor {
4
+ runtime: compio::runtime::Runtime,
5
+ }
6
+
7
+ impl CompioBenchExecutor {
8
+ pub fn new() -> std::io::Result<Self> {
9
+ Ok(Self {
10
+ runtime: compio::runtime::Runtime::new()?,
11
+ })
12
+ }
13
+ }
14
+
15
+ impl AsyncExecutor for &CompioBenchExecutor {
16
+ fn block_on<T>(&self, future: impl std::future::Future<Output = T>) -> T {
17
+ self.runtime.block_on(future)
18
+ }
19
+ }
20
+
21
+ pub fn current_thread_runtime() -> tokio::runtime::Runtime {
22
+ tokio::runtime::Builder::new_current_thread()
23
+ .enable_all()
24
+ .build()
25
+ .expect("Failed to build current-thread runtime")
26
+ }
27
+
28
+ pub fn multi_thread_runtime() -> tokio::runtime::Runtime {
29
+ tokio::runtime::Builder::new_multi_thread()
30
+ .worker_threads(4)
31
+ .enable_all()
32
+ .build()
33
+ .expect("Failed to build multi-thread runtime")
34
+ }
@@ -20,7 +20,7 @@ use tokio::{
20
20
  };
21
21
  use tokio_btls::SslStream;
22
22
 
23
- use super::{BoxError, Tls, multi_thread_runtime};
23
+ use super::{BoxError, Tls, rt::multi_thread_runtime};
24
24
 
25
25
  pub struct Server {
26
26
  listener: std::net::TcpListener,
@@ -1,5 +1,6 @@
1
1
  pub mod bench;
2
2
  pub mod client;
3
+ pub mod rt;
3
4
  pub mod server;
4
5
 
5
6
  use std::fmt;
@@ -39,18 +40,3 @@ impl fmt::Display for Tls {
39
40
  f.write_str(value)
40
41
  }
41
42
  }
42
-
43
- pub fn current_thread_runtime() -> tokio::runtime::Runtime {
44
- tokio::runtime::Builder::new_current_thread()
45
- .enable_all()
46
- .build()
47
- .expect("Failed to build current-thread runtime")
48
- }
49
-
50
- pub fn multi_thread_runtime() -> tokio::runtime::Runtime {
51
- tokio::runtime::Builder::new_multi_thread()
52
- .worker_threads(4)
53
- .enable_all()
54
- .build()
55
- .expect("Failed to build multi-thread runtime")
56
- }
@@ -56,21 +56,21 @@ async fn main() -> wreq::Result<()> {
56
56
 
57
57
  // Use the API you're already familiar with
58
58
  let resp = client.get("https://self-signed.badssl.com/").send().await?;
59
- if let Some(tls_info) = resp.extensions().get::<TlsInfo>() {
60
- if let Some(peer_cert_der) = tls_info.peer_certificate() {
61
- // Create self-signed certificate Store
62
- let self_signed_store = CertStore::from_der_certs(&[peer_cert_der])?;
59
+ if let Some(tls_info) = resp.extensions().get::<TlsInfo>()
60
+ && let Some(peer_cert_der) = tls_info.peer_certificate()
61
+ {
62
+ // Create self-signed certificate Store
63
+ let self_signed_store = CertStore::from_der_certs([peer_cert_der])?;
63
64
 
64
- // Create a client with self-signed certificate store
65
- let client = Client::builder()
66
- .tls_cert_store(self_signed_store)
67
- .connect_timeout(Duration::from_secs(10))
68
- .build()?;
65
+ // Create a client with self-signed certificate store
66
+ let client = Client::builder()
67
+ .tls_cert_store(self_signed_store)
68
+ .connect_timeout(Duration::from_secs(10))
69
+ .build()?;
69
70
 
70
- // Use the API you're already familiar with
71
- let resp = client.get("https://self-signed.badssl.com/").send().await?;
72
- println!("{}", resp.text().await?);
73
- }
71
+ // Use the API you're already familiar with
72
+ let resp = client.get("https://self-signed.badssl.com/").send().await?;
73
+ println!("{}", resp.text().await?);
74
74
  }
75
75
 
76
76
  Ok(())
@@ -105,7 +105,7 @@ async fn main() -> wreq::Result<()> {
105
105
  .build(Default::default());
106
106
 
107
107
  // Use the API you're already familiar with
108
- let resp = wreq::get("https://tls.peet.ws/api/all")
108
+ let resp = wreq::get("https://pingly.us.kg/api/all")
109
109
  .emulation(emulation)
110
110
  .send()
111
111
  .await?;
@@ -0,0 +1,22 @@
1
+ use std::time::Duration;
2
+
3
+ use wreq::Client;
4
+
5
+ #[tokio::main]
6
+ async fn main() -> wreq::Result<()> {
7
+ // Reset connections on close rather than closing them gracefully.
8
+ let client = Client::builder().tcp_linger(Duration::ZERO).build()?;
9
+
10
+ let resp = client.get("https://tls.peet.ws/api/all").send().await?;
11
+ println!("{}", resp.text().await?);
12
+
13
+ // Non-zero duration waits for unsent data to be flushed.
14
+ let client = Client::builder()
15
+ .tcp_linger(Duration::from_secs(5))
16
+ .build()?;
17
+
18
+ let resp = client.get("https://tls.peet.ws/api/all").send().await?;
19
+ println!("{}", resp.text().await?);
20
+
21
+ Ok(())
22
+ }
@@ -156,20 +156,20 @@ impl<T: Poolable, K: Key> Pool<T, K> {
156
156
  /// Ensure that there is only ever 1 connecting task for HTTP/2
157
157
  /// connections. This does nothing for HTTP/1.
158
158
  pub fn connecting(&self, key: K, ver: Ver) -> Option<Connecting<T, K>> {
159
- if ver == Ver::Http2 {
160
- if let Some(ref enabled) = self.inner {
161
- let mut inner = enabled.lock();
162
- return if inner.connecting.insert(key.clone()) {
163
- let connecting = Connecting {
164
- key,
165
- pool: WeakOpt::downgrade(enabled),
166
- };
167
- Some(connecting)
168
- } else {
169
- trace!("HTTP/2 connecting already in progress for {:?}", key);
170
- None
159
+ if ver == Ver::Http2
160
+ && let Some(ref enabled) = self.inner
161
+ {
162
+ let mut inner = enabled.lock();
163
+ return if inner.connecting.insert(key.clone()) {
164
+ let connecting = Connecting {
165
+ key,
166
+ pool: WeakOpt::downgrade(enabled),
171
167
  };
172
- }
168
+ Some(connecting)
169
+ } else {
170
+ trace!("HTTP/2 connecting already in progress for {:?}", key);
171
+ None
172
+ };
173
173
  }
174
174
 
175
175
  // else
@@ -233,10 +233,10 @@ impl<T: Poolable, K: Key> Pool<T, K> {
233
233
  // unique or shared. So, the hack is to just assume Ver::Http2 means
234
234
  // shared... :(
235
235
  let mut pool_ref = WeakOpt::none();
236
- if !value.can_share() {
237
- if let Some(ref enabled) = self.inner {
238
- pool_ref = WeakOpt::downgrade(enabled);
239
- }
236
+ if !value.can_share()
237
+ && let Some(ref enabled) = self.inner
238
+ {
239
+ pool_ref = WeakOpt::downgrade(enabled);
240
240
  }
241
241
 
242
242
  Pooled {
@@ -232,6 +232,7 @@ where
232
232
  }
233
233
  }
234
234
 
235
+ #[allow(clippy::result_large_err)]
235
236
  async fn try_send_request(
236
237
  &self,
237
238
  mut req: Request<B>,
@@ -751,6 +752,7 @@ impl<B> PoolClient<B> {
751
752
 
752
753
  impl<B: Body + 'static> PoolClient<B> {
753
754
  #[inline]
755
+ #[allow(clippy::result_large_err)]
754
756
  fn try_send_request(
755
757
  &mut self,
756
758
  req: Request<B>,