wreq-rb 0.3.0

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 (167) hide show
  1. checksums.yaml +7 -0
  2. data/Cargo.lock +2688 -0
  3. data/Cargo.toml +6 -0
  4. data/README.md +179 -0
  5. data/ext/wreq_rb/Cargo.toml +39 -0
  6. data/ext/wreq_rb/extconf.rb +22 -0
  7. data/ext/wreq_rb/src/client.rs +565 -0
  8. data/ext/wreq_rb/src/error.rs +25 -0
  9. data/ext/wreq_rb/src/lib.rs +20 -0
  10. data/ext/wreq_rb/src/response.rs +132 -0
  11. data/lib/wreq-rb/version.rb +5 -0
  12. data/lib/wreq-rb.rb +17 -0
  13. data/patches/0001-add-transfer-size-tracking.patch +292 -0
  14. data/vendor/wreq/Cargo.toml +306 -0
  15. data/vendor/wreq/LICENSE +202 -0
  16. data/vendor/wreq/README.md +122 -0
  17. data/vendor/wreq/examples/cert_store.rs +77 -0
  18. data/vendor/wreq/examples/connect_via_lower_priority_tokio_runtime.rs +258 -0
  19. data/vendor/wreq/examples/emulation.rs +118 -0
  20. data/vendor/wreq/examples/form.rs +14 -0
  21. data/vendor/wreq/examples/http1_websocket.rs +37 -0
  22. data/vendor/wreq/examples/http2_websocket.rs +45 -0
  23. data/vendor/wreq/examples/json_dynamic.rs +41 -0
  24. data/vendor/wreq/examples/json_typed.rs +47 -0
  25. data/vendor/wreq/examples/keylog.rs +16 -0
  26. data/vendor/wreq/examples/request_with_emulation.rs +115 -0
  27. data/vendor/wreq/examples/request_with_interface.rs +37 -0
  28. data/vendor/wreq/examples/request_with_local_address.rs +16 -0
  29. data/vendor/wreq/examples/request_with_proxy.rs +13 -0
  30. data/vendor/wreq/examples/request_with_redirect.rs +22 -0
  31. data/vendor/wreq/examples/request_with_version.rs +15 -0
  32. data/vendor/wreq/examples/tor_socks.rs +24 -0
  33. data/vendor/wreq/examples/unix_socket.rs +33 -0
  34. data/vendor/wreq/src/client/body.rs +304 -0
  35. data/vendor/wreq/src/client/conn/conn.rs +231 -0
  36. data/vendor/wreq/src/client/conn/connector.rs +549 -0
  37. data/vendor/wreq/src/client/conn/http.rs +1023 -0
  38. data/vendor/wreq/src/client/conn/proxy/socks.rs +233 -0
  39. data/vendor/wreq/src/client/conn/proxy/tunnel.rs +260 -0
  40. data/vendor/wreq/src/client/conn/proxy.rs +39 -0
  41. data/vendor/wreq/src/client/conn/tls_info.rs +98 -0
  42. data/vendor/wreq/src/client/conn/uds.rs +44 -0
  43. data/vendor/wreq/src/client/conn/verbose.rs +149 -0
  44. data/vendor/wreq/src/client/conn.rs +323 -0
  45. data/vendor/wreq/src/client/core/body/incoming.rs +485 -0
  46. data/vendor/wreq/src/client/core/body/length.rs +118 -0
  47. data/vendor/wreq/src/client/core/body.rs +34 -0
  48. data/vendor/wreq/src/client/core/common/buf.rs +149 -0
  49. data/vendor/wreq/src/client/core/common/rewind.rs +141 -0
  50. data/vendor/wreq/src/client/core/common/watch.rs +76 -0
  51. data/vendor/wreq/src/client/core/common.rs +3 -0
  52. data/vendor/wreq/src/client/core/conn/http1.rs +342 -0
  53. data/vendor/wreq/src/client/core/conn/http2.rs +307 -0
  54. data/vendor/wreq/src/client/core/conn.rs +11 -0
  55. data/vendor/wreq/src/client/core/dispatch.rs +299 -0
  56. data/vendor/wreq/src/client/core/error.rs +435 -0
  57. data/vendor/wreq/src/client/core/ext.rs +201 -0
  58. data/vendor/wreq/src/client/core/http1.rs +178 -0
  59. data/vendor/wreq/src/client/core/http2.rs +483 -0
  60. data/vendor/wreq/src/client/core/proto/h1/conn.rs +988 -0
  61. data/vendor/wreq/src/client/core/proto/h1/decode.rs +1170 -0
  62. data/vendor/wreq/src/client/core/proto/h1/dispatch.rs +684 -0
  63. data/vendor/wreq/src/client/core/proto/h1/encode.rs +580 -0
  64. data/vendor/wreq/src/client/core/proto/h1/io.rs +879 -0
  65. data/vendor/wreq/src/client/core/proto/h1/role.rs +694 -0
  66. data/vendor/wreq/src/client/core/proto/h1.rs +104 -0
  67. data/vendor/wreq/src/client/core/proto/h2/client.rs +650 -0
  68. data/vendor/wreq/src/client/core/proto/h2/ping.rs +539 -0
  69. data/vendor/wreq/src/client/core/proto/h2.rs +379 -0
  70. data/vendor/wreq/src/client/core/proto/headers.rs +138 -0
  71. data/vendor/wreq/src/client/core/proto.rs +58 -0
  72. data/vendor/wreq/src/client/core/rt/bounds.rs +57 -0
  73. data/vendor/wreq/src/client/core/rt/timer.rs +150 -0
  74. data/vendor/wreq/src/client/core/rt/tokio.rs +99 -0
  75. data/vendor/wreq/src/client/core/rt.rs +25 -0
  76. data/vendor/wreq/src/client/core/upgrade.rs +267 -0
  77. data/vendor/wreq/src/client/core.rs +16 -0
  78. data/vendor/wreq/src/client/emulation.rs +161 -0
  79. data/vendor/wreq/src/client/http/client/error.rs +142 -0
  80. data/vendor/wreq/src/client/http/client/exec.rs +29 -0
  81. data/vendor/wreq/src/client/http/client/extra.rs +77 -0
  82. data/vendor/wreq/src/client/http/client/lazy.rs +79 -0
  83. data/vendor/wreq/src/client/http/client/pool.rs +1105 -0
  84. data/vendor/wreq/src/client/http/client/util.rs +104 -0
  85. data/vendor/wreq/src/client/http/client.rs +1003 -0
  86. data/vendor/wreq/src/client/http/future.rs +99 -0
  87. data/vendor/wreq/src/client/http.rs +1629 -0
  88. data/vendor/wreq/src/client/layer/config/options.rs +156 -0
  89. data/vendor/wreq/src/client/layer/config.rs +116 -0
  90. data/vendor/wreq/src/client/layer/cookie.rs +161 -0
  91. data/vendor/wreq/src/client/layer/decoder.rs +139 -0
  92. data/vendor/wreq/src/client/layer/redirect/future.rs +270 -0
  93. data/vendor/wreq/src/client/layer/redirect/policy.rs +63 -0
  94. data/vendor/wreq/src/client/layer/redirect.rs +145 -0
  95. data/vendor/wreq/src/client/layer/retry/classify.rs +105 -0
  96. data/vendor/wreq/src/client/layer/retry/scope.rs +51 -0
  97. data/vendor/wreq/src/client/layer/retry.rs +151 -0
  98. data/vendor/wreq/src/client/layer/timeout/body.rs +233 -0
  99. data/vendor/wreq/src/client/layer/timeout/future.rs +90 -0
  100. data/vendor/wreq/src/client/layer/timeout.rs +177 -0
  101. data/vendor/wreq/src/client/layer.rs +15 -0
  102. data/vendor/wreq/src/client/multipart.rs +717 -0
  103. data/vendor/wreq/src/client/request.rs +818 -0
  104. data/vendor/wreq/src/client/response.rs +534 -0
  105. data/vendor/wreq/src/client/ws/json.rs +99 -0
  106. data/vendor/wreq/src/client/ws/message.rs +453 -0
  107. data/vendor/wreq/src/client/ws.rs +714 -0
  108. data/vendor/wreq/src/client.rs +27 -0
  109. data/vendor/wreq/src/config.rs +140 -0
  110. data/vendor/wreq/src/cookie.rs +579 -0
  111. data/vendor/wreq/src/dns/gai.rs +249 -0
  112. data/vendor/wreq/src/dns/hickory.rs +78 -0
  113. data/vendor/wreq/src/dns/resolve.rs +180 -0
  114. data/vendor/wreq/src/dns.rs +69 -0
  115. data/vendor/wreq/src/error.rs +502 -0
  116. data/vendor/wreq/src/ext.rs +398 -0
  117. data/vendor/wreq/src/hash.rs +143 -0
  118. data/vendor/wreq/src/header.rs +506 -0
  119. data/vendor/wreq/src/into_uri.rs +187 -0
  120. data/vendor/wreq/src/lib.rs +586 -0
  121. data/vendor/wreq/src/proxy/mac.rs +82 -0
  122. data/vendor/wreq/src/proxy/matcher.rs +806 -0
  123. data/vendor/wreq/src/proxy/uds.rs +66 -0
  124. data/vendor/wreq/src/proxy/win.rs +31 -0
  125. data/vendor/wreq/src/proxy.rs +569 -0
  126. data/vendor/wreq/src/redirect.rs +575 -0
  127. data/vendor/wreq/src/retry.rs +198 -0
  128. data/vendor/wreq/src/sync.rs +129 -0
  129. data/vendor/wreq/src/tls/conn/cache.rs +123 -0
  130. data/vendor/wreq/src/tls/conn/cert_compression.rs +125 -0
  131. data/vendor/wreq/src/tls/conn/ext.rs +82 -0
  132. data/vendor/wreq/src/tls/conn/macros.rs +34 -0
  133. data/vendor/wreq/src/tls/conn/service.rs +138 -0
  134. data/vendor/wreq/src/tls/conn.rs +681 -0
  135. data/vendor/wreq/src/tls/keylog/handle.rs +64 -0
  136. data/vendor/wreq/src/tls/keylog.rs +99 -0
  137. data/vendor/wreq/src/tls/options.rs +464 -0
  138. data/vendor/wreq/src/tls/x509/identity.rs +122 -0
  139. data/vendor/wreq/src/tls/x509/parser.rs +71 -0
  140. data/vendor/wreq/src/tls/x509/store.rs +228 -0
  141. data/vendor/wreq/src/tls/x509.rs +68 -0
  142. data/vendor/wreq/src/tls.rs +154 -0
  143. data/vendor/wreq/src/trace.rs +55 -0
  144. data/vendor/wreq/src/util.rs +122 -0
  145. data/vendor/wreq/tests/badssl.rs +228 -0
  146. data/vendor/wreq/tests/brotli.rs +350 -0
  147. data/vendor/wreq/tests/client.rs +1098 -0
  148. data/vendor/wreq/tests/connector_layers.rs +227 -0
  149. data/vendor/wreq/tests/cookie.rs +306 -0
  150. data/vendor/wreq/tests/deflate.rs +347 -0
  151. data/vendor/wreq/tests/emulation.rs +260 -0
  152. data/vendor/wreq/tests/gzip.rs +347 -0
  153. data/vendor/wreq/tests/layers.rs +261 -0
  154. data/vendor/wreq/tests/multipart.rs +165 -0
  155. data/vendor/wreq/tests/proxy.rs +438 -0
  156. data/vendor/wreq/tests/redirect.rs +629 -0
  157. data/vendor/wreq/tests/retry.rs +135 -0
  158. data/vendor/wreq/tests/support/delay_server.rs +117 -0
  159. data/vendor/wreq/tests/support/error.rs +16 -0
  160. data/vendor/wreq/tests/support/layer.rs +183 -0
  161. data/vendor/wreq/tests/support/mod.rs +9 -0
  162. data/vendor/wreq/tests/support/server.rs +232 -0
  163. data/vendor/wreq/tests/timeouts.rs +281 -0
  164. data/vendor/wreq/tests/unix_socket.rs +135 -0
  165. data/vendor/wreq/tests/upgrade.rs +98 -0
  166. data/vendor/wreq/tests/zstd.rs +559 -0
  167. metadata +225 -0
@@ -0,0 +1,231 @@
1
+ use std::{
2
+ io::{self, IoSlice},
3
+ pin::Pin,
4
+ task::{Context, Poll},
5
+ };
6
+
7
+ use pin_project_lite::pin_project;
8
+ #[cfg(unix)]
9
+ use tokio::net::UnixStream;
10
+ use tokio::{
11
+ io::{AsyncRead, AsyncWrite, ReadBuf},
12
+ net::TcpStream,
13
+ };
14
+ use tokio_boring2::SslStream;
15
+
16
+ use super::{AsyncConnWithInfo, Connected, Connection, TlsInfoFactory};
17
+ use crate::{
18
+ proxy::matcher::Intercept,
19
+ tls::{TlsInfo, conn::MaybeHttpsStream},
20
+ };
21
+
22
+ pin_project! {
23
+ /// Note: the `is_proxy` member means *is plain text HTTP proxy*.
24
+ /// This tells core whether the URI should be written in
25
+ /// * origin-form (`GET /just/a/path HTTP/1.1`), when `is_proxy == false`, or
26
+ /// * absolute-form (`GET http://foo.bar/and/a/path HTTP/1.1`), otherwise.
27
+ pub struct Conn {
28
+ #[pin]
29
+ pub(super) inner: Box<dyn AsyncConnWithInfo>,
30
+ pub(super) tls_info: bool,
31
+ pub(super) proxy: Option<Intercept>,
32
+ }
33
+ }
34
+
35
+ pin_project! {
36
+ /// A wrapper around `SslStream` that adapts it for use as a generic async connection.
37
+ ///
38
+ /// This type enables unified handling of plain TCP and TLS-encrypted streams by providing
39
+ /// implementations of `Connection`, `Read`, `Write`, and `TlsInfoFactory`.
40
+ /// It is mainly used internally to abstract over different connection types.
41
+ pub struct TlsConn<T> {
42
+ #[pin]
43
+ inner: SslStream<T>,
44
+ }
45
+ }
46
+
47
+ // ==== impl Conn ====
48
+
49
+ impl Connection for Conn {
50
+ fn connected(&self) -> Connected {
51
+ let mut connected = self.inner.connected();
52
+
53
+ if let Some(proxy) = &self.proxy {
54
+ connected = connected.proxy(proxy.clone());
55
+ }
56
+
57
+ if self.tls_info {
58
+ if let Some(tls_info) = self.inner.tls_info() {
59
+ connected.extra(tls_info)
60
+ } else {
61
+ connected
62
+ }
63
+ } else {
64
+ connected
65
+ }
66
+ }
67
+ }
68
+
69
+ impl AsyncRead for Conn {
70
+ #[inline]
71
+ fn poll_read(
72
+ self: Pin<&mut Self>,
73
+ cx: &mut Context,
74
+ buf: &mut ReadBuf<'_>,
75
+ ) -> Poll<io::Result<()>> {
76
+ AsyncRead::poll_read(self.project().inner, cx, buf)
77
+ }
78
+ }
79
+
80
+ impl AsyncWrite for Conn {
81
+ #[inline]
82
+ fn poll_write(
83
+ self: Pin<&mut Self>,
84
+ cx: &mut Context,
85
+ buf: &[u8],
86
+ ) -> Poll<Result<usize, io::Error>> {
87
+ AsyncWrite::poll_write(self.project().inner, cx, buf)
88
+ }
89
+
90
+ #[inline]
91
+ fn poll_write_vectored(
92
+ self: Pin<&mut Self>,
93
+ cx: &mut Context<'_>,
94
+ bufs: &[IoSlice<'_>],
95
+ ) -> Poll<Result<usize, io::Error>> {
96
+ AsyncWrite::poll_write_vectored(self.project().inner, cx, bufs)
97
+ }
98
+
99
+ #[inline]
100
+ fn is_write_vectored(&self) -> bool {
101
+ self.inner.is_write_vectored()
102
+ }
103
+
104
+ #[inline]
105
+ fn poll_flush(self: Pin<&mut Self>, cx: &mut Context) -> Poll<Result<(), io::Error>> {
106
+ AsyncWrite::poll_flush(self.project().inner, cx)
107
+ }
108
+
109
+ #[inline]
110
+ fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context) -> Poll<Result<(), io::Error>> {
111
+ AsyncWrite::poll_shutdown(self.project().inner, cx)
112
+ }
113
+ }
114
+
115
+ // ==== impl TlsConn ====
116
+
117
+ impl<T> TlsConn<T>
118
+ where
119
+ T: AsyncRead + AsyncWrite + Unpin,
120
+ {
121
+ /// Creates a new `TlsConn` wrapping the provided `SslStream`.
122
+ #[inline(always)]
123
+ pub fn new(inner: SslStream<T>) -> Self {
124
+ Self { inner }
125
+ }
126
+ }
127
+
128
+ // ===== impl TcpStream =====
129
+
130
+ impl Connection for TlsConn<TcpStream> {
131
+ fn connected(&self) -> Connected {
132
+ let connected = self.inner.get_ref().connected();
133
+ if self.inner.ssl().selected_alpn_protocol() == Some(b"h2") {
134
+ connected.negotiated_h2()
135
+ } else {
136
+ connected
137
+ }
138
+ }
139
+ }
140
+
141
+ impl Connection for TlsConn<MaybeHttpsStream<TcpStream>> {
142
+ fn connected(&self) -> Connected {
143
+ let connected = self.inner.get_ref().connected();
144
+ if self.inner.ssl().selected_alpn_protocol() == Some(b"h2") {
145
+ connected.negotiated_h2()
146
+ } else {
147
+ connected
148
+ }
149
+ }
150
+ }
151
+
152
+ // ===== impl UnixStream =====
153
+
154
+ #[cfg(unix)]
155
+ impl Connection for TlsConn<UnixStream> {
156
+ fn connected(&self) -> Connected {
157
+ let connected = self.inner.get_ref().connected();
158
+ if self.inner.ssl().selected_alpn_protocol() == Some(b"h2") {
159
+ connected.negotiated_h2()
160
+ } else {
161
+ connected
162
+ }
163
+ }
164
+ }
165
+
166
+ #[cfg(unix)]
167
+ impl Connection for TlsConn<MaybeHttpsStream<UnixStream>> {
168
+ fn connected(&self) -> Connected {
169
+ let connected = self.inner.get_ref().connected();
170
+ if self.inner.ssl().selected_alpn_protocol() == Some(b"h2") {
171
+ connected.negotiated_h2()
172
+ } else {
173
+ connected
174
+ }
175
+ }
176
+ }
177
+
178
+ impl<T: AsyncRead + AsyncWrite + Unpin> AsyncRead for TlsConn<T> {
179
+ #[inline]
180
+ fn poll_read(
181
+ self: Pin<&mut Self>,
182
+ cx: &mut Context,
183
+ buf: &mut ReadBuf<'_>,
184
+ ) -> Poll<tokio::io::Result<()>> {
185
+ AsyncRead::poll_read(self.project().inner, cx, buf)
186
+ }
187
+ }
188
+
189
+ impl<T: AsyncRead + AsyncWrite + Unpin> AsyncWrite for TlsConn<T> {
190
+ #[inline]
191
+ fn poll_write(
192
+ self: Pin<&mut Self>,
193
+ cx: &mut Context,
194
+ buf: &[u8],
195
+ ) -> Poll<Result<usize, tokio::io::Error>> {
196
+ AsyncWrite::poll_write(self.project().inner, cx, buf)
197
+ }
198
+
199
+ #[inline]
200
+ fn poll_write_vectored(
201
+ self: Pin<&mut Self>,
202
+ cx: &mut Context<'_>,
203
+ bufs: &[IoSlice<'_>],
204
+ ) -> Poll<Result<usize, io::Error>> {
205
+ AsyncWrite::poll_write_vectored(self.project().inner, cx, bufs)
206
+ }
207
+
208
+ #[inline]
209
+ fn is_write_vectored(&self) -> bool {
210
+ self.inner.is_write_vectored()
211
+ }
212
+
213
+ #[inline]
214
+ fn poll_flush(self: Pin<&mut Self>, cx: &mut Context) -> Poll<Result<(), tokio::io::Error>> {
215
+ AsyncWrite::poll_flush(self.project().inner, cx)
216
+ }
217
+
218
+ #[inline]
219
+ fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context) -> Poll<Result<(), tokio::io::Error>> {
220
+ AsyncWrite::poll_shutdown(self.project().inner, cx)
221
+ }
222
+ }
223
+
224
+ impl<T> TlsInfoFactory for TlsConn<T>
225
+ where
226
+ SslStream<T>: TlsInfoFactory,
227
+ {
228
+ fn tls_info(&self) -> Option<TlsInfo> {
229
+ self.inner.tls_info()
230
+ }
231
+ }