feat: update fetch-rs

This commit is contained in:
2023-06-11 22:21:29 +08:00
parent 38b8fbe37f
commit 49fefb745c
3 changed files with 165 additions and 3 deletions

View File

@@ -1,12 +1,46 @@
use std::str::FromStr;
use std::time::Duration;
use reqwest::{Method, Proxy, Url};
use reqwest::{Certificate, Method, Proxy, Url};
use reqwest::blocking::{Body, Client, Request};
use reqwest::header::{HeaderName, HeaderValue};
use rust_util::{simple_error, XResult};
const TEST_CERT: &str = r#"-----BEGIN CERTIFICATE-----
MIIDeTCCAmGgAwIBAgIJAKL5ZETgtiFQMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1TYW4gRnJhbmNp
c2NvMQ8wDQYDVQQKDAZCYWRTU0wxFTATBgNVBAMMDCouYmFkc3NsLmNvbTAeFw0y
MzA0MjQwMDAxNDVaFw0yNTA0MjMwMDAxNDVaMGIxCzAJBgNVBAYTAlVTMRMwEQYD
VQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2NvMQ8wDQYDVQQK
DAZCYWRTU0wxFTATBgNVBAMMDCouYmFkc3NsLmNvbTCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBAMIE7PiM7gTCs9hQ1XBYzJMY61yoaEmwIrX5lZ6xKyx2
PmzAS2BMTOqytMAPgLaw+XLJhgL5XEFdEyt/ccRLvOmULlA3pmccYYz2QULFRtMW
hyefdOsKnRFSJiFzbIRMeVXk0WvoBj1IFVKtsyjbqv9u/2CVSndrOfEk0TG23U3A
xPxTuW1CrbV8/q71FdIzSOciccfCFHpsKOo3St/qbLVytH5aohbcabFXRNsKEqve
ww9HdFxBIuGa+RuT5q0iBikusbpJHAwnnqP7i/dAcgCskgjZjFeEU4EFy+b+a1SY
QCeFxxC7c3DvaRhBB0VVfPlkPz0sw6l865MaTIbRyoUCAwEAAaMyMDAwCQYDVR0T
BAIwADAjBgNVHREEHDAaggwqLmJhZHNzbC5jb22CCmJhZHNzbC5jb20wDQYJKoZI
hvcNAQELBQADggEBAJqRSkgOf5GHCJzljWQg9D+1LEuByYyQfNzGJb+TZkPpxNEw
6gbt3vbQfWBx9WQ6995XjdjM6N6l5DO8p0Sp70OHHQ9Lt2N7PC7I5YhJFObkMyza
sRuLWTzlYShLvSRGQFC/Ky4hTbpzlZA5TADG1weajSlIBLo6UGkQaGk4xG4zhIKA
PhvsFZsayLexJ1DCql0XAiNnknTfX8FRMI9Ezsj0XeZ8ZD8ouLGYwbTezcYnE/uI
0Y/ayROwdd+Ny4N6McsEE+KOxS8Xe+LU4X3MEHSXcmT8ht/xTyxQ2JjzHtS6eHjO
lJON+7kLWv6kgtYf9jHJDsNMPLis6RbUYdkeP5A=
-----END CERTIFICATE-----"#;
fn main() -> XResult<()> {
let _ = print_response(&fetch(
"https://self-signed.badssl.com/",
&FetchOptions {
trust_all_certificates: false,
certificates: vec![TEST_CERT.into()],
..Default::default()
},
)?);
Ok(())
}
fn main2() -> XResult<()> {
println!("TEST1: GET");
let response = fetch(
"https://hatter.ink/util/print_request.action",
@@ -90,6 +124,8 @@ pub struct FetchOptions {
pub proxy: Option<String>,
// TODO hsts supports
// TODO follow redirects?
pub certificates: Vec<String>,
pub trust_all_certificates: bool,
}
impl FetchOptions {}
@@ -124,7 +160,18 @@ pub fn fetch(url: &str, option: &FetchOptions) -> XResult<FetchResponse> {
if let Some(proxy) = &option.proxy {
client_builder = client_builder.proxy(Proxy::all(proxy.as_str())?);
}
// TODO client_builder.add_root_certificate()
if option.trust_all_certificates {
client_builder = client_builder.danger_accept_invalid_certs(true);
}
if !option.certificates.is_empty() {
client_builder = client_builder.use_rustls_tls();
for cert in &option.certificates {
match Certificate::from_pem(cert.as_bytes()) {
Ok(cert) => client_builder = client_builder.add_root_certificate(cert),
Err(e) => return simple_error!("Parse certificate failed: {}", e),
}
}
}
let client = client_builder.build()?;
let method = match option.method {
FetchMethod::Get => Method::GET,