Skip to main content

ReqExt

Trait ReqExt 

Source
pub trait ReqExt: ReqPriExt + Sized {
Show 35 methods // Required methods fn header_mut(&mut self) -> &mut Header; fn header(&self) -> &Header; fn set_timeout(&mut self, timeout: Timeout); fn timeout(&self) -> &Timeout; fn timeout_mut(&mut self) -> &mut Timeout; fn url(&self) -> String; fn set_proxy(&mut self, proxy: Proxy); fn set_verify(&mut self, verify: bool); fn set_auto_redirect(&mut self, auto_redirect: bool); fn set_mtls(&mut self, certs: Vec<Certificate>, key: RsaKey); fn set_callback( &mut self, callback: impl FnMut(&[u8]) -> Result<(), HlsError> + 'static, ); fn set_fingerprint(&mut self, fingerprint: Fingerprint); // Provided methods fn set_data(&mut self, data: JsonValue) { ... } fn set_text(&mut self, text: impl ToString) { ... } fn set_json(&mut self, data: JsonValue) { ... } fn set_bytes(&mut self, bs: impl Into<Vec<u8>>, ct: ContentType) { ... } fn set_files(&mut self, file: HttpFile) -> Result<(), HlsError> { ... } fn add_file(&mut self, path: impl AsRef<Path>) -> Result<(), HlsError> { ... } fn with_timeout(self, timeout: Timeout) -> Self { ... } fn set_uri(&mut self, uri: impl TryInto<Uri>) -> Result<(), RlsError> { ... } fn with_proxy(self, proxy: Proxy) -> Self { ... } fn with_verify(self, verify: bool) -> Self { ... } fn with_auto_redirect(self, auto_redirect: bool) -> Self { ... } fn set_alpn(&mut self, alpn: ALPN) { ... } fn with_alpn(self, alpn: ALPN) -> Self { ... } fn with_mtls(self, certs: Vec<Certificate>, key: RsaKey) -> Self { ... } fn with_fingerprint(self, fingerprint: Fingerprint) -> Self { ... } fn set_headers(&mut self, headers: Header, keep_cookie: bool) { ... } fn set_headers_json(&mut self, headers: JsonValue) -> Result<(), HlsError> { ... } fn with_header_json(self, data: JsonValue) -> Result<Self, HlsError> { ... } fn insert_header( &mut self, k: impl AsRef<str>, v: impl ToString, ) -> Result<(), HlsError> { ... } fn remove_header(&mut self, k: impl AsRef<str>) -> Option<HeaderValue> { ... } fn set_params(&mut self, params: JsonValue) { ... } fn add_param(&mut self, name: impl ToString, value: impl ToString) { ... } fn remove_param(&mut self, name: impl ToString) -> Option<String> { ... }
}

Required Methods§

Source

fn header_mut(&mut self) -> &mut Header

Source

fn header(&self) -> &Header

Source

fn set_timeout(&mut self, timeout: Timeout)

Source

fn timeout(&self) -> &Timeout

Source

fn timeout_mut(&mut self) -> &mut Timeout

Source

fn url(&self) -> String

Source

fn set_proxy(&mut self, proxy: Proxy)

Source

fn set_verify(&mut self, verify: bool)

是否校验服务器下发的消息(证书、签名等),默认校验

Source

fn set_auto_redirect(&mut self, auto_redirect: bool)

是否自动进行跳转

Source

fn set_mtls(&mut self, certs: Vec<Certificate>, key: RsaKey)

启用mtls,并传入客户端证书

Source

fn set_callback( &mut self, callback: impl FnMut(&[u8]) -> Result<(), HlsError> + 'static, )

Source

fn set_fingerprint(&mut self, fingerprint: Fingerprint)

Provided Methods§

Source

fn set_data(&mut self, data: JsonValue)

Source

fn set_text(&mut self, text: impl ToString)

Source

fn set_json(&mut self, data: JsonValue)

Source

fn set_bytes(&mut self, bs: impl Into<Vec<u8>>, ct: ContentType)

Source

fn set_files(&mut self, file: HttpFile) -> Result<(), HlsError>

  • 文件上传示例
use reqrio::*;
let data=json::object!{"key":"value"};
let mut file=HttpFile::new_path_data(data,"path/to/file1").unwrap();
file.add_form(FileForm::new_path("path/to/file2").unwrap());
let mut req=ScReq::new();
req.set_files(file).unwrap();
Source

fn add_file(&mut self, path: impl AsRef<Path>) -> Result<(), HlsError>

Source

fn with_timeout(self, timeout: Timeout) -> Self

Examples found in repository?
examples/sync_h1.rs (line 24)
4fn main() {
5    let mut tss = 0;
6    for i in 0..100 {
7        let t = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis();
8        // println!("{}", t);
9        // let fingerprint = Fingerprint::from_hex_all("16030106b2010006ae0303f0aed3d4d9fac0e8d4ff98981a90257765d203b4ce089c591e86d8e7ec8ab90a204803c2150a14429bfe6536328fe11cfd4034264fa2a3a443c5972eeeb93d427100206a6a130113021303c02bc02fc02cc030cca9cca8c013c014009c009d002f0035010006453a3a000000230000001b0003020002ff010001000000000e000c0000093338686d7a672e636e0005000501000000000017000044cd00050003026832fe0d00ba00000100010900208e3fc249e1ce71ff4aefb0970b38167b6b7de98537b874130ba4e284e15f1c4f00909540fc3a77fcc8f96d51ff9144785ccf114d3618d9a77b0e88f54d4dd1279083483e0ad83a4f25e55951194048709bf0842651d940c291569b9cfe1323d6fc2d31348ccaaa7b79271fc41af0975d94f7a826819154e05f6f90bdaa4e2b215894ccd36f748ded2bcae0a61aa101a7187588c2b45b51d076356d0e47728974d6d1cdd2b3ce4a8e5e8f70a79fb8f288c868000b00020100002d00020101000a000c000a3a3a11ec001d00170018001200000010000e000c02683208687474702f312e31003304ef04ed3a3a00010011ec04c05b20439ba8b50e3a5800981889512ab253cd2f1ba1488613fbd79f43813c08e34ed45330a62991a6b37890d54d2d0c089251b146acace84512c031c74ac6a2ac6345b6668629aa143357b45921916de02ac5cc8d57e1ca9882ccad900640a1b51c587de3291a2f15ad67e180b79b442fe4606de978f7a27591a41ffcd91116c50703c45531999c9d377a173c249ef747a60a81158c0d3ef709b9b5a38af61b6b5c9740c343f7322b6510a60797cb39148ba310413b688354bb0b2e395dbf3935fd0a797d7b5e94acab23a95c163238dd1bc9b8b420599a0efd4726e85a0783fc8506436c3eb89ee96008b0c9c5a2047a2415bbb5a2768d7c8d58384644d5473de96721b24a3fc82ee68cc0a3a43cc73467ec515a3ac1a79b9070f4e4aad61ac50c7b4e9b125f66cba026807cdad5a43e4a5cfa2ac521801616bb58ea068689c15afd4592b26545c3a8c638800a3429c32237a902f1a605458935391c4d352a211cb2122203f9ea38e3d44b29741502bb57c7850ffaf36ab0db72ac9c0fc0ba309661096bc550d86b442beca080c0602e02a54ed2171e58b0b82582c568a5b1407d8d35448cf907a43575aed4c5371595d1456f29778c892325d4d785a3a384a30b838e6b0d59990ca54ba52369c4faf835a2f50cbd504f7d38cdc4047bf7acae92090cf121180096a513dc4cadf290641ab6e4375aa477395b8902b74c39e62b945a09438d83b1d41ac2f204c4614425bed86e221c60c8520e1c3233e5ccb53c228c0d525fb7823d9d9c4337e36785eb61590794f9565b3dd2722a2834b536be157a307d928d7f910167a314b8705bdddc1b4c9c139a5320380910b1263b40a6c6065c84266a2c036a19d3a51f5edbb8eaf3cb1e8295ef1ab978f5306da9b11a5a3df473bbd2acca084a4c4bba0bc478630283b0e6910bde3052c6f58300703a6e9524381b4cc1b247236acc1c0bae6cb69c463c29811b04d93a589ba36d30c9b4d1fb234368a9b3e94abaf419a220af730917488bc9be585f7111c9a13a8544969bf3e397b1f2ceba0ca7f21785531a3f7856248f54a5bd854124b21e1e75c366e8b5293130bdb902db0a05e9803c3d7827d5cc26046815102c3713b4a14ef63aed3163319244995a6524dbabfaf93ed8a95e08641377683dd6b3b05084bf48f77d47904d09656d4a19b457d84bcfd77a4c433393bbb43f09931cf4896cf891990c9363202467b6193ea6b8bd493733235c93c118feb808b1d9b38cc7862c744342e2baeeec6299d0a21898aa9576ae61b2703a5b072521166f6693aa4b5e6148ad4e7c21a21a7972a0c8c3f986e95392ed2b15e51a5f2e5b90e4766320513e3bfa4d67688fb6c547147c47aa71c04095336b11b32b52a6c9d047a1357eece2688efb2045184653a480ef15a3fb8c4851d8c0407b24a87b55fd36af59b18fff38b183b6256e15c161395a46f62ce1b0af240319dec84d3aa04e2773ac289b393160683e901b2b622d615b2719b06cc12bae79fca101e737a91434c8e0828cc6a71b740216964a06a9952d9c54f24743b1b9c4fc9475554aa8a87719ccd7ae40374c87d8018937c7b6007e028b348e884d201087416396ec3237b61319e0f40e436a6a1dc75f2486a68c60c27f719d251a9d73b3de3bd91858d3f3d4043384f7ad42422b47b96bdd03b5556f8107232953dad801970157aa95971638e2908d55001d0020552cb65392fdab1ff61dd3b43c895fdf782c61bb6f05519f2b7d9e28facfd25e000d0012001004030804040105030805050108060601002b000706dada030403031a1a0001001603030046100000424104ff635373fbbfbc37444a2026372f57fd06c5205bacfe32b61261a9d29bf1fca57f91ef22cb2ba46af8cf9ae7c3123f56634099af297dcd30835cd81664005fb9140303000101").unwrap();
10        // let fingerprint = Fingerprint::from_ja3("771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513-21,29-23-24,0", "4b107bbnbc-01o-3781k7bbnbc-01v25461k").unwrap();
11        // let certs = Certificate::from_pem_file("/home/xl/1/client.crt").unwrap();
12        // let key = RsaKey::from_pri_pem_file("/home/xl/1/client.key").unwrap();
13        let mut timeout = Timeout::new();
14        timeout.set_connect(30000000);
15        timeout.set_handle(300000000);
16        timeout.set_read(99999999999);
17        timeout.set_write(99999999999);
18        timeout.set_handle_times(3);
19        let mut req = ScReq::new()
20            // .with_fingerprint(fingerprint)
21            .with_alpn(ALPN::Http20)
22            // .with_mtls(certs, key)
23            .with_verify(false)
24            .with_timeout(timeout)
25            // .with_proxy(Proxy::new_http_plain("127.0.0.1", 10280))
26            ;
27        let headers = json::object! {
28            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
29            "Accept": "*/*",
30            "Sec-Fetch-Site": "none",
31            "Sec-Fetch-Mode": "navigate",
32            "Sec-Fetch-Dest": "document",
33            "sec-fetch-user":"?1",
34            "upgrade-insecure-requests":"1",
35            "sec-ch-ua": "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Microsoft Edge\";v=\"120\"",
36            "sec-ch-ua-mobile": "?0",
37            "sec-ch-ua-platform": "\"Windows\"",
38            "Accept-Language": "zh-CN,zh;q=0.9",
39            "Accept-Encoding": "gzip,deflate,br,zstd",
40            "Cache-Control": "no-cache",
41            "Connection": "keep-alive",
42
43        };
44        // req.set_url("https://zhifazhe.top").unwrap();
45        // req.set_url("http://3434.characlink.com").unwrap();
46        // req.set_url("https://m.so.com").unwrap();
47        req.set_proxy(Proxy::new_socks5("34.124.190.108", 8080));
48        // println!("{}", et - t);
49        // req.set_url("https://ms.xllgl.top").unwrap();
50        req.set_url("https://www.baidu.com").unwrap();
51
52        // req.set_url("https://jetstar.com").unwrap();
53        // let et = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis();
54        // println!("{}", et - t);
55        // req.set_url("https://cn.bing.com/search?q=site%EF%BC%9Aqq.com&first=150&FORM=PERE2").unwrap();
56        // req.set_url("https://accounts.pcid.ca/login").unwrap();
57        // req.set_url("https://ccppdd.zzzzzzyyyyy.shop/api/v1/client/s9FkyFPBngt80pFn1?token=a0cedb7c6645280ec2402db62d550a17").unwrap();
58        // req.set_url("https://www.link114.cn/").unwrap();
59        // req.set_url("https://127.0.0.1:8000").unwrap();
60        // req.set_url("http://zwfw.hubei.gov.cn/web/user/uias_login.do?appCode=hbzwfw&gotoUrl=http%3A%2F%2Fzwfw.hubei.gov.cn%2Fwebview%2Fgrkj%2Fwelcome.html&p01=").unwrap();
61        req.set_auto_redirect(true);
62        req.set_headers_json(headers).unwrap();
63        // println!("6");
64        let res = req.get().unwrap();
65        let et = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis();
66        tss += et - t;
67        println!("{}", et - t);
68        // res.text().unwrap();
69        // println!("{}", res.header());
70        // println!("{}", res.text().unwrap().len());
71        // for _ in 0..50 {
72        //     let resp = req.get().unwrap();
73        //     // let body = res.decode_body().unwrap().as_string().unwrap();
74        //     // println!("{}", resp.header().status());
75        //     // println!("{}", resp.text().unwrap().len());
76        //     let et = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis();
77        //     println!("{}", et - t);
78        // }
79
80
81        // break;
82    }
83    println!("{}", tss / 100);
84}
Source

fn set_uri(&mut self, uri: impl TryInto<Uri>) -> Result<(), RlsError>

Source

fn with_proxy(self, proxy: Proxy) -> Self

Source

fn with_verify(self, verify: bool) -> Self

Examples found in repository?
examples/sync_h1.rs (line 23)
4fn main() {
5    let mut tss = 0;
6    for i in 0..100 {
7        let t = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis();
8        // println!("{}", t);
9        // let fingerprint = Fingerprint::from_hex_all("16030106b2010006ae0303f0aed3d4d9fac0e8d4ff98981a90257765d203b4ce089c591e86d8e7ec8ab90a204803c2150a14429bfe6536328fe11cfd4034264fa2a3a443c5972eeeb93d427100206a6a130113021303c02bc02fc02cc030cca9cca8c013c014009c009d002f0035010006453a3a000000230000001b0003020002ff010001000000000e000c0000093338686d7a672e636e0005000501000000000017000044cd00050003026832fe0d00ba00000100010900208e3fc249e1ce71ff4aefb0970b38167b6b7de98537b874130ba4e284e15f1c4f00909540fc3a77fcc8f96d51ff9144785ccf114d3618d9a77b0e88f54d4dd1279083483e0ad83a4f25e55951194048709bf0842651d940c291569b9cfe1323d6fc2d31348ccaaa7b79271fc41af0975d94f7a826819154e05f6f90bdaa4e2b215894ccd36f748ded2bcae0a61aa101a7187588c2b45b51d076356d0e47728974d6d1cdd2b3ce4a8e5e8f70a79fb8f288c868000b00020100002d00020101000a000c000a3a3a11ec001d00170018001200000010000e000c02683208687474702f312e31003304ef04ed3a3a00010011ec04c05b20439ba8b50e3a5800981889512ab253cd2f1ba1488613fbd79f43813c08e34ed45330a62991a6b37890d54d2d0c089251b146acace84512c031c74ac6a2ac6345b6668629aa143357b45921916de02ac5cc8d57e1ca9882ccad900640a1b51c587de3291a2f15ad67e180b79b442fe4606de978f7a27591a41ffcd91116c50703c45531999c9d377a173c249ef747a60a81158c0d3ef709b9b5a38af61b6b5c9740c343f7322b6510a60797cb39148ba310413b688354bb0b2e395dbf3935fd0a797d7b5e94acab23a95c163238dd1bc9b8b420599a0efd4726e85a0783fc8506436c3eb89ee96008b0c9c5a2047a2415bbb5a2768d7c8d58384644d5473de96721b24a3fc82ee68cc0a3a43cc73467ec515a3ac1a79b9070f4e4aad61ac50c7b4e9b125f66cba026807cdad5a43e4a5cfa2ac521801616bb58ea068689c15afd4592b26545c3a8c638800a3429c32237a902f1a605458935391c4d352a211cb2122203f9ea38e3d44b29741502bb57c7850ffaf36ab0db72ac9c0fc0ba309661096bc550d86b442beca080c0602e02a54ed2171e58b0b82582c568a5b1407d8d35448cf907a43575aed4c5371595d1456f29778c892325d4d785a3a384a30b838e6b0d59990ca54ba52369c4faf835a2f50cbd504f7d38cdc4047bf7acae92090cf121180096a513dc4cadf290641ab6e4375aa477395b8902b74c39e62b945a09438d83b1d41ac2f204c4614425bed86e221c60c8520e1c3233e5ccb53c228c0d525fb7823d9d9c4337e36785eb61590794f9565b3dd2722a2834b536be157a307d928d7f910167a314b8705bdddc1b4c9c139a5320380910b1263b40a6c6065c84266a2c036a19d3a51f5edbb8eaf3cb1e8295ef1ab978f5306da9b11a5a3df473bbd2acca084a4c4bba0bc478630283b0e6910bde3052c6f58300703a6e9524381b4cc1b247236acc1c0bae6cb69c463c29811b04d93a589ba36d30c9b4d1fb234368a9b3e94abaf419a220af730917488bc9be585f7111c9a13a8544969bf3e397b1f2ceba0ca7f21785531a3f7856248f54a5bd854124b21e1e75c366e8b5293130bdb902db0a05e9803c3d7827d5cc26046815102c3713b4a14ef63aed3163319244995a6524dbabfaf93ed8a95e08641377683dd6b3b05084bf48f77d47904d09656d4a19b457d84bcfd77a4c433393bbb43f09931cf4896cf891990c9363202467b6193ea6b8bd493733235c93c118feb808b1d9b38cc7862c744342e2baeeec6299d0a21898aa9576ae61b2703a5b072521166f6693aa4b5e6148ad4e7c21a21a7972a0c8c3f986e95392ed2b15e51a5f2e5b90e4766320513e3bfa4d67688fb6c547147c47aa71c04095336b11b32b52a6c9d047a1357eece2688efb2045184653a480ef15a3fb8c4851d8c0407b24a87b55fd36af59b18fff38b183b6256e15c161395a46f62ce1b0af240319dec84d3aa04e2773ac289b393160683e901b2b622d615b2719b06cc12bae79fca101e737a91434c8e0828cc6a71b740216964a06a9952d9c54f24743b1b9c4fc9475554aa8a87719ccd7ae40374c87d8018937c7b6007e028b348e884d201087416396ec3237b61319e0f40e436a6a1dc75f2486a68c60c27f719d251a9d73b3de3bd91858d3f3d4043384f7ad42422b47b96bdd03b5556f8107232953dad801970157aa95971638e2908d55001d0020552cb65392fdab1ff61dd3b43c895fdf782c61bb6f05519f2b7d9e28facfd25e000d0012001004030804040105030805050108060601002b000706dada030403031a1a0001001603030046100000424104ff635373fbbfbc37444a2026372f57fd06c5205bacfe32b61261a9d29bf1fca57f91ef22cb2ba46af8cf9ae7c3123f56634099af297dcd30835cd81664005fb9140303000101").unwrap();
10        // let fingerprint = Fingerprint::from_ja3("771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513-21,29-23-24,0", "4b107bbnbc-01o-3781k7bbnbc-01v25461k").unwrap();
11        // let certs = Certificate::from_pem_file("/home/xl/1/client.crt").unwrap();
12        // let key = RsaKey::from_pri_pem_file("/home/xl/1/client.key").unwrap();
13        let mut timeout = Timeout::new();
14        timeout.set_connect(30000000);
15        timeout.set_handle(300000000);
16        timeout.set_read(99999999999);
17        timeout.set_write(99999999999);
18        timeout.set_handle_times(3);
19        let mut req = ScReq::new()
20            // .with_fingerprint(fingerprint)
21            .with_alpn(ALPN::Http20)
22            // .with_mtls(certs, key)
23            .with_verify(false)
24            .with_timeout(timeout)
25            // .with_proxy(Proxy::new_http_plain("127.0.0.1", 10280))
26            ;
27        let headers = json::object! {
28            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
29            "Accept": "*/*",
30            "Sec-Fetch-Site": "none",
31            "Sec-Fetch-Mode": "navigate",
32            "Sec-Fetch-Dest": "document",
33            "sec-fetch-user":"?1",
34            "upgrade-insecure-requests":"1",
35            "sec-ch-ua": "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Microsoft Edge\";v=\"120\"",
36            "sec-ch-ua-mobile": "?0",
37            "sec-ch-ua-platform": "\"Windows\"",
38            "Accept-Language": "zh-CN,zh;q=0.9",
39            "Accept-Encoding": "gzip,deflate,br,zstd",
40            "Cache-Control": "no-cache",
41            "Connection": "keep-alive",
42
43        };
44        // req.set_url("https://zhifazhe.top").unwrap();
45        // req.set_url("http://3434.characlink.com").unwrap();
46        // req.set_url("https://m.so.com").unwrap();
47        req.set_proxy(Proxy::new_socks5("34.124.190.108", 8080));
48        // println!("{}", et - t);
49        // req.set_url("https://ms.xllgl.top").unwrap();
50        req.set_url("https://www.baidu.com").unwrap();
51
52        // req.set_url("https://jetstar.com").unwrap();
53        // let et = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis();
54        // println!("{}", et - t);
55        // req.set_url("https://cn.bing.com/search?q=site%EF%BC%9Aqq.com&first=150&FORM=PERE2").unwrap();
56        // req.set_url("https://accounts.pcid.ca/login").unwrap();
57        // req.set_url("https://ccppdd.zzzzzzyyyyy.shop/api/v1/client/s9FkyFPBngt80pFn1?token=a0cedb7c6645280ec2402db62d550a17").unwrap();
58        // req.set_url("https://www.link114.cn/").unwrap();
59        // req.set_url("https://127.0.0.1:8000").unwrap();
60        // req.set_url("http://zwfw.hubei.gov.cn/web/user/uias_login.do?appCode=hbzwfw&gotoUrl=http%3A%2F%2Fzwfw.hubei.gov.cn%2Fwebview%2Fgrkj%2Fwelcome.html&p01=").unwrap();
61        req.set_auto_redirect(true);
62        req.set_headers_json(headers).unwrap();
63        // println!("6");
64        let res = req.get().unwrap();
65        let et = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis();
66        tss += et - t;
67        println!("{}", et - t);
68        // res.text().unwrap();
69        // println!("{}", res.header());
70        // println!("{}", res.text().unwrap().len());
71        // for _ in 0..50 {
72        //     let resp = req.get().unwrap();
73        //     // let body = res.decode_body().unwrap().as_string().unwrap();
74        //     // println!("{}", resp.header().status());
75        //     // println!("{}", resp.text().unwrap().len());
76        //     let et = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis();
77        //     println!("{}", et - t);
78        // }
79
80
81        // break;
82    }
83    println!("{}", tss / 100);
84}
Source

fn with_auto_redirect(self, auto_redirect: bool) -> Self

Source

fn set_alpn(&mut self, alpn: ALPN)

  • 必须在建立tls连接(即:set_url/with_url)前设置, 否则需要调re_conn
  • 默认使用http2.0去连接,实际使用协议需要和服务器协商
Source

fn with_alpn(self, alpn: ALPN) -> Self

Examples found in repository?
examples/m3u8_down.rs (line 16)
15    fn new(index: impl ToString) -> M3u8DownEngine {
16        let mut req = ScReq::new().with_alpn(ALPN::Http20); //.with_proxy(Proxy::new_http_plain("127.0.0.1", 10809));
17        req.set_headers_json(json::object! {
18            "Host": "",
19            "sec-ch-ua-platform": "Android",
20            "user-agent": "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36",
21            "sec-ch-ua": r#""Android WebView";v="135", "Not-A.Brand";v="8", "Chromium";v="135""#,
22            "sec-ch-ua-mobile": "?1",
23            "accept": "*/*",
24            "origin": "",
25            "x-requested-with": "mark.via",
26            "sec-fetch-site": "cross-site",
27            "sec-fetch-mode": "cors",
28            "sec-fetch-dest": "empty",
29            "referer": "",
30            "accept-encoding": "gzip, deflate, br, zstd",
31            "accept-language": "en,zh-CN;q=0.9,zh;q=0.8,en-US;q=0.7",
32            "priority": "u=1, i"
33        }).unwrap();
34        M3u8DownEngine {
35            req,
36            index_url: index.to_string(),
37            sequence: 0,
38            key_url: "".to_string(),
39            ts_urls: vec![],
40            cipher: Cipher::aes_128_ecb(),
41        }
42    }
More examples
Hide additional examples
examples/sync_h1.rs (line 21)
4fn main() {
5    let mut tss = 0;
6    for i in 0..100 {
7        let t = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis();
8        // println!("{}", t);
9        // let fingerprint = Fingerprint::from_hex_all("16030106b2010006ae0303f0aed3d4d9fac0e8d4ff98981a90257765d203b4ce089c591e86d8e7ec8ab90a204803c2150a14429bfe6536328fe11cfd4034264fa2a3a443c5972eeeb93d427100206a6a130113021303c02bc02fc02cc030cca9cca8c013c014009c009d002f0035010006453a3a000000230000001b0003020002ff010001000000000e000c0000093338686d7a672e636e0005000501000000000017000044cd00050003026832fe0d00ba00000100010900208e3fc249e1ce71ff4aefb0970b38167b6b7de98537b874130ba4e284e15f1c4f00909540fc3a77fcc8f96d51ff9144785ccf114d3618d9a77b0e88f54d4dd1279083483e0ad83a4f25e55951194048709bf0842651d940c291569b9cfe1323d6fc2d31348ccaaa7b79271fc41af0975d94f7a826819154e05f6f90bdaa4e2b215894ccd36f748ded2bcae0a61aa101a7187588c2b45b51d076356d0e47728974d6d1cdd2b3ce4a8e5e8f70a79fb8f288c868000b00020100002d00020101000a000c000a3a3a11ec001d00170018001200000010000e000c02683208687474702f312e31003304ef04ed3a3a00010011ec04c05b20439ba8b50e3a5800981889512ab253cd2f1ba1488613fbd79f43813c08e34ed45330a62991a6b37890d54d2d0c089251b146acace84512c031c74ac6a2ac6345b6668629aa143357b45921916de02ac5cc8d57e1ca9882ccad900640a1b51c587de3291a2f15ad67e180b79b442fe4606de978f7a27591a41ffcd91116c50703c45531999c9d377a173c249ef747a60a81158c0d3ef709b9b5a38af61b6b5c9740c343f7322b6510a60797cb39148ba310413b688354bb0b2e395dbf3935fd0a797d7b5e94acab23a95c163238dd1bc9b8b420599a0efd4726e85a0783fc8506436c3eb89ee96008b0c9c5a2047a2415bbb5a2768d7c8d58384644d5473de96721b24a3fc82ee68cc0a3a43cc73467ec515a3ac1a79b9070f4e4aad61ac50c7b4e9b125f66cba026807cdad5a43e4a5cfa2ac521801616bb58ea068689c15afd4592b26545c3a8c638800a3429c32237a902f1a605458935391c4d352a211cb2122203f9ea38e3d44b29741502bb57c7850ffaf36ab0db72ac9c0fc0ba309661096bc550d86b442beca080c0602e02a54ed2171e58b0b82582c568a5b1407d8d35448cf907a43575aed4c5371595d1456f29778c892325d4d785a3a384a30b838e6b0d59990ca54ba52369c4faf835a2f50cbd504f7d38cdc4047bf7acae92090cf121180096a513dc4cadf290641ab6e4375aa477395b8902b74c39e62b945a09438d83b1d41ac2f204c4614425bed86e221c60c8520e1c3233e5ccb53c228c0d525fb7823d9d9c4337e36785eb61590794f9565b3dd2722a2834b536be157a307d928d7f910167a314b8705bdddc1b4c9c139a5320380910b1263b40a6c6065c84266a2c036a19d3a51f5edbb8eaf3cb1e8295ef1ab978f5306da9b11a5a3df473bbd2acca084a4c4bba0bc478630283b0e6910bde3052c6f58300703a6e9524381b4cc1b247236acc1c0bae6cb69c463c29811b04d93a589ba36d30c9b4d1fb234368a9b3e94abaf419a220af730917488bc9be585f7111c9a13a8544969bf3e397b1f2ceba0ca7f21785531a3f7856248f54a5bd854124b21e1e75c366e8b5293130bdb902db0a05e9803c3d7827d5cc26046815102c3713b4a14ef63aed3163319244995a6524dbabfaf93ed8a95e08641377683dd6b3b05084bf48f77d47904d09656d4a19b457d84bcfd77a4c433393bbb43f09931cf4896cf891990c9363202467b6193ea6b8bd493733235c93c118feb808b1d9b38cc7862c744342e2baeeec6299d0a21898aa9576ae61b2703a5b072521166f6693aa4b5e6148ad4e7c21a21a7972a0c8c3f986e95392ed2b15e51a5f2e5b90e4766320513e3bfa4d67688fb6c547147c47aa71c04095336b11b32b52a6c9d047a1357eece2688efb2045184653a480ef15a3fb8c4851d8c0407b24a87b55fd36af59b18fff38b183b6256e15c161395a46f62ce1b0af240319dec84d3aa04e2773ac289b393160683e901b2b622d615b2719b06cc12bae79fca101e737a91434c8e0828cc6a71b740216964a06a9952d9c54f24743b1b9c4fc9475554aa8a87719ccd7ae40374c87d8018937c7b6007e028b348e884d201087416396ec3237b61319e0f40e436a6a1dc75f2486a68c60c27f719d251a9d73b3de3bd91858d3f3d4043384f7ad42422b47b96bdd03b5556f8107232953dad801970157aa95971638e2908d55001d0020552cb65392fdab1ff61dd3b43c895fdf782c61bb6f05519f2b7d9e28facfd25e000d0012001004030804040105030805050108060601002b000706dada030403031a1a0001001603030046100000424104ff635373fbbfbc37444a2026372f57fd06c5205bacfe32b61261a9d29bf1fca57f91ef22cb2ba46af8cf9ae7c3123f56634099af297dcd30835cd81664005fb9140303000101").unwrap();
10        // let fingerprint = Fingerprint::from_ja3("771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513-21,29-23-24,0", "4b107bbnbc-01o-3781k7bbnbc-01v25461k").unwrap();
11        // let certs = Certificate::from_pem_file("/home/xl/1/client.crt").unwrap();
12        // let key = RsaKey::from_pri_pem_file("/home/xl/1/client.key").unwrap();
13        let mut timeout = Timeout::new();
14        timeout.set_connect(30000000);
15        timeout.set_handle(300000000);
16        timeout.set_read(99999999999);
17        timeout.set_write(99999999999);
18        timeout.set_handle_times(3);
19        let mut req = ScReq::new()
20            // .with_fingerprint(fingerprint)
21            .with_alpn(ALPN::Http20)
22            // .with_mtls(certs, key)
23            .with_verify(false)
24            .with_timeout(timeout)
25            // .with_proxy(Proxy::new_http_plain("127.0.0.1", 10280))
26            ;
27        let headers = json::object! {
28            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
29            "Accept": "*/*",
30            "Sec-Fetch-Site": "none",
31            "Sec-Fetch-Mode": "navigate",
32            "Sec-Fetch-Dest": "document",
33            "sec-fetch-user":"?1",
34            "upgrade-insecure-requests":"1",
35            "sec-ch-ua": "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Microsoft Edge\";v=\"120\"",
36            "sec-ch-ua-mobile": "?0",
37            "sec-ch-ua-platform": "\"Windows\"",
38            "Accept-Language": "zh-CN,zh;q=0.9",
39            "Accept-Encoding": "gzip,deflate,br,zstd",
40            "Cache-Control": "no-cache",
41            "Connection": "keep-alive",
42
43        };
44        // req.set_url("https://zhifazhe.top").unwrap();
45        // req.set_url("http://3434.characlink.com").unwrap();
46        // req.set_url("https://m.so.com").unwrap();
47        req.set_proxy(Proxy::new_socks5("34.124.190.108", 8080));
48        // println!("{}", et - t);
49        // req.set_url("https://ms.xllgl.top").unwrap();
50        req.set_url("https://www.baidu.com").unwrap();
51
52        // req.set_url("https://jetstar.com").unwrap();
53        // let et = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis();
54        // println!("{}", et - t);
55        // req.set_url("https://cn.bing.com/search?q=site%EF%BC%9Aqq.com&first=150&FORM=PERE2").unwrap();
56        // req.set_url("https://accounts.pcid.ca/login").unwrap();
57        // req.set_url("https://ccppdd.zzzzzzyyyyy.shop/api/v1/client/s9FkyFPBngt80pFn1?token=a0cedb7c6645280ec2402db62d550a17").unwrap();
58        // req.set_url("https://www.link114.cn/").unwrap();
59        // req.set_url("https://127.0.0.1:8000").unwrap();
60        // req.set_url("http://zwfw.hubei.gov.cn/web/user/uias_login.do?appCode=hbzwfw&gotoUrl=http%3A%2F%2Fzwfw.hubei.gov.cn%2Fwebview%2Fgrkj%2Fwelcome.html&p01=").unwrap();
61        req.set_auto_redirect(true);
62        req.set_headers_json(headers).unwrap();
63        // println!("6");
64        let res = req.get().unwrap();
65        let et = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis();
66        tss += et - t;
67        println!("{}", et - t);
68        // res.text().unwrap();
69        // println!("{}", res.header());
70        // println!("{}", res.text().unwrap().len());
71        // for _ in 0..50 {
72        //     let resp = req.get().unwrap();
73        //     // let body = res.decode_body().unwrap().as_string().unwrap();
74        //     // println!("{}", resp.header().status());
75        //     // println!("{}", resp.text().unwrap().len());
76        //     let et = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis();
77        //     println!("{}", et - t);
78        // }
79
80
81        // break;
82    }
83    println!("{}", tss / 100);
84}
Source

fn with_mtls(self, certs: Vec<Certificate>, key: RsaKey) -> Self

Source

fn with_fingerprint(self, fingerprint: Fingerprint) -> Self

Source

fn set_headers(&mut self, headers: Header, keep_cookie: bool)

Source

fn set_headers_json(&mut self, headers: JsonValue) -> Result<(), HlsError>

Examples found in repository?
examples/m3u8_down.rs (lines 17-33)
15    fn new(index: impl ToString) -> M3u8DownEngine {
16        let mut req = ScReq::new().with_alpn(ALPN::Http20); //.with_proxy(Proxy::new_http_plain("127.0.0.1", 10809));
17        req.set_headers_json(json::object! {
18            "Host": "",
19            "sec-ch-ua-platform": "Android",
20            "user-agent": "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36",
21            "sec-ch-ua": r#""Android WebView";v="135", "Not-A.Brand";v="8", "Chromium";v="135""#,
22            "sec-ch-ua-mobile": "?1",
23            "accept": "*/*",
24            "origin": "",
25            "x-requested-with": "mark.via",
26            "sec-fetch-site": "cross-site",
27            "sec-fetch-mode": "cors",
28            "sec-fetch-dest": "empty",
29            "referer": "",
30            "accept-encoding": "gzip, deflate, br, zstd",
31            "accept-language": "en,zh-CN;q=0.9,zh;q=0.8,en-US;q=0.7",
32            "priority": "u=1, i"
33        }).unwrap();
34        M3u8DownEngine {
35            req,
36            index_url: index.to_string(),
37            sequence: 0,
38            key_url: "".to_string(),
39            ts_urls: vec![],
40            cipher: Cipher::aes_128_ecb(),
41        }
42    }
More examples
Hide additional examples
examples/sync_h1.rs (line 62)
4fn main() {
5    let mut tss = 0;
6    for i in 0..100 {
7        let t = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis();
8        // println!("{}", t);
9        // let fingerprint = Fingerprint::from_hex_all("16030106b2010006ae0303f0aed3d4d9fac0e8d4ff98981a90257765d203b4ce089c591e86d8e7ec8ab90a204803c2150a14429bfe6536328fe11cfd4034264fa2a3a443c5972eeeb93d427100206a6a130113021303c02bc02fc02cc030cca9cca8c013c014009c009d002f0035010006453a3a000000230000001b0003020002ff010001000000000e000c0000093338686d7a672e636e0005000501000000000017000044cd00050003026832fe0d00ba00000100010900208e3fc249e1ce71ff4aefb0970b38167b6b7de98537b874130ba4e284e15f1c4f00909540fc3a77fcc8f96d51ff9144785ccf114d3618d9a77b0e88f54d4dd1279083483e0ad83a4f25e55951194048709bf0842651d940c291569b9cfe1323d6fc2d31348ccaaa7b79271fc41af0975d94f7a826819154e05f6f90bdaa4e2b215894ccd36f748ded2bcae0a61aa101a7187588c2b45b51d076356d0e47728974d6d1cdd2b3ce4a8e5e8f70a79fb8f288c868000b00020100002d00020101000a000c000a3a3a11ec001d00170018001200000010000e000c02683208687474702f312e31003304ef04ed3a3a00010011ec04c05b20439ba8b50e3a5800981889512ab253cd2f1ba1488613fbd79f43813c08e34ed45330a62991a6b37890d54d2d0c089251b146acace84512c031c74ac6a2ac6345b6668629aa143357b45921916de02ac5cc8d57e1ca9882ccad900640a1b51c587de3291a2f15ad67e180b79b442fe4606de978f7a27591a41ffcd91116c50703c45531999c9d377a173c249ef747a60a81158c0d3ef709b9b5a38af61b6b5c9740c343f7322b6510a60797cb39148ba310413b688354bb0b2e395dbf3935fd0a797d7b5e94acab23a95c163238dd1bc9b8b420599a0efd4726e85a0783fc8506436c3eb89ee96008b0c9c5a2047a2415bbb5a2768d7c8d58384644d5473de96721b24a3fc82ee68cc0a3a43cc73467ec515a3ac1a79b9070f4e4aad61ac50c7b4e9b125f66cba026807cdad5a43e4a5cfa2ac521801616bb58ea068689c15afd4592b26545c3a8c638800a3429c32237a902f1a605458935391c4d352a211cb2122203f9ea38e3d44b29741502bb57c7850ffaf36ab0db72ac9c0fc0ba309661096bc550d86b442beca080c0602e02a54ed2171e58b0b82582c568a5b1407d8d35448cf907a43575aed4c5371595d1456f29778c892325d4d785a3a384a30b838e6b0d59990ca54ba52369c4faf835a2f50cbd504f7d38cdc4047bf7acae92090cf121180096a513dc4cadf290641ab6e4375aa477395b8902b74c39e62b945a09438d83b1d41ac2f204c4614425bed86e221c60c8520e1c3233e5ccb53c228c0d525fb7823d9d9c4337e36785eb61590794f9565b3dd2722a2834b536be157a307d928d7f910167a314b8705bdddc1b4c9c139a5320380910b1263b40a6c6065c84266a2c036a19d3a51f5edbb8eaf3cb1e8295ef1ab978f5306da9b11a5a3df473bbd2acca084a4c4bba0bc478630283b0e6910bde3052c6f58300703a6e9524381b4cc1b247236acc1c0bae6cb69c463c29811b04d93a589ba36d30c9b4d1fb234368a9b3e94abaf419a220af730917488bc9be585f7111c9a13a8544969bf3e397b1f2ceba0ca7f21785531a3f7856248f54a5bd854124b21e1e75c366e8b5293130bdb902db0a05e9803c3d7827d5cc26046815102c3713b4a14ef63aed3163319244995a6524dbabfaf93ed8a95e08641377683dd6b3b05084bf48f77d47904d09656d4a19b457d84bcfd77a4c433393bbb43f09931cf4896cf891990c9363202467b6193ea6b8bd493733235c93c118feb808b1d9b38cc7862c744342e2baeeec6299d0a21898aa9576ae61b2703a5b072521166f6693aa4b5e6148ad4e7c21a21a7972a0c8c3f986e95392ed2b15e51a5f2e5b90e4766320513e3bfa4d67688fb6c547147c47aa71c04095336b11b32b52a6c9d047a1357eece2688efb2045184653a480ef15a3fb8c4851d8c0407b24a87b55fd36af59b18fff38b183b6256e15c161395a46f62ce1b0af240319dec84d3aa04e2773ac289b393160683e901b2b622d615b2719b06cc12bae79fca101e737a91434c8e0828cc6a71b740216964a06a9952d9c54f24743b1b9c4fc9475554aa8a87719ccd7ae40374c87d8018937c7b6007e028b348e884d201087416396ec3237b61319e0f40e436a6a1dc75f2486a68c60c27f719d251a9d73b3de3bd91858d3f3d4043384f7ad42422b47b96bdd03b5556f8107232953dad801970157aa95971638e2908d55001d0020552cb65392fdab1ff61dd3b43c895fdf782c61bb6f05519f2b7d9e28facfd25e000d0012001004030804040105030805050108060601002b000706dada030403031a1a0001001603030046100000424104ff635373fbbfbc37444a2026372f57fd06c5205bacfe32b61261a9d29bf1fca57f91ef22cb2ba46af8cf9ae7c3123f56634099af297dcd30835cd81664005fb9140303000101").unwrap();
10        // let fingerprint = Fingerprint::from_ja3("771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513-21,29-23-24,0", "4b107bbnbc-01o-3781k7bbnbc-01v25461k").unwrap();
11        // let certs = Certificate::from_pem_file("/home/xl/1/client.crt").unwrap();
12        // let key = RsaKey::from_pri_pem_file("/home/xl/1/client.key").unwrap();
13        let mut timeout = Timeout::new();
14        timeout.set_connect(30000000);
15        timeout.set_handle(300000000);
16        timeout.set_read(99999999999);
17        timeout.set_write(99999999999);
18        timeout.set_handle_times(3);
19        let mut req = ScReq::new()
20            // .with_fingerprint(fingerprint)
21            .with_alpn(ALPN::Http20)
22            // .with_mtls(certs, key)
23            .with_verify(false)
24            .with_timeout(timeout)
25            // .with_proxy(Proxy::new_http_plain("127.0.0.1", 10280))
26            ;
27        let headers = json::object! {
28            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
29            "Accept": "*/*",
30            "Sec-Fetch-Site": "none",
31            "Sec-Fetch-Mode": "navigate",
32            "Sec-Fetch-Dest": "document",
33            "sec-fetch-user":"?1",
34            "upgrade-insecure-requests":"1",
35            "sec-ch-ua": "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Microsoft Edge\";v=\"120\"",
36            "sec-ch-ua-mobile": "?0",
37            "sec-ch-ua-platform": "\"Windows\"",
38            "Accept-Language": "zh-CN,zh;q=0.9",
39            "Accept-Encoding": "gzip,deflate,br,zstd",
40            "Cache-Control": "no-cache",
41            "Connection": "keep-alive",
42
43        };
44        // req.set_url("https://zhifazhe.top").unwrap();
45        // req.set_url("http://3434.characlink.com").unwrap();
46        // req.set_url("https://m.so.com").unwrap();
47        req.set_proxy(Proxy::new_socks5("34.124.190.108", 8080));
48        // println!("{}", et - t);
49        // req.set_url("https://ms.xllgl.top").unwrap();
50        req.set_url("https://www.baidu.com").unwrap();
51
52        // req.set_url("https://jetstar.com").unwrap();
53        // let et = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis();
54        // println!("{}", et - t);
55        // req.set_url("https://cn.bing.com/search?q=site%EF%BC%9Aqq.com&first=150&FORM=PERE2").unwrap();
56        // req.set_url("https://accounts.pcid.ca/login").unwrap();
57        // req.set_url("https://ccppdd.zzzzzzyyyyy.shop/api/v1/client/s9FkyFPBngt80pFn1?token=a0cedb7c6645280ec2402db62d550a17").unwrap();
58        // req.set_url("https://www.link114.cn/").unwrap();
59        // req.set_url("https://127.0.0.1:8000").unwrap();
60        // req.set_url("http://zwfw.hubei.gov.cn/web/user/uias_login.do?appCode=hbzwfw&gotoUrl=http%3A%2F%2Fzwfw.hubei.gov.cn%2Fwebview%2Fgrkj%2Fwelcome.html&p01=").unwrap();
61        req.set_auto_redirect(true);
62        req.set_headers_json(headers).unwrap();
63        // println!("6");
64        let res = req.get().unwrap();
65        let et = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis();
66        tss += et - t;
67        println!("{}", et - t);
68        // res.text().unwrap();
69        // println!("{}", res.header());
70        // println!("{}", res.text().unwrap().len());
71        // for _ in 0..50 {
72        //     let resp = req.get().unwrap();
73        //     // let body = res.decode_body().unwrap().as_string().unwrap();
74        //     // println!("{}", resp.header().status());
75        //     // println!("{}", resp.text().unwrap().len());
76        //     let et = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis();
77        //     println!("{}", et - t);
78        // }
79
80
81        // break;
82    }
83    println!("{}", tss / 100);
84}
Source

fn with_header_json(self, data: JsonValue) -> Result<Self, HlsError>

Source

fn insert_header( &mut self, k: impl AsRef<str>, v: impl ToString, ) -> Result<(), HlsError>

Source

fn remove_header(&mut self, k: impl AsRef<str>) -> Option<HeaderValue>

Source

fn set_params(&mut self, params: JsonValue)

Source

fn add_param(&mut self, name: impl ToString, value: impl ToString)

Source

fn remove_param(&mut self, name: impl ToString) -> Option<String>

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§