wreq 1.2.4 → 1.2.5

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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +3 -7
  3. data/Cargo.toml +6 -1
  4. data/crates/wreq-util/.github/FUNDING.yml +15 -0
  5. data/crates/wreq-util/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  6. data/crates/wreq-util/.github/ISSUE_TEMPLATE/custom.md +10 -0
  7. data/crates/wreq-util/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  8. data/crates/wreq-util/.github/dependabot.yml +22 -0
  9. data/crates/wreq-util/.github/workflows/ci.yml +82 -0
  10. data/crates/wreq-util/.github/workflows/release-plz.yml +52 -0
  11. data/crates/wreq-util/.gitignore +24 -0
  12. data/crates/wreq-util/CHANGELOG.md +74 -0
  13. data/crates/wreq-util/Cargo.toml +94 -0
  14. data/crates/wreq-util/LICENSE +201 -0
  15. data/crates/wreq-util/README.md +62 -0
  16. data/crates/wreq-util/examples/emulate.rs +39 -0
  17. data/crates/wreq-util/examples/tower_delay.rs +191 -0
  18. data/crates/wreq-util/release-plz.toml +2 -0
  19. data/crates/wreq-util/rustfmt.toml +5 -0
  20. data/crates/wreq-util/src/emulate/compress.rs +85 -0
  21. data/crates/wreq-util/src/emulate/macros.rs +370 -0
  22. data/crates/wreq-util/src/emulate/profile/chrome/header.rs +59 -0
  23. data/crates/wreq-util/src/emulate/profile/chrome/http2.rs +65 -0
  24. data/crates/wreq-util/src/emulate/profile/chrome/tls.rs +153 -0
  25. data/crates/wreq-util/src/emulate/profile/chrome.rs +2028 -0
  26. data/crates/wreq-util/src/emulate/profile/firefox/header.rs +21 -0
  27. data/crates/wreq-util/src/emulate/profile/firefox/http2.rs +113 -0
  28. data/crates/wreq-util/src/emulate/profile/firefox/tls.rs +253 -0
  29. data/crates/wreq-util/src/emulate/profile/firefox.rs +518 -0
  30. data/crates/wreq-util/src/emulate/profile/okhttp.rs +241 -0
  31. data/crates/wreq-util/src/emulate/profile/opera/header.rs +30 -0
  32. data/crates/wreq-util/src/emulate/profile/opera/http2.rs +50 -0
  33. data/crates/wreq-util/src/emulate/profile/opera/tls.rs +97 -0
  34. data/crates/wreq-util/src/emulate/profile/opera.rs +299 -0
  35. data/crates/wreq-util/src/emulate/profile/safari/header.rs +59 -0
  36. data/crates/wreq-util/src/emulate/profile/safari/http2.rs +116 -0
  37. data/crates/wreq-util/src/emulate/profile/safari/tls.rs +177 -0
  38. data/crates/wreq-util/src/emulate/profile/safari.rs +222 -0
  39. data/crates/wreq-util/src/emulate/profile.rs +47 -0
  40. data/crates/wreq-util/src/emulate.rs +369 -0
  41. data/crates/wreq-util/src/lib.rs +14 -0
  42. data/crates/wreq-util/src/rand.rs +24 -0
  43. data/crates/wreq-util/src/tower/delay/future.rs +43 -0
  44. data/crates/wreq-util/src/tower/delay/layer.rs +201 -0
  45. data/crates/wreq-util/src/tower/delay/service.rs +190 -0
  46. data/crates/wreq-util/src/tower/delay.rs +98 -0
  47. data/crates/wreq-util/src/tower.rs +7 -0
  48. data/crates/wreq-util/tests/client.rs +51 -0
  49. data/crates/wreq-util/tests/emulate_chrome.rs +270 -0
  50. data/crates/wreq-util/tests/emulate_firefox.rs +92 -0
  51. data/crates/wreq-util/tests/emulate_okhttp.rs +46 -0
  52. data/crates/wreq-util/tests/emulate_opera.rs +113 -0
  53. data/crates/wreq-util/tests/emulate_safari.rs +151 -0
  54. data/crates/wreq-util/tests/support/mod.rs +55 -0
  55. data/crates/wreq-util/tests/support/server.rs +232 -0
  56. data/examples/emulate_request.rb +1 -1
  57. data/lib/wreq.rb +20 -18
  58. data/lib/wreq_ruby/body.rb +3 -0
  59. data/lib/wreq_ruby/client.rb +18 -18
  60. data/lib/wreq_ruby/cookie.rb +2 -2
  61. data/lib/wreq_ruby/emulate.rb +3 -1
  62. data/lib/wreq_ruby/header.rb +205 -114
  63. data/lib/wreq_ruby/response.rb +28 -3
  64. data/src/emulate.rs +1 -0
  65. data/src/error.rs +2 -6
  66. data/src/header/helper.rs +112 -0
  67. data/src/header.rs +198 -133
  68. data/test/header_test.rb +228 -192
  69. data/test/stream_test.rb +36 -0
  70. metadata +54 -1
@@ -0,0 +1,299 @@
1
+ #[macro_use]
2
+ mod http2;
3
+ #[macro_use]
4
+ mod tls;
5
+ mod header;
6
+
7
+ use header::*;
8
+ use tls::*;
9
+
10
+ use super::*;
11
+
12
+ mod_generator!(
13
+ opera116,
14
+ tls_options!(CURVES),
15
+ http2_options!(),
16
+ header_initializer_with_zstd_priority,
17
+ [
18
+ (
19
+ MacOS,
20
+ r#""Opera";v="116", "Chromium";v="131", "Not_A Brand";v="24""#,
21
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 OPR/116.0.0.0"
22
+ ),
23
+ (
24
+ Windows,
25
+ r#""Opera";v="116", "Chromium";v="131", "Not_A Brand";v="24""#,
26
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 OPR/116.0.0.0"
27
+ )
28
+ ]
29
+ );
30
+
31
+ mod_generator!(
32
+ opera117,
33
+ opera116::build_emulation,
34
+ header_initializer_with_zstd_priority,
35
+ [
36
+ (
37
+ MacOS,
38
+ r#""Not A(Brand";v="8", "Chromium";v="132", "Opera";v="117""#,
39
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 OPR/117.0.0.0"
40
+ ),
41
+ (
42
+ Windows,
43
+ r#""Not A(Brand";v="8", "Chromium";v="132", "Opera";v="117""#,
44
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 OPR/117.0.0.0"
45
+ )
46
+ ]
47
+ );
48
+
49
+ mod_generator!(
50
+ opera118,
51
+ opera116::build_emulation,
52
+ header_initializer_with_zstd_priority,
53
+ [
54
+ (
55
+ MacOS,
56
+ r#""Not(A:Brand";v="99", "Opera";v="118", "Chromium";v="133""#,
57
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 OPR/118.0.0.0"
58
+ ),
59
+ (
60
+ Windows,
61
+ r#""Not(A:Brand";v="99", "Opera";v="118", "Chromium";v="133""#,
62
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 OPR/118.0.0.0"
63
+ )
64
+ ]
65
+ );
66
+
67
+ mod_generator!(
68
+ opera119,
69
+ opera116::build_emulation,
70
+ header_initializer_with_zstd_priority,
71
+ [
72
+ (
73
+ MacOS,
74
+ r#""Chromium";v="134", "Not:A-Brand";v="24", "Opera";v="119""#,
75
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 OPR/119.0.0.0"
76
+ ),
77
+ (
78
+ Windows,
79
+ r#""Chromium";v="134", "Not:A-Brand";v="24", "Opera";v="119""#,
80
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 OPR/119.0.0.0"
81
+ )
82
+ ]
83
+ );
84
+
85
+ mod_generator!(
86
+ opera120,
87
+ opera116::build_emulation,
88
+ header_initializer_with_zstd_priority,
89
+ [
90
+ (
91
+ MacOS,
92
+ r#""Chromium";v="135", "Not:A-Brand";v="24", "Opera";v="120""#,
93
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 OPR/120.0.0.0"
94
+ ),
95
+ (
96
+ Windows,
97
+ r#""Chromium";v="135", "Not:A-Brand";v="24", "Opera";v="120""#,
98
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 OPR/120.0.0.0"
99
+ )
100
+ ]
101
+ );
102
+
103
+ mod_generator!(
104
+ opera121,
105
+ opera116::build_emulation,
106
+ header_initializer_with_zstd_priority,
107
+ [
108
+ (
109
+ MacOS,
110
+ r#""Opera";v="121", "Chromium";v="137", "Not/A)Brand";v="24""#,
111
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 OPR/121.0.0.0"
112
+ ),
113
+ (
114
+ Windows,
115
+ r#""Opera";v="121", "Chromium";v="137", "Not/A)Brand";v="24""#,
116
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 OPR/121.0.0.0"
117
+ )
118
+ ]
119
+ );
120
+
121
+ mod_generator!(
122
+ opera122,
123
+ opera116::build_emulation,
124
+ header_initializer_with_zstd_priority,
125
+ [
126
+ (
127
+ MacOS,
128
+ r#""Chromium";v="138", "Not=A?Brand";v="24", "Opera";v="122""#,
129
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 OPR/122.0.0.0"
130
+ ),
131
+ (
132
+ Windows,
133
+ r#""Chromium";v="138", "Not=A?Brand";v="24", "Opera";v="122""#,
134
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 OPR/122.0.0.0"
135
+ )
136
+ ]
137
+ );
138
+
139
+ mod_generator!(
140
+ opera123,
141
+ opera116::build_emulation,
142
+ header_initializer_with_zstd_priority,
143
+ [
144
+ (
145
+ MacOS,
146
+ r#""Chromium";v="139", "Not=A?Brand";v="24", "Opera";v="123""#,
147
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 OPR/123.0.0.0"
148
+ ),
149
+ (
150
+ Windows,
151
+ r#""Chromium";v="139", "Not=A?Brand";v="24", "Opera";v="123""#,
152
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 OPR/123.0.0.0"
153
+ )
154
+ ]
155
+ );
156
+
157
+ mod_generator!(
158
+ opera124,
159
+ opera116::build_emulation,
160
+ header_initializer_with_zstd_priority,
161
+ [
162
+ (
163
+ MacOS,
164
+ r#""Chromium";v="140", "Not=A?Brand";v="24", "Opera";v="124""#,
165
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 OPR/124.0.0.0"
166
+ ),
167
+ (
168
+ Windows,
169
+ r#""Chromium";v="140", "Not=A?Brand";v="24", "Opera";v="124""#,
170
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 OPR/124.0.0.0"
171
+ )
172
+ ]
173
+ );
174
+
175
+ mod_generator!(
176
+ opera125,
177
+ opera116::build_emulation,
178
+ header_initializer_with_zstd_priority,
179
+ [
180
+ (
181
+ MacOS,
182
+ r#""Opera";v="125", "Not?A_Brand";v="8", "Chromium";v="141""#,
183
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 OPR/125.0.0.0"
184
+ ),
185
+ (
186
+ Windows,
187
+ r#""Opera";v="125", "Not?A_Brand";v="8", "Chromium";v="141""#,
188
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 OPR/125.0.0.0"
189
+ )
190
+ ]
191
+ );
192
+
193
+ mod_generator!(
194
+ opera126,
195
+ opera116::build_emulation,
196
+ header_initializer_with_zstd_priority,
197
+ [
198
+ (
199
+ MacOS,
200
+ r#""Not:A-Brand";v="99", "Opera";v="126", "Chromium";v="142""#,
201
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 OPR/126.0.0.0"
202
+ ),
203
+ (
204
+ Windows,
205
+ r#""Not:A-Brand";v="99", "Opera";v="126", "Chromium";v="142""#,
206
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 OPR/126.0.0.0"
207
+ )
208
+ ]
209
+ );
210
+
211
+ mod_generator!(
212
+ opera127,
213
+ opera116::build_emulation,
214
+ header_initializer_with_zstd_priority,
215
+ [
216
+ (
217
+ MacOS,
218
+ r#""Not:A-Brand";v="99", "Opera";v="127", "Chromium";v="143""#,
219
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 OPR/127.0.0.0"
220
+ ),
221
+ (
222
+ Windows,
223
+ r#""Not:A-Brand";v="99", "Opera";v="127", "Chromium";v="143""#,
224
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 OPR/127.0.0.0"
225
+ )
226
+ ]
227
+ );
228
+
229
+ mod_generator!(
230
+ opera128,
231
+ opera116::build_emulation,
232
+ header_initializer_with_zstd_priority,
233
+ [
234
+ (
235
+ MacOS,
236
+ r#""Not:A-Brand";v="99", "Opera";v="128", "Chromium";v="144""#,
237
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36 OPR/128.0.0.0"
238
+ ),
239
+ (
240
+ Windows,
241
+ r#""Not:A-Brand";v="99", "Opera";v="128", "Chromium";v="144""#,
242
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36 OPR/128.0.0.0"
243
+ )
244
+ ]
245
+ );
246
+
247
+ mod_generator!(
248
+ opera129,
249
+ opera116::build_emulation,
250
+ header_initializer_with_zstd_priority,
251
+ [
252
+ (
253
+ MacOS,
254
+ r#""Not:A-Brand";v="99", "Opera";v="129", "Chromium";v="145""#,
255
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36 OPR/129.0.0.0"
256
+ ),
257
+ (
258
+ Windows,
259
+ r#""Not:A-Brand";v="99", "Opera";v="129", "Chromium";v="145""#,
260
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36 OPR/129.0.0.0"
261
+ )
262
+ ]
263
+ );
264
+
265
+ mod_generator!(
266
+ opera130,
267
+ opera116::build_emulation,
268
+ header_initializer_with_zstd_priority,
269
+ [
270
+ (
271
+ MacOS,
272
+ r#""Not:A-Brand";v="99", "Opera";v="130", "Chromium";v="146""#,
273
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36 OPR/130.0.0.0"
274
+ ),
275
+ (
276
+ Windows,
277
+ r#""Not:A-Brand";v="99", "Opera";v="130", "Chromium";v="146""#,
278
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36 OPR/130.0.0.0"
279
+ )
280
+ ]
281
+ );
282
+
283
+ mod_generator!(
284
+ opera131,
285
+ opera116::build_emulation,
286
+ header_initializer_with_zstd_priority,
287
+ [
288
+ (
289
+ MacOS,
290
+ r#""Opera";v="131", "Not.A/Brand";v="8", "Chromium";v="147""#,
291
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 OPR/131.0.0.0"
292
+ ),
293
+ (
294
+ Windows,
295
+ r#""Opera";v="131", "Not.A/Brand";v="8", "Chromium";v="147""#,
296
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 OPR/131.0.0.0"
297
+ )
298
+ ]
299
+ );
@@ -0,0 +1,59 @@
1
+ use super::*;
2
+
3
+ #[inline]
4
+ pub fn header_initializer_for_15(ua: &'static str) -> HeaderMap {
5
+ let mut headers = HeaderMap::new();
6
+ headers.insert(USER_AGENT, HeaderValue::from_static(ua));
7
+ headers.insert(
8
+ ACCEPT,
9
+ HeaderValue::from_static("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
10
+ );
11
+ headers.insert(ACCEPT_LANGUAGE, HeaderValue::from_static("en-US,en;q=0.9"));
12
+ #[cfg(feature = "emulation-compression")]
13
+ headers.insert(
14
+ ACCEPT_ENCODING,
15
+ HeaderValue::from_static("gzip, deflate, br"),
16
+ );
17
+ headers
18
+ }
19
+
20
+ #[inline]
21
+ pub fn header_initializer_for_16_17(ua: &'static str) -> HeaderMap {
22
+ let mut headers = HeaderMap::new();
23
+ headers.insert(
24
+ ACCEPT,
25
+ HeaderValue::from_static("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
26
+ );
27
+ headers.insert("sec-fetch-site", HeaderValue::from_static("none"));
28
+ #[cfg(feature = "emulation-compression")]
29
+ headers.insert(
30
+ ACCEPT_ENCODING,
31
+ HeaderValue::from_static("gzip, deflate, br"),
32
+ );
33
+ headers.insert("sec-fetch-mode", HeaderValue::from_static("navigate"));
34
+ headers.insert(USER_AGENT, HeaderValue::from_static(ua));
35
+ headers.insert(ACCEPT_LANGUAGE, HeaderValue::from_static("en-US,en;q=0.9"));
36
+ headers.insert("sec-fetch-dest", HeaderValue::from_static("document"));
37
+ headers
38
+ }
39
+
40
+ #[inline]
41
+ pub fn header_initializer_for_18(ua: &'static str) -> HeaderMap {
42
+ let mut headers = HeaderMap::new();
43
+ headers.insert("sec-fetch-dest", HeaderValue::from_static("document"));
44
+ headers.insert(USER_AGENT, HeaderValue::from_static(ua));
45
+ headers.insert(
46
+ ACCEPT,
47
+ HeaderValue::from_static("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
48
+ );
49
+ headers.insert("sec-fetch-site", HeaderValue::from_static("none"));
50
+ headers.insert("sec-fetch-mode", HeaderValue::from_static("navigate"));
51
+ headers.insert(ACCEPT_LANGUAGE, HeaderValue::from_static("en-US,en;q=0.9"));
52
+ headers.insert("priority", HeaderValue::from_static("u=0, i"));
53
+ #[cfg(feature = "emulation-compression")]
54
+ headers.insert(
55
+ ACCEPT_ENCODING,
56
+ HeaderValue::from_static("gzip, deflate, br"),
57
+ );
58
+ headers
59
+ }
@@ -0,0 +1,116 @@
1
+ macro_rules! headers_pseudo_order {
2
+ (1) => {
3
+ PseudoOrder::builder()
4
+ .extend([
5
+ PseudoId::Method,
6
+ PseudoId::Scheme,
7
+ PseudoId::Path,
8
+ PseudoId::Authority,
9
+ ])
10
+ .build()
11
+ };
12
+ (2) => {
13
+ PseudoOrder::builder()
14
+ .extend([
15
+ PseudoId::Method,
16
+ PseudoId::Scheme,
17
+ PseudoId::Authority,
18
+ PseudoId::Path,
19
+ ])
20
+ .build()
21
+ };
22
+ }
23
+
24
+ macro_rules! settings_order {
25
+ (1) => {
26
+ SettingsOrder::builder()
27
+ .extend([
28
+ SettingId::HeaderTableSize,
29
+ SettingId::EnablePush,
30
+ SettingId::InitialWindowSize,
31
+ SettingId::MaxConcurrentStreams,
32
+ SettingId::MaxFrameSize,
33
+ SettingId::MaxHeaderListSize,
34
+ SettingId::EnableConnectProtocol,
35
+ SettingId::NoRfc7540Priorities,
36
+ ])
37
+ .build()
38
+ };
39
+ (2) => {
40
+ SettingsOrder::builder()
41
+ .extend([
42
+ SettingId::HeaderTableSize,
43
+ SettingId::EnablePush,
44
+ SettingId::MaxConcurrentStreams,
45
+ SettingId::InitialWindowSize,
46
+ SettingId::MaxFrameSize,
47
+ SettingId::MaxHeaderListSize,
48
+ SettingId::EnableConnectProtocol,
49
+ SettingId::NoRfc7540Priorities,
50
+ ])
51
+ .build()
52
+ };
53
+ }
54
+
55
+ macro_rules! http2_options {
56
+ (@base $builder:expr) => {
57
+ $builder
58
+ .max_concurrent_streams(100)
59
+ };
60
+
61
+ (1) => {
62
+ http2_options!(@base Http2Options::builder())
63
+ .initial_window_size(2097152)
64
+ .initial_connection_window_size(10551295)
65
+ .headers_pseudo_order(headers_pseudo_order!(1))
66
+ .settings_order(settings_order!(1))
67
+ .build()
68
+ };
69
+ (2) => {
70
+ http2_options!(@base Http2Options::builder())
71
+ .initial_window_size(2097152)
72
+ .initial_connection_window_size(10551295)
73
+ .enable_push(false)
74
+ .headers_pseudo_order(headers_pseudo_order!(1))
75
+ .settings_order(settings_order!(1))
76
+ .build()
77
+ };
78
+ (3) => {
79
+ http2_options!(@base Http2Options::builder())
80
+ .initial_window_size(2097152)
81
+ .initial_connection_window_size(10485760)
82
+ .enable_push(false)
83
+ .enable_connect_protocol(true)
84
+ .no_rfc7540_priorities(true)
85
+ .headers_pseudo_order(headers_pseudo_order!(2))
86
+ .settings_order(settings_order!(2))
87
+ .build()
88
+ };
89
+ (4) => {
90
+ http2_options!(@base Http2Options::builder())
91
+ .initial_window_size(4194304)
92
+ .initial_connection_window_size(10551295)
93
+ .headers_pseudo_order(headers_pseudo_order!(1))
94
+ .settings_order(settings_order!(1))
95
+ .build()
96
+ };
97
+ (5) => {
98
+ http2_options!(@base Http2Options::builder())
99
+ .initial_window_size(4194304)
100
+ .initial_connection_window_size(10551295)
101
+ .enable_push(false)
102
+ .headers_pseudo_order(headers_pseudo_order!(1))
103
+ .settings_order(settings_order!(1))
104
+ .build()
105
+ };
106
+ (6) => {
107
+ http2_options!(@base Http2Options::builder())
108
+ .initial_window_size(2097152)
109
+ .initial_connection_window_size(10485760)
110
+ .enable_push(false)
111
+ .no_rfc7540_priorities(true)
112
+ .headers_pseudo_order(headers_pseudo_order!(2))
113
+ .settings_order(settings_order!(2))
114
+ .build()
115
+ };
116
+ }
@@ -0,0 +1,177 @@
1
+ use super::*;
2
+
3
+ macro_rules! tls_options {
4
+ (1, $cipher_list:expr) => {
5
+ SafariTlsConfig::builder()
6
+ .cipher_list($cipher_list)
7
+ .build()
8
+ .into()
9
+ };
10
+ (2, $cipher_list:expr, $sigalgs_list:expr) => {
11
+ SafariTlsConfig::builder()
12
+ .cipher_list($cipher_list)
13
+ .sigalgs_list($sigalgs_list)
14
+ .build()
15
+ .into()
16
+ };
17
+ (3, $cipher_list:expr, $sigalgs_list:expr, $curves:expr) => {
18
+ SafariTlsConfig::builder()
19
+ .curves($curves)
20
+ .cipher_list($cipher_list)
21
+ .sigalgs_list($sigalgs_list)
22
+ .preserve_tls13_cipher_list(true)
23
+ .min_tls_version(wreq::tls::TlsVersion::TLS_1_2)
24
+ .max_tls_version(wreq::tls::TlsVersion::TLS_1_3)
25
+ .build()
26
+ .into()
27
+ };
28
+ }
29
+
30
+ pub const CURVES_1: &str = join!(":", "X25519", "P-256", "P-384", "P-521");
31
+
32
+ pub const CURVES_2: &str = join!(":", "X25519MLKEM768", "X25519", "P-256", "P-384", "P-521");
33
+
34
+ pub const CIPHER_LIST_1: &str = join!(
35
+ ":",
36
+ "TLS_AES_128_GCM_SHA256",
37
+ "TLS_AES_256_GCM_SHA384",
38
+ "TLS_CHACHA20_POLY1305_SHA256",
39
+ "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
40
+ "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
41
+ "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
42
+ "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
43
+ "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
44
+ "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
45
+ "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",
46
+ "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
47
+ "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
48
+ "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
49
+ "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",
50
+ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
51
+ "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
52
+ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
53
+ "TLS_RSA_WITH_AES_256_GCM_SHA384",
54
+ "TLS_RSA_WITH_AES_128_GCM_SHA256",
55
+ "TLS_RSA_WITH_AES_256_CBC_SHA256",
56
+ "TLS_RSA_WITH_AES_128_CBC_SHA256",
57
+ "TLS_RSA_WITH_AES_256_CBC_SHA",
58
+ "TLS_RSA_WITH_AES_128_CBC_SHA",
59
+ "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA",
60
+ "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
61
+ "TLS_RSA_WITH_3DES_EDE_CBC_SHA"
62
+ );
63
+ pub const CIPHER_LIST_2: &str = join!(
64
+ ":",
65
+ "TLS_AES_128_GCM_SHA256",
66
+ "TLS_AES_256_GCM_SHA384",
67
+ "TLS_CHACHA20_POLY1305_SHA256",
68
+ "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
69
+ "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
70
+ "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
71
+ "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
72
+ "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
73
+ "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
74
+ "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
75
+ "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
76
+ "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
77
+ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
78
+ "TLS_RSA_WITH_AES_256_GCM_SHA384",
79
+ "TLS_RSA_WITH_AES_128_GCM_SHA256",
80
+ "TLS_RSA_WITH_AES_256_CBC_SHA",
81
+ "TLS_RSA_WITH_AES_128_CBC_SHA",
82
+ "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA",
83
+ "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
84
+ "TLS_RSA_WITH_3DES_EDE_CBC_SHA"
85
+ );
86
+ pub const CIPHER_LIST_3: &str = join!(
87
+ ":",
88
+ "TLS_AES_256_GCM_SHA384",
89
+ "TLS_CHACHA20_POLY1305_SHA256",
90
+ "TLS_AES_128_GCM_SHA256",
91
+ "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
92
+ "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
93
+ "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
94
+ "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
95
+ "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
96
+ "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
97
+ "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
98
+ "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
99
+ "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
100
+ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
101
+ "TLS_RSA_WITH_AES_256_GCM_SHA384",
102
+ "TLS_RSA_WITH_AES_128_GCM_SHA256",
103
+ "TLS_RSA_WITH_AES_256_CBC_SHA",
104
+ "TLS_RSA_WITH_AES_128_CBC_SHA",
105
+ "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA",
106
+ "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
107
+ "TLS_RSA_WITH_3DES_EDE_CBC_SHA"
108
+ );
109
+
110
+ pub const SIGALGS_LIST_1: &str = join!(
111
+ ":",
112
+ "ecdsa_secp256r1_sha256",
113
+ "rsa_pss_rsae_sha256",
114
+ "rsa_pkcs1_sha256",
115
+ "ecdsa_secp384r1_sha384",
116
+ "ecdsa_sha1",
117
+ "rsa_pss_rsae_sha384",
118
+ "rsa_pss_rsae_sha384",
119
+ "rsa_pkcs1_sha384",
120
+ "rsa_pss_rsae_sha512",
121
+ "rsa_pkcs1_sha512",
122
+ "rsa_pkcs1_sha1"
123
+ );
124
+
125
+ pub const SIGALGS_LIST_2: &str = join!(
126
+ ":",
127
+ "ecdsa_secp256r1_sha256",
128
+ "rsa_pss_rsae_sha256",
129
+ "rsa_pkcs1_sha256",
130
+ "ecdsa_secp384r1_sha384",
131
+ "rsa_pss_rsae_sha384",
132
+ "rsa_pss_rsae_sha384",
133
+ "rsa_pkcs1_sha384",
134
+ "rsa_pss_rsae_sha512",
135
+ "rsa_pkcs1_sha512",
136
+ "rsa_pkcs1_sha1"
137
+ );
138
+
139
+ pub const CERTIFICATE_COMPRESSORS: &[&'static dyn CertificateCompressor] = &[&ZlibCompressor];
140
+
141
+ #[derive(TypedBuilder)]
142
+ pub struct SafariTlsConfig {
143
+ #[builder(default = TlsVersion::TLS_1_0)]
144
+ min_tls_version: TlsVersion,
145
+
146
+ #[builder(default = TlsVersion::TLS_1_3)]
147
+ max_tls_version: TlsVersion,
148
+
149
+ #[builder(default = CURVES_1)]
150
+ curves: &'static str,
151
+
152
+ #[builder(default = SIGALGS_LIST_1)]
153
+ sigalgs_list: &'static str,
154
+
155
+ cipher_list: &'static str,
156
+
157
+ #[builder(default, setter(strip_option))]
158
+ preserve_tls13_cipher_list: Option<bool>,
159
+ }
160
+
161
+ impl From<SafariTlsConfig> for TlsOptions {
162
+ fn from(val: SafariTlsConfig) -> Self {
163
+ TlsOptions::builder()
164
+ .session_ticket(false)
165
+ .grease_enabled(true)
166
+ .enable_ocsp_stapling(true)
167
+ .enable_signed_cert_timestamps(true)
168
+ .preserve_tls13_cipher_list(val.preserve_tls13_cipher_list)
169
+ .curves_list(val.curves)
170
+ .sigalgs_list(val.sigalgs_list)
171
+ .cipher_list(val.cipher_list)
172
+ .min_tls_version(val.min_tls_version)
173
+ .max_tls_version(val.max_tls_version)
174
+ .certificate_compressors(CERTIFICATE_COMPRESSORS)
175
+ .build()
176
+ }
177
+ }