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
@@ -13,6 +13,7 @@ use std::{
13
13
  task::{Context, Poll, ready},
14
14
  };
15
15
 
16
+ use bytes::Bytes;
16
17
  use futures_util::{Sink, SinkExt, Stream, StreamExt, stream::FusedStream};
17
18
  use http::{
18
19
  HeaderMap, HeaderName, HeaderValue, Method, StatusCode, Uri, Version, header, uri::Scheme,
@@ -25,10 +26,8 @@ use tokio_tungstenite::tungstenite::{
25
26
  };
26
27
 
27
28
  use self::message::{CloseCode, Message, Utf8Bytes};
28
- use crate::{
29
- EmulationFactory, Error, RequestBuilder, Response, Upgraded, header::OrigHeaderMap,
30
- proxy::Proxy,
31
- };
29
+ use super::{emulate::IntoEmulation, request::RequestBuilder, response::Response};
30
+ use crate::{Error, Upgraded, header::OrigHeaderMap, proxy::Proxy};
32
31
 
33
32
  /// A WebSocket stream.
34
33
  type WebSocketStream = tokio_tungstenite::WebSocketStream<Upgraded>;
@@ -73,20 +72,27 @@ impl WebSocketRequestBuilder {
73
72
  self
74
73
  }
75
74
 
76
- /// Forces the WebSocket connection to use HTTP/2 protocol.
75
+ /// Set HTTP version
76
+ ///
77
+ /// Configures the HTTP version used for the WebSocket handshake.
78
+ /// Defaults to HTTP/1.1.
79
+ ///
80
+ /// # HTTP/1.1 (default)
77
81
  ///
78
- /// This method configures the WebSocket connection to use HTTP/2's Extended
79
- /// CONNECT Protocol (RFC 8441) for the handshake instead of the traditional
80
- /// HTTP/1.1 upgrade mechanism.
82
+ /// - Uses the standard `Upgrade: websocket` mechanism (RFC 6455)
83
+ /// - Sends an HTTP `GET` request with `Connection: Upgrade` and `Upgrade: websocket` headers
84
+ /// - Widely supported by servers
81
85
  ///
82
- /// # Behavior
86
+ /// # HTTP/2
83
87
  ///
84
- /// - Uses `CONNECT` method with `:protocol: websocket` pseudo-header
85
- /// - Requires server support for HTTP/2 WebSocket connections
86
- /// - Will fail if server doesn't support HTTP/2 WebSocket upgrade
88
+ /// - Uses the Extended CONNECT Protocol (RFC 8441)
89
+ /// - Sends a `CONNECT` request with the `:protocol: websocket` pseudo-header instead of the
90
+ /// traditional upgrade mechanism
91
+ /// - Requires explicit server support for HTTP/2 WebSocket connections
92
+ /// - Will fail if the server does not support HTTP/2 WebSocket upgrade
87
93
  #[inline]
88
- pub fn force_http2(mut self) -> Self {
89
- self.inner = self.inner.version(Version::HTTP_2);
94
+ pub fn version(mut self, version: Version) -> Self {
95
+ self.inner = self.inner.version(version);
90
96
  self
91
97
  }
92
98
 
@@ -315,8 +321,38 @@ impl WebSocketRequestBuilder {
315
321
  self
316
322
  }
317
323
 
318
- /// Set the interface for this request.
319
- #[inline]
324
+ /// Bind connections only on the specified network interface.
325
+ ///
326
+ /// This option is only available on the following operating systems:
327
+ ///
328
+ /// - Android
329
+ /// - Fuchsia
330
+ /// - Linux,
331
+ /// - macOS and macOS-like systems (iOS, tvOS, watchOS and visionOS)
332
+ /// - Solaris and illumos
333
+ ///
334
+ /// On Android, Linux, and Fuchsia, this uses the
335
+ /// [`SO_BINDTODEVICE`][man-7-socket] socket option. On macOS and macOS-like
336
+ /// systems, Solaris, and illumos, this instead uses the [`IP_BOUND_IF` and
337
+ /// `IPV6_BOUND_IF`][man-7p-ip] socket options (as appropriate).
338
+ ///
339
+ /// Note that connections will fail if the provided interface name is not a
340
+ /// network interface that currently exists when a connection is established.
341
+ ///
342
+ /// # Example
343
+ ///
344
+ /// ```
345
+ /// # fn doc() -> Result<(), wreq::Error> {
346
+ /// let interface = "lo";
347
+ /// let client = wreq::Client::builder()
348
+ /// .interface(interface)
349
+ /// .build()?;
350
+ /// # Ok(())
351
+ /// # }
352
+ /// ```
353
+ ///
354
+ /// [man-7-socket]: https://man7.org/linux/man-pages/man7/socket.7.html
355
+ /// [man-7p-ip]: https://docs.oracle.com/cd/E86824_01/html/E54777/ip-7p.html
320
356
  #[cfg(any(
321
357
  target_os = "android",
322
358
  target_os = "fuchsia",
@@ -352,13 +388,19 @@ impl WebSocketRequestBuilder {
352
388
  self
353
389
  }
354
390
 
355
- /// Set the emulation for this request.
391
+ /// Sets the request builder to emulation the specified HTTP context.
392
+ ///
393
+ /// This method sets the necessary headers, HTTP/1 and HTTP/2 options configurations, and TLS
394
+ /// options config to use the specified HTTP context. It allows the client to mimic the
395
+ /// behavior of different versions or setups, which can be useful for testing or ensuring
396
+ /// compatibility with various environments.
397
+ ///
398
+ /// # Note
399
+ /// This will overwrite the existing configuration.
400
+ /// You must set emulation before you can perform subsequent HTTP1/HTTP2/TLS fine-tuning.
356
401
  #[inline]
357
- pub fn emulation<P>(mut self, factory: P) -> Self
358
- where
359
- P: EmulationFactory,
360
- {
361
- self.inner = self.inner.emulation(factory);
402
+ pub fn emulation<T: IntoEmulation>(mut self, emulation: T) -> Self {
403
+ self.inner = self.inner.emulation(emulation);
362
404
  self
363
405
  }
364
406
 
@@ -436,7 +478,8 @@ impl WebSocketRequestBuilder {
436
478
 
437
479
  request.headers_mut().insert(
438
480
  header::SEC_WEBSOCKET_PROTOCOL,
439
- subprotocols.parse().map_err(Error::builder)?,
481
+ HeaderValue::from_maybe_shared(Bytes::from(subprotocols))
482
+ .map_err(Error::builder)?,
440
483
  );
441
484
  }
442
485
  }
@@ -561,9 +604,8 @@ impl WebSocketResponse {
561
604
  (None, None) => {}
562
605
  };
563
606
 
564
- let upgraded = self.inner.upgrade().await?;
565
607
  let inner = WebSocketStream::from_raw_socket(
566
- upgraded,
608
+ self.inner.upgrade().await?,
567
609
  protocol::Role::Client,
568
610
  Some(self.config),
569
611
  )
@@ -634,6 +676,12 @@ impl WebSocket {
634
676
  .map_err(Error::websocket)
635
677
  }
636
678
 
679
+ /// Consumes the [`WebSocket`] and returns the underlying stream.
680
+ #[inline]
681
+ pub fn into_inner(self) -> Upgraded {
682
+ self.inner.into_inner()
683
+ }
684
+
637
685
  /// Closes the connection with a given code and (optional) reason.
638
686
  pub async fn close<C, R>(mut self, code: C, reason: R) -> Result<(), Error>
639
687
  where