wreq-rb 0.4.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 +47 -16
  5. data/exe/wreq +211 -0
  6. data/ext/wreq_rb/Cargo.toml +4 -6
  7. data/ext/wreq_rb/src/client.rs +145 -41
  8. data/lib/wreq-rb/version.rb +1 -1
  9. data/patches/0001-add-transfer-size-tracking.patch +76 -67
  10. data/vendor/wreq/Cargo.toml +119 -71
  11. data/vendor/wreq/README.md +25 -20
  12. data/vendor/wreq/bench/http1.rs +25 -0
  13. data/vendor/wreq/bench/http1_over_tls.rs +25 -0
  14. data/vendor/wreq/bench/http2.rs +25 -0
  15. data/vendor/wreq/bench/http2_over_tls.rs +25 -0
  16. data/vendor/wreq/bench/support/bench.rs +91 -0
  17. data/vendor/wreq/bench/support/client.rs +217 -0
  18. data/vendor/wreq/bench/support/server.rs +188 -0
  19. data/vendor/wreq/bench/support.rs +56 -0
  20. data/vendor/wreq/examples/cert_store.rs +4 -4
  21. data/vendor/wreq/examples/{emulation.rs → emulate.rs} +2 -2
  22. data/vendor/wreq/examples/http2_websocket.rs +2 -2
  23. data/vendor/wreq/examples/keylog.rs +3 -3
  24. data/vendor/wreq/examples/{request_with_emulation.rs → request_with_emulate.rs} +2 -2
  25. data/vendor/wreq/examples/rt.rs +23 -0
  26. data/vendor/wreq/src/client/body.rs +23 -61
  27. data/vendor/wreq/src/client/emulate.rs +119 -0
  28. data/vendor/wreq/src/client/{http/future.rs → future.rs} +11 -32
  29. data/vendor/wreq/src/client/{http → layer}/client/pool.rs +66 -61
  30. data/vendor/wreq/src/client/{http → layer}/client.rs +416 -270
  31. data/vendor/wreq/src/client/layer/config.rs +27 -6
  32. data/vendor/wreq/src/client/layer/decoder.rs +9 -4
  33. data/vendor/wreq/src/client/layer/redirect/future.rs +6 -3
  34. data/vendor/wreq/src/client/layer/redirect.rs +4 -5
  35. data/vendor/wreq/src/client/layer/retry.rs +8 -5
  36. data/vendor/wreq/src/client/layer/timeout/body.rs +15 -6
  37. data/vendor/wreq/src/client/layer/timeout/future.rs +23 -18
  38. data/vendor/wreq/src/client/layer/timeout.rs +24 -74
  39. data/vendor/wreq/src/client/layer.rs +1 -2
  40. data/vendor/wreq/src/client/multipart.rs +137 -154
  41. data/vendor/wreq/src/client/request.rs +202 -118
  42. data/vendor/wreq/src/client/response.rs +46 -45
  43. data/vendor/wreq/src/client/upgrade.rs +15 -0
  44. data/vendor/wreq/src/client/ws.rs +73 -25
  45. data/vendor/wreq/src/client.rs +1655 -17
  46. data/vendor/wreq/src/config.rs +11 -11
  47. data/vendor/wreq/src/{client/conn → conn}/connector.rs +139 -137
  48. data/vendor/wreq/src/conn/descriptor.rs +143 -0
  49. data/vendor/wreq/src/conn/http.rs +484 -0
  50. data/vendor/wreq/src/conn/net/io.rs +75 -0
  51. data/vendor/wreq/src/conn/net/tcp/compio.rs +71 -0
  52. data/vendor/wreq/src/conn/net/tcp/tokio.rs +57 -0
  53. data/vendor/wreq/src/conn/net/tcp.rs +561 -0
  54. data/vendor/wreq/src/conn/net/uds/compio.rs +60 -0
  55. data/vendor/wreq/src/{client/conn/uds.rs → conn/net/uds/tokio.rs} +18 -12
  56. data/vendor/wreq/src/conn/net/uds.rs +11 -0
  57. data/vendor/wreq/src/conn/net.rs +130 -0
  58. data/vendor/wreq/src/{client/conn → conn}/proxy/socks.rs +2 -9
  59. data/vendor/wreq/src/{client/conn → conn}/proxy/tunnel.rs +21 -56
  60. data/vendor/wreq/src/conn/tls_info.rs +47 -0
  61. data/vendor/wreq/src/{client/conn.rs → conn.rs} +202 -54
  62. data/vendor/wreq/src/cookie.rs +302 -142
  63. data/vendor/wreq/src/dns/gai/compio.rs +77 -0
  64. data/vendor/wreq/src/dns/gai/tokio.rs +90 -0
  65. data/vendor/wreq/src/dns/gai.rs +14 -164
  66. data/vendor/wreq/src/dns/hickory.rs +16 -23
  67. data/vendor/wreq/src/dns/resolve.rs +7 -41
  68. data/vendor/wreq/src/dns.rs +90 -7
  69. data/vendor/wreq/src/error.rs +57 -31
  70. data/vendor/wreq/src/ext.rs +25 -0
  71. data/vendor/wreq/src/group.rs +211 -0
  72. data/vendor/wreq/src/header.rs +100 -112
  73. data/vendor/wreq/src/lib.rs +124 -73
  74. data/vendor/wreq/src/proxy.rs +6 -20
  75. data/vendor/wreq/src/redirect.rs +1 -1
  76. data/vendor/wreq/src/rt.rs +208 -0
  77. data/vendor/wreq/src/sync.rs +97 -98
  78. data/vendor/wreq/src/tls/compress.rs +124 -0
  79. data/vendor/wreq/src/tls/conn/ext.rs +54 -45
  80. data/vendor/wreq/src/tls/conn/service.rs +14 -18
  81. data/vendor/wreq/src/tls/conn.rs +169 -241
  82. data/vendor/wreq/src/tls/keylog.rs +68 -5
  83. data/vendor/wreq/src/tls/session.rs +205 -0
  84. data/vendor/wreq/src/tls/{x509 → trust}/identity.rs +4 -21
  85. data/vendor/wreq/src/tls/{x509/parser.rs → trust/parse.rs} +1 -1
  86. data/vendor/wreq/src/tls/{x509 → trust}/store.rs +42 -81
  87. data/vendor/wreq/src/tls/{x509.rs → trust.rs} +8 -2
  88. data/vendor/wreq/src/tls.rs +489 -25
  89. data/vendor/wreq/src/trace.rs +0 -12
  90. data/vendor/wreq/src/util.rs +1 -1
  91. data/vendor/wreq/tests/badssl.rs +10 -10
  92. data/vendor/wreq/tests/client.rs +3 -9
  93. data/vendor/wreq/tests/cookie.rs +6 -8
  94. data/vendor/wreq/tests/{emulation.rs → emulate.rs} +130 -22
  95. data/vendor/wreq/tests/multipart.rs +43 -1
  96. data/vendor/wreq/tests/proxy.rs +1 -1
  97. data/vendor/wreq/tests/support/layer.rs +1 -0
  98. metadata +53 -72
  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,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wreq-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yicheng Zhou
8
8
  - Illia Zub
9
9
  autorequire:
10
- bindir: bin
10
+ bindir: exe
11
11
  cert_chain: []
12
- date: 2026-03-02 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
@@ -29,14 +29,17 @@ description: An ergonomic Ruby HTTP client powered by Rust's wreq library, featu
29
29
  TLS fingerprint emulation (JA3/JA4), HTTP/2 support, cookie handling, proxy support,
30
30
  and redirect policies.
31
31
  email:
32
- executables: []
32
+ executables:
33
+ - wreq
33
34
  extensions:
34
35
  - ext/wreq_rb/extconf.rb
35
36
  extra_rdoc_files: []
36
37
  files:
37
38
  - Cargo.lock
38
39
  - Cargo.toml
40
+ - LICENSE
39
41
  - README.md
42
+ - exe/wreq
40
43
  - ext/wreq_rb/Cargo.toml
41
44
  - ext/wreq_rb/extconf.rb
42
45
  - ext/wreq_rb/src/client.rs
@@ -49,82 +52,41 @@ files:
49
52
  - vendor/wreq/Cargo.toml
50
53
  - vendor/wreq/LICENSE
51
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
52
63
  - vendor/wreq/examples/cert_store.rs
53
64
  - vendor/wreq/examples/connect_via_lower_priority_tokio_runtime.rs
54
- - vendor/wreq/examples/emulation.rs
65
+ - vendor/wreq/examples/emulate.rs
55
66
  - vendor/wreq/examples/form.rs
56
67
  - vendor/wreq/examples/http1_websocket.rs
57
68
  - vendor/wreq/examples/http2_websocket.rs
58
69
  - vendor/wreq/examples/json_dynamic.rs
59
70
  - vendor/wreq/examples/json_typed.rs
60
71
  - vendor/wreq/examples/keylog.rs
61
- - vendor/wreq/examples/request_with_emulation.rs
72
+ - vendor/wreq/examples/request_with_emulate.rs
62
73
  - vendor/wreq/examples/request_with_interface.rs
63
74
  - vendor/wreq/examples/request_with_local_address.rs
64
75
  - vendor/wreq/examples/request_with_proxy.rs
65
76
  - vendor/wreq/examples/request_with_redirect.rs
66
77
  - vendor/wreq/examples/request_with_version.rs
78
+ - vendor/wreq/examples/rt.rs
67
79
  - vendor/wreq/examples/tor_socks.rs
68
80
  - vendor/wreq/examples/unix_socket.rs
69
81
  - vendor/wreq/src/client.rs
70
82
  - vendor/wreq/src/client/body.rs
71
- - vendor/wreq/src/client/conn.rs
72
- - vendor/wreq/src/client/conn/conn.rs
73
- - vendor/wreq/src/client/conn/connector.rs
74
- - vendor/wreq/src/client/conn/http.rs
75
- - vendor/wreq/src/client/conn/proxy.rs
76
- - vendor/wreq/src/client/conn/proxy/socks.rs
77
- - vendor/wreq/src/client/conn/proxy/tunnel.rs
78
- - vendor/wreq/src/client/conn/tls_info.rs
79
- - vendor/wreq/src/client/conn/uds.rs
80
- - vendor/wreq/src/client/conn/verbose.rs
81
- - vendor/wreq/src/client/core.rs
82
- - vendor/wreq/src/client/core/body.rs
83
- - vendor/wreq/src/client/core/body/incoming.rs
84
- - vendor/wreq/src/client/core/body/length.rs
85
- - vendor/wreq/src/client/core/common.rs
86
- - vendor/wreq/src/client/core/common/buf.rs
87
- - vendor/wreq/src/client/core/common/rewind.rs
88
- - vendor/wreq/src/client/core/common/watch.rs
89
- - vendor/wreq/src/client/core/conn.rs
90
- - vendor/wreq/src/client/core/conn/http1.rs
91
- - vendor/wreq/src/client/core/conn/http2.rs
92
- - vendor/wreq/src/client/core/dispatch.rs
93
- - vendor/wreq/src/client/core/error.rs
94
- - vendor/wreq/src/client/core/ext.rs
95
- - vendor/wreq/src/client/core/http1.rs
96
- - vendor/wreq/src/client/core/http2.rs
97
- - vendor/wreq/src/client/core/proto.rs
98
- - vendor/wreq/src/client/core/proto/h1.rs
99
- - vendor/wreq/src/client/core/proto/h1/conn.rs
100
- - vendor/wreq/src/client/core/proto/h1/decode.rs
101
- - vendor/wreq/src/client/core/proto/h1/dispatch.rs
102
- - vendor/wreq/src/client/core/proto/h1/encode.rs
103
- - vendor/wreq/src/client/core/proto/h1/io.rs
104
- - vendor/wreq/src/client/core/proto/h1/role.rs
105
- - vendor/wreq/src/client/core/proto/h2.rs
106
- - vendor/wreq/src/client/core/proto/h2/client.rs
107
- - vendor/wreq/src/client/core/proto/h2/ping.rs
108
- - vendor/wreq/src/client/core/proto/headers.rs
109
- - vendor/wreq/src/client/core/rt.rs
110
- - vendor/wreq/src/client/core/rt/bounds.rs
111
- - vendor/wreq/src/client/core/rt/timer.rs
112
- - vendor/wreq/src/client/core/rt/tokio.rs
113
- - vendor/wreq/src/client/core/upgrade.rs
114
- - vendor/wreq/src/client/emulation.rs
115
- - vendor/wreq/src/client/http.rs
116
- - vendor/wreq/src/client/http/client.rs
117
- - vendor/wreq/src/client/http/client/error.rs
118
- - vendor/wreq/src/client/http/client/exec.rs
119
- - vendor/wreq/src/client/http/client/extra.rs
120
- - vendor/wreq/src/client/http/client/lazy.rs
121
- - vendor/wreq/src/client/http/client/pool.rs
122
- - vendor/wreq/src/client/http/client/util.rs
123
- - vendor/wreq/src/client/http/future.rs
83
+ - vendor/wreq/src/client/emulate.rs
84
+ - vendor/wreq/src/client/future.rs
124
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
125
89
  - vendor/wreq/src/client/layer/config.rs
126
- - vendor/wreq/src/client/layer/config/options.rs
127
- - vendor/wreq/src/client/layer/cookie.rs
128
90
  - vendor/wreq/src/client/layer/decoder.rs
129
91
  - vendor/wreq/src/client/layer/redirect.rs
130
92
  - vendor/wreq/src/client/layer/redirect/future.rs
@@ -138,18 +100,38 @@ files:
138
100
  - vendor/wreq/src/client/multipart.rs
139
101
  - vendor/wreq/src/client/request.rs
140
102
  - vendor/wreq/src/client/response.rs
103
+ - vendor/wreq/src/client/upgrade.rs
141
104
  - vendor/wreq/src/client/ws.rs
142
105
  - vendor/wreq/src/client/ws/json.rs
143
106
  - vendor/wreq/src/client/ws/message.rs
144
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
145
125
  - vendor/wreq/src/cookie.rs
146
126
  - vendor/wreq/src/dns.rs
147
127
  - vendor/wreq/src/dns/gai.rs
128
+ - vendor/wreq/src/dns/gai/compio.rs
129
+ - vendor/wreq/src/dns/gai/tokio.rs
148
130
  - vendor/wreq/src/dns/hickory.rs
149
131
  - vendor/wreq/src/dns/resolve.rs
150
132
  - vendor/wreq/src/error.rs
151
133
  - vendor/wreq/src/ext.rs
152
- - vendor/wreq/src/hash.rs
134
+ - vendor/wreq/src/group.rs
153
135
  - vendor/wreq/src/header.rs
154
136
  - vendor/wreq/src/into_uri.rs
155
137
  - vendor/wreq/src/lib.rs
@@ -160,21 +142,20 @@ files:
160
142
  - vendor/wreq/src/proxy/win.rs
161
143
  - vendor/wreq/src/redirect.rs
162
144
  - vendor/wreq/src/retry.rs
145
+ - vendor/wreq/src/rt.rs
163
146
  - vendor/wreq/src/sync.rs
164
147
  - vendor/wreq/src/tls.rs
148
+ - vendor/wreq/src/tls/compress.rs
165
149
  - vendor/wreq/src/tls/conn.rs
166
- - vendor/wreq/src/tls/conn/cache.rs
167
- - vendor/wreq/src/tls/conn/cert_compression.rs
168
150
  - vendor/wreq/src/tls/conn/ext.rs
169
151
  - vendor/wreq/src/tls/conn/macros.rs
170
152
  - vendor/wreq/src/tls/conn/service.rs
171
153
  - vendor/wreq/src/tls/keylog.rs
172
- - vendor/wreq/src/tls/keylog/handle.rs
173
- - vendor/wreq/src/tls/options.rs
174
- - vendor/wreq/src/tls/x509.rs
175
- - vendor/wreq/src/tls/x509/identity.rs
176
- - vendor/wreq/src/tls/x509/parser.rs
177
- - 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
178
159
  - vendor/wreq/src/trace.rs
179
160
  - vendor/wreq/src/util.rs
180
161
  - vendor/wreq/tests/badssl.rs
@@ -183,7 +164,7 @@ files:
183
164
  - vendor/wreq/tests/connector_layers.rs
184
165
  - vendor/wreq/tests/cookie.rs
185
166
  - vendor/wreq/tests/deflate.rs
186
- - vendor/wreq/tests/emulation.rs
167
+ - vendor/wreq/tests/emulate.rs
187
168
  - vendor/wreq/tests/gzip.rs
188
169
  - vendor/wreq/tests/layers.rs
189
170
  - vendor/wreq/tests/multipart.rs
@@ -201,7 +182,7 @@ files:
201
182
  - vendor/wreq/tests/zstd.rs
202
183
  homepage: https://github.com/serpapi/wreq-rb
203
184
  licenses:
204
- - MIT
185
+ - Apache-2.0
205
186
  metadata: {}
206
187
  post_install_message:
207
188
  rdoc_options: []