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,82 +1,91 @@
1
- use boring2::ssl::{SslConnectorBuilder, SslVerifyMode};
1
+ use btls::ssl::{SslConnectorBuilder, SslVerifyMode};
2
2
 
3
3
  use crate::{
4
4
  Error,
5
5
  tls::{
6
- CertificateCompressionAlgorithm,
7
- conn::cert_compression::{
8
- BrotliCertificateCompressor, ZlibCertificateCompressor, ZstdCertificateCompressor,
9
- },
10
- x509::CertStore,
6
+ compress::{self, CertificateCompressor},
7
+ trust::{CertStore, Identity},
11
8
  },
12
9
  };
13
10
 
14
11
  /// SslConnectorBuilderExt trait for `SslConnectorBuilder`.
15
12
  pub trait SslConnectorBuilderExt {
13
+ /// Configure the Identity for the given `SslConnectorBuilder`.
14
+ fn set_identity(self, identity: Option<&Identity>) -> crate::Result<SslConnectorBuilder>;
15
+
16
16
  /// Configure the CertStore for the given `SslConnectorBuilder`.
17
17
  fn set_cert_store(self, store: Option<&CertStore>) -> crate::Result<SslConnectorBuilder>;
18
18
 
19
19
  /// Configure the certificate verification for the given `SslConnectorBuilder`.
20
- fn set_cert_verification(self, enable: bool) -> crate::Result<SslConnectorBuilder>;
20
+ fn set_cert_verification(self, enable: bool) -> SslConnectorBuilder;
21
21
 
22
- /// Configure the certificate compression algorithm for the given `SslConnectorBuilder`.
23
- fn add_certificate_compression_algorithms(
22
+ /// Configure the certificate compressors for the given `SslConnectorBuilder`.
23
+ fn set_cert_compressors(
24
24
  self,
25
- algs: Option<&[CertificateCompressionAlgorithm]>,
25
+ compressors: Option<&[&'static dyn CertificateCompressor]>,
26
26
  ) -> crate::Result<SslConnectorBuilder>;
27
27
  }
28
28
 
29
29
  impl SslConnectorBuilderExt for SslConnectorBuilder {
30
- #[inline]
30
+ fn set_identity(mut self, identity: Option<&Identity>) -> crate::Result<SslConnectorBuilder> {
31
+ if let Some(identity) = identity {
32
+ self.set_certificate(&identity.cert).map_err(Error::tls)?;
33
+ self.set_private_key(&identity.pkey).map_err(Error::tls)?;
34
+ for cert in identity.chain.iter() {
35
+ // https://www.openssl.org/docs/manmaster/man3/SSL_CTX_add_extra_chain_cert.html
36
+ // specifies that "When sending a certificate chain, extra chain certificates are
37
+ // sent in order following the end entity certificate."
38
+ self.add_extra_chain_cert(cert.clone())
39
+ .map_err(Error::tls)?;
40
+ }
41
+ }
42
+ Ok(self)
43
+ }
44
+
31
45
  fn set_cert_store(mut self, store: Option<&CertStore>) -> crate::Result<SslConnectorBuilder> {
32
46
  if let Some(store) = store {
33
- store.add_to_tls(&mut self);
47
+ self.set_cert_store_ref(&store.0)
34
48
  } else {
35
- self.set_default_verify_paths().map_err(Error::tls)?;
49
+ #[cfg(feature = "webpki-roots")]
50
+ {
51
+ static LOAD_CERTS: std::sync::LazyLock<CertStore> =
52
+ std::sync::LazyLock::new(|| {
53
+ CertStore::from_der_certs(webpki_root_certs::TLS_SERVER_ROOT_CERTS)
54
+ .expect("Failed to load webpki root certificates")
55
+ });
56
+
57
+ self.set_cert_store_ref(&LOAD_CERTS.0);
58
+ }
59
+
60
+ #[cfg(not(feature = "webpki-roots"))]
61
+ {
62
+ self.set_default_verify_paths().map_err(Error::tls)?;
63
+ }
36
64
  }
37
65
 
38
66
  Ok(self)
39
67
  }
40
68
 
41
- #[inline]
42
- fn set_cert_verification(mut self, enable: bool) -> crate::Result<SslConnectorBuilder> {
43
- if enable {
44
- self.set_verify(SslVerifyMode::PEER);
69
+ fn set_cert_verification(mut self, enable: bool) -> SslConnectorBuilder {
70
+ self.set_verify(if enable {
71
+ SslVerifyMode::PEER
45
72
  } else {
46
- self.set_verify(SslVerifyMode::NONE);
47
- }
48
- Ok(self)
73
+ SslVerifyMode::NONE
74
+ });
75
+
76
+ self
49
77
  }
50
78
 
51
- #[inline]
52
- fn add_certificate_compression_algorithms(
79
+ fn set_cert_compressors(
53
80
  mut self,
54
- algs: Option<&[CertificateCompressionAlgorithm]>,
81
+ compressors: Option<&[&'static dyn CertificateCompressor]>,
55
82
  ) -> crate::Result<SslConnectorBuilder> {
56
- if let Some(algs) = algs {
57
- for algorithm in algs.iter() {
58
- let res =
59
- match *algorithm {
60
- CertificateCompressionAlgorithm::ZLIB => self
61
- .add_certificate_compression_algorithm(
62
- ZlibCertificateCompressor::default(),
63
- ),
64
- CertificateCompressionAlgorithm::BROTLI => self
65
- .add_certificate_compression_algorithm(
66
- BrotliCertificateCompressor::default(),
67
- ),
68
- CertificateCompressionAlgorithm::ZSTD => self
69
- .add_certificate_compression_algorithm(
70
- ZstdCertificateCompressor::default(),
71
- ),
72
- _ => continue,
73
- };
74
-
75
- if let Err(e) = res {
76
- return Err(Error::tls(e));
77
- }
83
+ if let Some(compressors) = compressors {
84
+ for compressor in compressors {
85
+ compress::register(*compressor, &mut self).map_err(Error::tls)?;
78
86
  }
79
87
  }
88
+
80
89
  Ok(self)
81
90
  }
82
91
  }
@@ -7,22 +7,18 @@ use std::{
7
7
 
8
8
  use http::{Uri, uri::Scheme};
9
9
  use tokio::io::{AsyncRead, AsyncWrite};
10
- use tokio_boring2::SslStream;
11
- use tower::Service;
10
+ use tokio_btls::SslStream;
11
+ use tower::{BoxError, Service};
12
12
 
13
13
  use super::{EstablishedConn, HttpsConnector, MaybeHttpsStream};
14
14
  use crate::{
15
- client::{ConnectRequest, Connection},
16
- error::BoxError,
15
+ conn::{Connection, descriptor::ConnectionDescriptor},
17
16
  ext::UriExt,
18
17
  };
19
18
 
20
19
  type BoxFuture<T, E> = Pin<Box<dyn Future<Output = Result<T, E>> + Send>>;
21
20
 
22
- async fn perform_handshake<T>(
23
- ssl: boring2::ssl::Ssl,
24
- conn: T,
25
- ) -> Result<MaybeHttpsStream<T>, BoxError>
21
+ async fn perform_handshake<T>(ssl: btls::ssl::Ssl, conn: T) -> Result<MaybeHttpsStream<T>, BoxError>
26
22
  where
27
23
  T: AsyncRead + AsyncWrite + Unpin,
28
24
  {
@@ -49,7 +45,7 @@ where
49
45
 
50
46
  fn call(&mut self, uri: Uri) -> Self::Future {
51
47
  let connect = self.http.call(uri.clone());
52
- let inner = self.inner.clone();
48
+ let tls = self.tls.clone();
53
49
 
54
50
  let f = async move {
55
51
  let conn = connect.await.map_err(Into::into)?;
@@ -59,7 +55,7 @@ where
59
55
  return Ok(MaybeHttpsStream::Http(conn));
60
56
  }
61
57
 
62
- let ssl = inner.setup_ssl(uri)?;
58
+ let ssl = tls.setup_ssl(uri)?;
63
59
  perform_handshake(ssl, conn).await
64
60
  };
65
61
 
@@ -67,7 +63,7 @@ where
67
63
  }
68
64
  }
69
65
 
70
- impl<T, S> Service<ConnectRequest> for HttpsConnector<S>
66
+ impl<T, S> Service<ConnectionDescriptor> for HttpsConnector<S>
71
67
  where
72
68
  S: Service<Uri, Response = T> + Send,
73
69
  S::Error: Into<BoxError>,
@@ -83,10 +79,10 @@ where
83
79
  self.http.poll_ready(cx).map_err(Into::into)
84
80
  }
85
81
 
86
- fn call(&mut self, req: ConnectRequest) -> Self::Future {
87
- let uri = req.uri().clone();
82
+ fn call(&mut self, descriptor: ConnectionDescriptor) -> Self::Future {
83
+ let uri = descriptor.uri().clone();
88
84
  let connect = self.http.call(uri.clone());
89
- let inner = self.inner.clone();
85
+ let tls = self.tls.clone();
90
86
 
91
87
  let f = async move {
92
88
  let conn = connect.await.map_err(Into::into)?;
@@ -96,7 +92,7 @@ where
96
92
  return Ok(MaybeHttpsStream::Http(conn));
97
93
  }
98
94
 
99
- let ssl = inner.setup_ssl2(req)?;
95
+ let ssl = tls.setup_ssl2(descriptor)?;
100
96
  perform_handshake(ssl, conn).await
101
97
  };
102
98
 
@@ -122,14 +118,14 @@ where
122
118
  }
123
119
 
124
120
  fn call(&mut self, conn: EstablishedConn<IO>) -> Self::Future {
125
- let inner = self.inner.clone();
121
+ let tls = self.tls.clone();
126
122
  let fut = async move {
127
123
  // Early return if it is not a tls scheme
128
- if conn.req.uri().is_http() {
124
+ if conn.descriptor.uri().is_http() {
129
125
  return Ok(MaybeHttpsStream::Http(conn.io));
130
126
  }
131
127
 
132
- let ssl = inner.setup_ssl2(conn.req)?;
128
+ let ssl = tls.setup_ssl2(conn.descriptor)?;
133
129
  perform_handshake(ssl, conn.io).await
134
130
  };
135
131