wreq-rb 0.5.0 → 0.5.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 (150) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +1922 -397
  3. data/LICENSE +203 -0
  4. data/README.md +19 -15
  5. data/ext/wreq_rb/Cargo.toml +4 -6
  6. data/ext/wreq_rb/src/client.rs +41 -48
  7. data/lib/wreq-rb/version.rb +1 -1
  8. data/patches/0001-add-transfer-size-tracking.patch +76 -67
  9. data/vendor/wreq/Cargo.toml +119 -71
  10. data/vendor/wreq/README.md +25 -20
  11. data/vendor/wreq/bench/http1.rs +25 -0
  12. data/vendor/wreq/bench/http1_over_tls.rs +25 -0
  13. data/vendor/wreq/bench/http2.rs +25 -0
  14. data/vendor/wreq/bench/http2_over_tls.rs +25 -0
  15. data/vendor/wreq/bench/support/bench.rs +91 -0
  16. data/vendor/wreq/bench/support/client.rs +217 -0
  17. data/vendor/wreq/bench/support/server.rs +188 -0
  18. data/vendor/wreq/bench/support.rs +56 -0
  19. data/vendor/wreq/examples/cert_store.rs +4 -4
  20. data/vendor/wreq/examples/{emulation.rs → emulate.rs} +2 -2
  21. data/vendor/wreq/examples/http2_websocket.rs +2 -2
  22. data/vendor/wreq/examples/keylog.rs +3 -3
  23. data/vendor/wreq/examples/{request_with_emulation.rs → request_with_emulate.rs} +2 -2
  24. data/vendor/wreq/examples/rt.rs +23 -0
  25. data/vendor/wreq/src/client/body.rs +23 -61
  26. data/vendor/wreq/src/client/emulate.rs +119 -0
  27. data/vendor/wreq/src/client/{http/future.rs → future.rs} +11 -32
  28. data/vendor/wreq/src/client/{http → layer}/client/pool.rs +66 -61
  29. data/vendor/wreq/src/client/{http → layer}/client.rs +416 -270
  30. data/vendor/wreq/src/client/layer/config.rs +27 -6
  31. data/vendor/wreq/src/client/layer/decoder.rs +9 -4
  32. data/vendor/wreq/src/client/layer/redirect/future.rs +6 -3
  33. data/vendor/wreq/src/client/layer/redirect.rs +4 -5
  34. data/vendor/wreq/src/client/layer/retry.rs +8 -5
  35. data/vendor/wreq/src/client/layer/timeout/body.rs +15 -6
  36. data/vendor/wreq/src/client/layer/timeout/future.rs +23 -18
  37. data/vendor/wreq/src/client/layer/timeout.rs +24 -74
  38. data/vendor/wreq/src/client/layer.rs +1 -2
  39. data/vendor/wreq/src/client/multipart.rs +137 -154
  40. data/vendor/wreq/src/client/request.rs +202 -118
  41. data/vendor/wreq/src/client/response.rs +46 -45
  42. data/vendor/wreq/src/client/upgrade.rs +15 -0
  43. data/vendor/wreq/src/client/ws.rs +73 -25
  44. data/vendor/wreq/src/client.rs +1655 -17
  45. data/vendor/wreq/src/config.rs +11 -11
  46. data/vendor/wreq/src/{client/conn → conn}/connector.rs +139 -137
  47. data/vendor/wreq/src/conn/descriptor.rs +143 -0
  48. data/vendor/wreq/src/conn/http.rs +484 -0
  49. data/vendor/wreq/src/conn/net/io.rs +75 -0
  50. data/vendor/wreq/src/conn/net/tcp/compio.rs +71 -0
  51. data/vendor/wreq/src/conn/net/tcp/tokio.rs +57 -0
  52. data/vendor/wreq/src/conn/net/tcp.rs +561 -0
  53. data/vendor/wreq/src/conn/net/uds/compio.rs +60 -0
  54. data/vendor/wreq/src/{client/conn/uds.rs → conn/net/uds/tokio.rs} +18 -12
  55. data/vendor/wreq/src/conn/net/uds.rs +11 -0
  56. data/vendor/wreq/src/conn/net.rs +130 -0
  57. data/vendor/wreq/src/{client/conn → conn}/proxy/socks.rs +2 -9
  58. data/vendor/wreq/src/{client/conn → conn}/proxy/tunnel.rs +21 -56
  59. data/vendor/wreq/src/conn/tls_info.rs +47 -0
  60. data/vendor/wreq/src/{client/conn.rs → conn.rs} +202 -54
  61. data/vendor/wreq/src/cookie.rs +302 -142
  62. data/vendor/wreq/src/dns/gai/compio.rs +77 -0
  63. data/vendor/wreq/src/dns/gai/tokio.rs +90 -0
  64. data/vendor/wreq/src/dns/gai.rs +14 -164
  65. data/vendor/wreq/src/dns/hickory.rs +16 -23
  66. data/vendor/wreq/src/dns/resolve.rs +7 -41
  67. data/vendor/wreq/src/dns.rs +90 -7
  68. data/vendor/wreq/src/error.rs +57 -31
  69. data/vendor/wreq/src/ext.rs +25 -0
  70. data/vendor/wreq/src/group.rs +211 -0
  71. data/vendor/wreq/src/header.rs +100 -112
  72. data/vendor/wreq/src/lib.rs +124 -73
  73. data/vendor/wreq/src/proxy.rs +6 -20
  74. data/vendor/wreq/src/redirect.rs +1 -1
  75. data/vendor/wreq/src/rt.rs +208 -0
  76. data/vendor/wreq/src/sync.rs +97 -98
  77. data/vendor/wreq/src/tls/compress.rs +124 -0
  78. data/vendor/wreq/src/tls/conn/ext.rs +54 -45
  79. data/vendor/wreq/src/tls/conn/service.rs +14 -18
  80. data/vendor/wreq/src/tls/conn.rs +169 -241
  81. data/vendor/wreq/src/tls/keylog.rs +68 -5
  82. data/vendor/wreq/src/tls/session.rs +205 -0
  83. data/vendor/wreq/src/tls/{x509 → trust}/identity.rs +4 -21
  84. data/vendor/wreq/src/tls/{x509/parser.rs → trust/parse.rs} +1 -1
  85. data/vendor/wreq/src/tls/{x509 → trust}/store.rs +42 -81
  86. data/vendor/wreq/src/tls/{x509.rs → trust.rs} +8 -2
  87. data/vendor/wreq/src/tls.rs +489 -25
  88. data/vendor/wreq/src/trace.rs +0 -12
  89. data/vendor/wreq/src/util.rs +1 -1
  90. data/vendor/wreq/tests/badssl.rs +10 -10
  91. data/vendor/wreq/tests/client.rs +3 -9
  92. data/vendor/wreq/tests/cookie.rs +6 -8
  93. data/vendor/wreq/tests/{emulation.rs → emulate.rs} +130 -22
  94. data/vendor/wreq/tests/multipart.rs +43 -1
  95. data/vendor/wreq/tests/proxy.rs +1 -1
  96. data/vendor/wreq/tests/support/layer.rs +1 -0
  97. metadata +49 -71
  98. data/patches/0002-add-cancel-connections.patch +0 -181
  99. data/vendor/wreq/src/client/conn/conn.rs +0 -231
  100. data/vendor/wreq/src/client/conn/http.rs +0 -1023
  101. data/vendor/wreq/src/client/conn/tls_info.rs +0 -98
  102. data/vendor/wreq/src/client/core/body/incoming.rs +0 -485
  103. data/vendor/wreq/src/client/core/body/length.rs +0 -118
  104. data/vendor/wreq/src/client/core/body.rs +0 -34
  105. data/vendor/wreq/src/client/core/common/buf.rs +0 -149
  106. data/vendor/wreq/src/client/core/common/rewind.rs +0 -141
  107. data/vendor/wreq/src/client/core/common/watch.rs +0 -76
  108. data/vendor/wreq/src/client/core/common.rs +0 -3
  109. data/vendor/wreq/src/client/core/conn/http1.rs +0 -342
  110. data/vendor/wreq/src/client/core/conn/http2.rs +0 -307
  111. data/vendor/wreq/src/client/core/conn.rs +0 -11
  112. data/vendor/wreq/src/client/core/dispatch.rs +0 -299
  113. data/vendor/wreq/src/client/core/error.rs +0 -435
  114. data/vendor/wreq/src/client/core/ext.rs +0 -201
  115. data/vendor/wreq/src/client/core/http1.rs +0 -178
  116. data/vendor/wreq/src/client/core/http2.rs +0 -483
  117. data/vendor/wreq/src/client/core/proto/h1/conn.rs +0 -988
  118. data/vendor/wreq/src/client/core/proto/h1/decode.rs +0 -1170
  119. data/vendor/wreq/src/client/core/proto/h1/dispatch.rs +0 -684
  120. data/vendor/wreq/src/client/core/proto/h1/encode.rs +0 -580
  121. data/vendor/wreq/src/client/core/proto/h1/io.rs +0 -879
  122. data/vendor/wreq/src/client/core/proto/h1/role.rs +0 -694
  123. data/vendor/wreq/src/client/core/proto/h1.rs +0 -104
  124. data/vendor/wreq/src/client/core/proto/h2/client.rs +0 -650
  125. data/vendor/wreq/src/client/core/proto/h2/ping.rs +0 -539
  126. data/vendor/wreq/src/client/core/proto/h2.rs +0 -379
  127. data/vendor/wreq/src/client/core/proto/headers.rs +0 -138
  128. data/vendor/wreq/src/client/core/proto.rs +0 -58
  129. data/vendor/wreq/src/client/core/rt/bounds.rs +0 -57
  130. data/vendor/wreq/src/client/core/rt/timer.rs +0 -150
  131. data/vendor/wreq/src/client/core/rt/tokio.rs +0 -99
  132. data/vendor/wreq/src/client/core/rt.rs +0 -25
  133. data/vendor/wreq/src/client/core/upgrade.rs +0 -267
  134. data/vendor/wreq/src/client/core.rs +0 -16
  135. data/vendor/wreq/src/client/emulation.rs +0 -161
  136. data/vendor/wreq/src/client/http/client/error.rs +0 -142
  137. data/vendor/wreq/src/client/http/client/exec.rs +0 -29
  138. data/vendor/wreq/src/client/http/client/extra.rs +0 -77
  139. data/vendor/wreq/src/client/http/client/util.rs +0 -104
  140. data/vendor/wreq/src/client/http.rs +0 -1629
  141. data/vendor/wreq/src/client/layer/config/options.rs +0 -156
  142. data/vendor/wreq/src/client/layer/cookie.rs +0 -161
  143. data/vendor/wreq/src/hash.rs +0 -143
  144. data/vendor/wreq/src/tls/conn/cache.rs +0 -123
  145. data/vendor/wreq/src/tls/conn/cert_compression.rs +0 -125
  146. data/vendor/wreq/src/tls/keylog/handle.rs +0 -64
  147. data/vendor/wreq/src/tls/options.rs +0 -464
  148. /data/vendor/wreq/src/client/{http → layer}/client/lazy.rs +0 -0
  149. /data/vendor/wreq/src/{client/conn → conn}/proxy.rs +0 -0
  150. /data/vendor/wreq/src/{client/conn → conn}/verbose.rs +0 -0
@@ -1,7 +1,6 @@
1
1
  mod support;
2
- use std::sync::Arc;
3
2
 
4
- use http::header::COOKIE;
3
+ use http::{Version, header::COOKIE};
5
4
  use support::server;
6
5
  use wreq::{Client, cookie::Jar};
7
6
 
@@ -231,6 +230,7 @@ async fn cookie_request_level_compression() {
231
230
  .body(Default::default())
232
231
  .unwrap(),
233
232
  "/default" | "/compressed" => {
233
+ assert_eq!(req.version(), Version::HTTP_11);
234
234
  let cookies = req
235
235
  .headers()
236
236
  .get(COOKIE)
@@ -245,6 +245,7 @@ async fn cookie_request_level_compression() {
245
245
  http::Response::default()
246
246
  }
247
247
  "/uncompressed" => {
248
+ assert_eq!(req.version(), Version::HTTP_2);
248
249
  let cookies: Vec<_> = req
249
250
  .headers()
250
251
  .get_all(COOKIE)
@@ -265,12 +266,9 @@ async fn cookie_request_level_compression() {
265
266
 
266
267
  let base_url = format!("http://{}", server.addr());
267
268
 
268
- // Create a jar with compression enabled (default)
269
- let jar = Arc::new(Jar::default());
270
-
271
269
  // Create a client with this jar
272
270
  let client = Client::builder()
273
- .cookie_provider(jar.clone())
271
+ .cookie_provider(Jar::default())
274
272
  .build()
275
273
  .unwrap();
276
274
 
@@ -291,7 +289,7 @@ async fn cookie_request_level_compression() {
291
289
  // Request with compressed cookies
292
290
  client
293
291
  .get(format!("{}/compressed", base_url))
294
- .cookie_provider(jar.compressed())
292
+ .version(Version::HTTP_11)
295
293
  .send()
296
294
  .await
297
295
  .unwrap();
@@ -299,7 +297,7 @@ async fn cookie_request_level_compression() {
299
297
  // Request with uncompressed cookies
300
298
  client
301
299
  .get(format!("{}/uncompressed", base_url))
302
- .cookie_provider(jar.uncompressed())
300
+ .version(Version::HTTP_2)
303
301
  .send()
304
302
  .await
305
303
  .unwrap();
@@ -1,13 +1,105 @@
1
- use std::time::Duration;
1
+ use std::{
2
+ io::{self, Write},
3
+ time::Duration,
4
+ };
2
5
 
6
+ use brotli::{CompressorWriter as BrotliEncoder, Decompressor as BrotliDecoder};
7
+ use flate2::{Compression, read::ZlibDecoder, write::ZlibEncoder};
3
8
  use wreq::{
4
9
  Client, Emulation,
5
10
  http1::Http1Options,
6
11
  http2::{
7
12
  Http2Options, PseudoId, PseudoOrder, SettingId, SettingsOrder, StreamDependency, StreamId,
8
13
  },
9
- tls::{AlpnProtocol, CertificateCompressionAlgorithm, ExtensionType, TlsOptions, TlsVersion},
14
+ tls::{
15
+ AlpnProtocol, ExtensionType, KeyShare, TlsOptions, TlsVersion,
16
+ compress::{CertificateCompressionAlgorithm, CertificateCompressor, Codec},
17
+ },
10
18
  };
19
+ use zstd::stream::{Decoder as ZstdDecoder, Encoder as ZstdEncoder};
20
+
21
+ #[derive(Debug)]
22
+ struct BrotliCompressor {
23
+ q: u32,
24
+ lgwin: u32,
25
+ }
26
+
27
+ #[derive(Debug)]
28
+ struct ZlibCompressor;
29
+
30
+ #[derive(Debug)]
31
+ struct ZstdCompressor;
32
+
33
+ impl CertificateCompressor for BrotliCompressor {
34
+ fn compress(&self) -> Codec {
35
+ let q = self.q;
36
+ let lgwin = self.lgwin;
37
+ Codec::Dynamic(Box::new(move |input, output| {
38
+ let mut writer = BrotliEncoder::new(output, input.len(), q, lgwin);
39
+ writer.write_all(input)?;
40
+ writer.flush()?;
41
+ Ok(())
42
+ }))
43
+ }
44
+
45
+ fn decompress(&self) -> Codec {
46
+ Codec::Pointer(|input, output| {
47
+ let mut reader = BrotliDecoder::new(input, 4096);
48
+ io::copy(&mut reader, output)?;
49
+ Ok(())
50
+ })
51
+ }
52
+
53
+ fn algorithm(&self) -> CertificateCompressionAlgorithm {
54
+ CertificateCompressionAlgorithm::BROTLI
55
+ }
56
+ }
57
+
58
+ impl CertificateCompressor for ZlibCompressor {
59
+ fn compress(&self) -> Codec {
60
+ Codec::Pointer(|input, output| {
61
+ let mut encoder = ZlibEncoder::new(output, Compression::default());
62
+ encoder.write_all(input)?;
63
+ encoder.finish()?;
64
+ Ok(())
65
+ })
66
+ }
67
+
68
+ fn decompress(&self) -> Codec {
69
+ Codec::Pointer(|input, output| {
70
+ let mut reader = ZlibDecoder::new(input);
71
+ io::copy(&mut reader, output)?;
72
+ Ok(())
73
+ })
74
+ }
75
+
76
+ fn algorithm(&self) -> CertificateCompressionAlgorithm {
77
+ CertificateCompressionAlgorithm::ZLIB
78
+ }
79
+ }
80
+
81
+ impl CertificateCompressor for ZstdCompressor {
82
+ fn compress(&self) -> Codec {
83
+ Codec::Pointer(|input, output| {
84
+ let mut encoder = ZstdEncoder::new(output, 0)?;
85
+ encoder.write_all(input)?;
86
+ encoder.finish()?;
87
+ Ok(())
88
+ })
89
+ }
90
+
91
+ fn decompress(&self) -> Codec {
92
+ Codec::Pointer(|input, output| {
93
+ let mut reader = ZstdDecoder::new(input)?;
94
+ io::copy(&mut reader, output)?;
95
+ Ok(())
96
+ })
97
+ }
98
+
99
+ fn algorithm(&self) -> CertificateCompressionAlgorithm {
100
+ CertificateCompressionAlgorithm::ZSTD
101
+ }
102
+ }
11
103
 
12
104
  macro_rules! join {
13
105
  ($sep:expr, $first:expr $(, $rest:expr)*) => {
@@ -69,10 +161,10 @@ fn tls_options_template() -> TlsOptions {
69
161
  "ecdsa_secp521r1_sha512",
70
162
  "ecdsa_sha1"
71
163
  ))
72
- .certificate_compression_algorithms(&[
73
- CertificateCompressionAlgorithm::ZLIB,
74
- CertificateCompressionAlgorithm::BROTLI,
75
- CertificateCompressionAlgorithm::ZSTD,
164
+ .certificate_compressors(vec![
165
+ &ZlibCompressor as _,
166
+ &BrotliCompressor { q: 11, lgwin: 32 } as _,
167
+ &ZstdCompressor as _,
76
168
  ])
77
169
  .alpn_protocols([AlpnProtocol::HTTP2, AlpnProtocol::HTTP1])
78
170
  .record_size_limit(0x4001)
@@ -82,7 +174,11 @@ fn tls_options_template() -> TlsOptions {
82
174
  .enable_signed_cert_timestamps(true)
83
175
  .min_tls_version(TlsVersion::TLS_1_2)
84
176
  .max_tls_version(TlsVersion::TLS_1_3)
85
- .key_shares_limit(3)
177
+ .key_shares(vec![
178
+ KeyShare::X25519_MLKEM768,
179
+ KeyShare::X25519,
180
+ KeyShare::P256,
181
+ ])
86
182
  .preserve_tls13_cipher_list(true)
87
183
  .aes_hw_override(true)
88
184
  .random_aes_hw_override(true)
@@ -96,6 +192,7 @@ fn tls_options_template() -> TlsOptions {
96
192
  ExtensionType::APPLICATION_LAYER_PROTOCOL_NEGOTIATION,
97
193
  ExtensionType::STATUS_REQUEST,
98
194
  ExtensionType::DELEGATED_CREDENTIAL,
195
+ ExtensionType::CERTIFICATE_TIMESTAMP,
99
196
  ExtensionType::KEY_SHARE,
100
197
  ExtensionType::SUPPORTED_VERSIONS,
101
198
  ExtensionType::SIGNATURE_ALGORITHMS,
@@ -103,10 +200,19 @@ fn tls_options_template() -> TlsOptions {
103
200
  ExtensionType::RECORD_SIZE_LIMIT,
104
201
  ExtensionType::CERT_COMPRESSION,
105
202
  ExtensionType::ENCRYPTED_CLIENT_HELLO,
203
+ ExtensionType::PADDING,
106
204
  ])
107
205
  .build()
108
206
  }
109
207
 
208
+ fn http1_options_template() -> Http1Options {
209
+ // HTTP/1 options config
210
+ Http1Options::builder()
211
+ .allow_obsolete_multiline_headers_in_responses(true)
212
+ .max_headers(100)
213
+ .build()
214
+ }
215
+
110
216
  fn http2_options_template() -> Http2Options {
111
217
  // HTTP/2 headers frame pseudo-header order
112
218
  let headers_pseudo_order = PseudoOrder::builder()
@@ -145,18 +251,12 @@ fn http2_options_template() -> Http2Options {
145
251
  }
146
252
 
147
253
  fn emulation_template() -> Emulation {
148
- // HTTP/1 options config
149
- let http1 = Http1Options::builder()
150
- .allow_obsolete_multiline_headers_in_responses(true)
151
- .max_headers(100)
152
- .build();
153
-
154
- // This provider encapsulates TLS, HTTP/1, HTTP/2, default headers, and original headers
254
+ // This provider encapsulates TLS, HTTP/1, HTTP/2
155
255
  Emulation::builder()
156
256
  .tls_options(tls_options_template())
157
- .http1_options(http1)
257
+ .http1_options(http1_options_template())
158
258
  .http2_options(http2_options_template())
159
- .build()
259
+ .build(Default::default())
160
260
  }
161
261
 
162
262
  #[tokio::test]
@@ -164,7 +264,7 @@ async fn test_emulation() -> wreq::Result<()> {
164
264
  let client = Client::builder()
165
265
  .emulation(emulation_template())
166
266
  .connect_timeout(Duration::from_secs(10))
167
- .cert_verification(false)
267
+ .tls_cert_verification(false)
168
268
  .build()?;
169
269
 
170
270
  let text = client
@@ -190,7 +290,7 @@ async fn test_emulation() -> wreq::Result<()> {
190
290
  async fn test_request_with_emulation() -> wreq::Result<()> {
191
291
  let client = Client::builder()
192
292
  .connect_timeout(Duration::from_secs(10))
193
- .cert_verification(false)
293
+ .tls_cert_verification(false)
194
294
  .build()?;
195
295
 
196
296
  let text = client
@@ -217,12 +317,16 @@ async fn test_request_with_emulation() -> wreq::Result<()> {
217
317
  async fn test_request_with_emulation_tls() -> wreq::Result<()> {
218
318
  let client = Client::builder()
219
319
  .connect_timeout(Duration::from_secs(10))
220
- .cert_verification(false)
320
+ .tls_cert_verification(false)
221
321
  .build()?;
222
322
 
323
+ let emulation = Emulation::builder()
324
+ .tls_options(tls_options_template())
325
+ .build(Default::default());
326
+
223
327
  let text = client
224
328
  .get("https://tls.browserleaks.com/")
225
- .emulation(tls_options_template())
329
+ .emulation(emulation)
226
330
  .send()
227
331
  .await?
228
332
  .text()
@@ -240,12 +344,16 @@ async fn test_request_with_emulation_tls() -> wreq::Result<()> {
240
344
  async fn test_request_with_emulation_http2() -> wreq::Result<()> {
241
345
  let client = Client::builder()
242
346
  .connect_timeout(Duration::from_secs(10))
243
- .cert_verification(false)
347
+ .tls_cert_verification(false)
244
348
  .build()?;
245
349
 
350
+ let emulation = Emulation::builder()
351
+ .http2_options(http2_options_template())
352
+ .build(Default::default());
353
+
246
354
  let text = client
247
355
  .get("https://tls.browserleaks.com/")
248
- .emulation(http2_options_template())
356
+ .emulation(emulation)
249
357
  .send()
250
358
  .await?
251
359
  .text()
@@ -51,6 +51,48 @@ async fn text_part() {
51
51
  assert_eq!(res.status(), wreq::StatusCode::OK);
52
52
  }
53
53
 
54
+ #[tokio::test]
55
+ async fn text_part_with_custom_boundary() {
56
+ let _ = env_logger::try_init();
57
+
58
+ let form =
59
+ wreq::multipart::Form::with_boundary("----WebKitFormBoundary0123456789").text("foo", "bar");
60
+
61
+ let expected_body = "\
62
+ ------WebKitFormBoundary0123456789\r\n\
63
+ Content-Disposition: form-data; name=\"foo\"\r\n\r\n\
64
+ bar\r\n\
65
+ ------WebKitFormBoundary0123456789--\r\n\
66
+ ";
67
+
68
+ let ct = "multipart/form-data; boundary=----WebKitFormBoundary0123456789";
69
+
70
+ let server = server::http(move |mut req| async move {
71
+ assert_eq!(req.method(), "POST");
72
+ assert_eq!(req.headers()["content-type"], ct);
73
+ assert_eq!(
74
+ req.headers()["content-length"],
75
+ expected_body.len().to_string()
76
+ );
77
+
78
+ let mut full: Vec<u8> = Vec::new();
79
+ while let Some(item) = req.body_mut().frame().await {
80
+ full.extend(&*item.unwrap().into_data().unwrap());
81
+ }
82
+
83
+ assert_eq!(full, expected_body.as_bytes());
84
+
85
+ http::Response::default()
86
+ });
87
+
88
+ let url = format!("http://{}/multipart/1", server.addr());
89
+
90
+ let res = wreq::post(&url).multipart(form).send().await.unwrap();
91
+
92
+ assert_eq!(res.uri(), url.as_str());
93
+ assert_eq!(res.status(), wreq::StatusCode::OK);
94
+ }
95
+
54
96
  #[cfg(feature = "stream")]
55
97
  #[tokio::test]
56
98
  async fn stream_part() {
@@ -111,7 +153,7 @@ async fn stream_part() {
111
153
  assert_eq!(res.status(), wreq::StatusCode::OK);
112
154
  }
113
155
 
114
- #[cfg(feature = "stream")]
156
+ #[cfg(all(feature = "tokio-rt", feature = "stream"))]
115
157
  #[tokio::test]
116
158
  async fn async_impl_file_part() {
117
159
  let _ = env_logger::try_init();
@@ -404,7 +404,7 @@ async fn tunnel_includes_user_agent() {
404
404
  #[tokio::test]
405
405
  async fn proxy_tunnel_connect_error() {
406
406
  let client = Client::builder()
407
- .cert_verification(false)
407
+ .tls_cert_verification(false)
408
408
  .no_proxy()
409
409
  .build()
410
410
  .unwrap();
@@ -44,6 +44,7 @@ pub struct Delay<S> {
44
44
  inner: S,
45
45
  delay: Duration,
46
46
  }
47
+
47
48
  impl<S> Delay<S> {
48
49
  pub fn new(inner: S, delay: Duration) -> Self {
49
50
  Delay { inner, delay }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wreq-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yicheng Zhou
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2026-03-17 00:00:00.000000000 Z
12
+ date: 2026-06-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rb_sys
@@ -37,6 +37,7 @@ extra_rdoc_files: []
37
37
  files:
38
38
  - Cargo.lock
39
39
  - Cargo.toml
40
+ - LICENSE
40
41
  - README.md
41
42
  - exe/wreq
42
43
  - ext/wreq_rb/Cargo.toml
@@ -48,86 +49,44 @@ files:
48
49
  - lib/wreq-rb.rb
49
50
  - lib/wreq-rb/version.rb
50
51
  - patches/0001-add-transfer-size-tracking.patch
51
- - patches/0002-add-cancel-connections.patch
52
52
  - vendor/wreq/Cargo.toml
53
53
  - vendor/wreq/LICENSE
54
54
  - vendor/wreq/README.md
55
+ - vendor/wreq/bench/http1.rs
56
+ - vendor/wreq/bench/http1_over_tls.rs
57
+ - vendor/wreq/bench/http2.rs
58
+ - vendor/wreq/bench/http2_over_tls.rs
59
+ - vendor/wreq/bench/support.rs
60
+ - vendor/wreq/bench/support/bench.rs
61
+ - vendor/wreq/bench/support/client.rs
62
+ - vendor/wreq/bench/support/server.rs
55
63
  - vendor/wreq/examples/cert_store.rs
56
64
  - vendor/wreq/examples/connect_via_lower_priority_tokio_runtime.rs
57
- - vendor/wreq/examples/emulation.rs
65
+ - vendor/wreq/examples/emulate.rs
58
66
  - vendor/wreq/examples/form.rs
59
67
  - vendor/wreq/examples/http1_websocket.rs
60
68
  - vendor/wreq/examples/http2_websocket.rs
61
69
  - vendor/wreq/examples/json_dynamic.rs
62
70
  - vendor/wreq/examples/json_typed.rs
63
71
  - vendor/wreq/examples/keylog.rs
64
- - vendor/wreq/examples/request_with_emulation.rs
72
+ - vendor/wreq/examples/request_with_emulate.rs
65
73
  - vendor/wreq/examples/request_with_interface.rs
66
74
  - vendor/wreq/examples/request_with_local_address.rs
67
75
  - vendor/wreq/examples/request_with_proxy.rs
68
76
  - vendor/wreq/examples/request_with_redirect.rs
69
77
  - vendor/wreq/examples/request_with_version.rs
78
+ - vendor/wreq/examples/rt.rs
70
79
  - vendor/wreq/examples/tor_socks.rs
71
80
  - vendor/wreq/examples/unix_socket.rs
72
81
  - vendor/wreq/src/client.rs
73
82
  - vendor/wreq/src/client/body.rs
74
- - vendor/wreq/src/client/conn.rs
75
- - vendor/wreq/src/client/conn/conn.rs
76
- - vendor/wreq/src/client/conn/connector.rs
77
- - vendor/wreq/src/client/conn/http.rs
78
- - vendor/wreq/src/client/conn/proxy.rs
79
- - vendor/wreq/src/client/conn/proxy/socks.rs
80
- - vendor/wreq/src/client/conn/proxy/tunnel.rs
81
- - vendor/wreq/src/client/conn/tls_info.rs
82
- - vendor/wreq/src/client/conn/uds.rs
83
- - vendor/wreq/src/client/conn/verbose.rs
84
- - vendor/wreq/src/client/core.rs
85
- - vendor/wreq/src/client/core/body.rs
86
- - vendor/wreq/src/client/core/body/incoming.rs
87
- - vendor/wreq/src/client/core/body/length.rs
88
- - vendor/wreq/src/client/core/common.rs
89
- - vendor/wreq/src/client/core/common/buf.rs
90
- - vendor/wreq/src/client/core/common/rewind.rs
91
- - vendor/wreq/src/client/core/common/watch.rs
92
- - vendor/wreq/src/client/core/conn.rs
93
- - vendor/wreq/src/client/core/conn/http1.rs
94
- - vendor/wreq/src/client/core/conn/http2.rs
95
- - vendor/wreq/src/client/core/dispatch.rs
96
- - vendor/wreq/src/client/core/error.rs
97
- - vendor/wreq/src/client/core/ext.rs
98
- - vendor/wreq/src/client/core/http1.rs
99
- - vendor/wreq/src/client/core/http2.rs
100
- - vendor/wreq/src/client/core/proto.rs
101
- - vendor/wreq/src/client/core/proto/h1.rs
102
- - vendor/wreq/src/client/core/proto/h1/conn.rs
103
- - vendor/wreq/src/client/core/proto/h1/decode.rs
104
- - vendor/wreq/src/client/core/proto/h1/dispatch.rs
105
- - vendor/wreq/src/client/core/proto/h1/encode.rs
106
- - vendor/wreq/src/client/core/proto/h1/io.rs
107
- - vendor/wreq/src/client/core/proto/h1/role.rs
108
- - vendor/wreq/src/client/core/proto/h2.rs
109
- - vendor/wreq/src/client/core/proto/h2/client.rs
110
- - vendor/wreq/src/client/core/proto/h2/ping.rs
111
- - vendor/wreq/src/client/core/proto/headers.rs
112
- - vendor/wreq/src/client/core/rt.rs
113
- - vendor/wreq/src/client/core/rt/bounds.rs
114
- - vendor/wreq/src/client/core/rt/timer.rs
115
- - vendor/wreq/src/client/core/rt/tokio.rs
116
- - vendor/wreq/src/client/core/upgrade.rs
117
- - vendor/wreq/src/client/emulation.rs
118
- - vendor/wreq/src/client/http.rs
119
- - vendor/wreq/src/client/http/client.rs
120
- - vendor/wreq/src/client/http/client/error.rs
121
- - vendor/wreq/src/client/http/client/exec.rs
122
- - vendor/wreq/src/client/http/client/extra.rs
123
- - vendor/wreq/src/client/http/client/lazy.rs
124
- - vendor/wreq/src/client/http/client/pool.rs
125
- - vendor/wreq/src/client/http/client/util.rs
126
- - vendor/wreq/src/client/http/future.rs
83
+ - vendor/wreq/src/client/emulate.rs
84
+ - vendor/wreq/src/client/future.rs
127
85
  - vendor/wreq/src/client/layer.rs
86
+ - vendor/wreq/src/client/layer/client.rs
87
+ - vendor/wreq/src/client/layer/client/lazy.rs
88
+ - vendor/wreq/src/client/layer/client/pool.rs
128
89
  - vendor/wreq/src/client/layer/config.rs
129
- - vendor/wreq/src/client/layer/config/options.rs
130
- - vendor/wreq/src/client/layer/cookie.rs
131
90
  - vendor/wreq/src/client/layer/decoder.rs
132
91
  - vendor/wreq/src/client/layer/redirect.rs
133
92
  - vendor/wreq/src/client/layer/redirect/future.rs
@@ -141,18 +100,38 @@ files:
141
100
  - vendor/wreq/src/client/multipart.rs
142
101
  - vendor/wreq/src/client/request.rs
143
102
  - vendor/wreq/src/client/response.rs
103
+ - vendor/wreq/src/client/upgrade.rs
144
104
  - vendor/wreq/src/client/ws.rs
145
105
  - vendor/wreq/src/client/ws/json.rs
146
106
  - vendor/wreq/src/client/ws/message.rs
147
107
  - vendor/wreq/src/config.rs
108
+ - vendor/wreq/src/conn.rs
109
+ - vendor/wreq/src/conn/connector.rs
110
+ - vendor/wreq/src/conn/descriptor.rs
111
+ - vendor/wreq/src/conn/http.rs
112
+ - vendor/wreq/src/conn/net.rs
113
+ - vendor/wreq/src/conn/net/io.rs
114
+ - vendor/wreq/src/conn/net/tcp.rs
115
+ - vendor/wreq/src/conn/net/tcp/compio.rs
116
+ - vendor/wreq/src/conn/net/tcp/tokio.rs
117
+ - vendor/wreq/src/conn/net/uds.rs
118
+ - vendor/wreq/src/conn/net/uds/compio.rs
119
+ - vendor/wreq/src/conn/net/uds/tokio.rs
120
+ - vendor/wreq/src/conn/proxy.rs
121
+ - vendor/wreq/src/conn/proxy/socks.rs
122
+ - vendor/wreq/src/conn/proxy/tunnel.rs
123
+ - vendor/wreq/src/conn/tls_info.rs
124
+ - vendor/wreq/src/conn/verbose.rs
148
125
  - vendor/wreq/src/cookie.rs
149
126
  - vendor/wreq/src/dns.rs
150
127
  - vendor/wreq/src/dns/gai.rs
128
+ - vendor/wreq/src/dns/gai/compio.rs
129
+ - vendor/wreq/src/dns/gai/tokio.rs
151
130
  - vendor/wreq/src/dns/hickory.rs
152
131
  - vendor/wreq/src/dns/resolve.rs
153
132
  - vendor/wreq/src/error.rs
154
133
  - vendor/wreq/src/ext.rs
155
- - vendor/wreq/src/hash.rs
134
+ - vendor/wreq/src/group.rs
156
135
  - vendor/wreq/src/header.rs
157
136
  - vendor/wreq/src/into_uri.rs
158
137
  - vendor/wreq/src/lib.rs
@@ -163,21 +142,20 @@ files:
163
142
  - vendor/wreq/src/proxy/win.rs
164
143
  - vendor/wreq/src/redirect.rs
165
144
  - vendor/wreq/src/retry.rs
145
+ - vendor/wreq/src/rt.rs
166
146
  - vendor/wreq/src/sync.rs
167
147
  - vendor/wreq/src/tls.rs
148
+ - vendor/wreq/src/tls/compress.rs
168
149
  - vendor/wreq/src/tls/conn.rs
169
- - vendor/wreq/src/tls/conn/cache.rs
170
- - vendor/wreq/src/tls/conn/cert_compression.rs
171
150
  - vendor/wreq/src/tls/conn/ext.rs
172
151
  - vendor/wreq/src/tls/conn/macros.rs
173
152
  - vendor/wreq/src/tls/conn/service.rs
174
153
  - vendor/wreq/src/tls/keylog.rs
175
- - vendor/wreq/src/tls/keylog/handle.rs
176
- - vendor/wreq/src/tls/options.rs
177
- - vendor/wreq/src/tls/x509.rs
178
- - vendor/wreq/src/tls/x509/identity.rs
179
- - vendor/wreq/src/tls/x509/parser.rs
180
- - vendor/wreq/src/tls/x509/store.rs
154
+ - vendor/wreq/src/tls/session.rs
155
+ - vendor/wreq/src/tls/trust.rs
156
+ - vendor/wreq/src/tls/trust/identity.rs
157
+ - vendor/wreq/src/tls/trust/parse.rs
158
+ - vendor/wreq/src/tls/trust/store.rs
181
159
  - vendor/wreq/src/trace.rs
182
160
  - vendor/wreq/src/util.rs
183
161
  - vendor/wreq/tests/badssl.rs
@@ -186,7 +164,7 @@ files:
186
164
  - vendor/wreq/tests/connector_layers.rs
187
165
  - vendor/wreq/tests/cookie.rs
188
166
  - vendor/wreq/tests/deflate.rs
189
- - vendor/wreq/tests/emulation.rs
167
+ - vendor/wreq/tests/emulate.rs
190
168
  - vendor/wreq/tests/gzip.rs
191
169
  - vendor/wreq/tests/layers.rs
192
170
  - vendor/wreq/tests/multipart.rs
@@ -204,7 +182,7 @@ files:
204
182
  - vendor/wreq/tests/zstd.rs
205
183
  homepage: https://github.com/serpapi/wreq-rb
206
184
  licenses:
207
- - MIT
185
+ - Apache-2.0
208
186
  metadata: {}
209
187
  post_install_message:
210
188
  rdoc_options: []