From 308a945283891c80e31efb8f584ed362c9169068 Mon Sep 17 00:00:00 2001 From: asonix Date: Sun, 14 Apr 2024 20:54:01 -0500 Subject: [PATCH] Start upgrading to http1 --- Cargo.lock | 193 +++++++++++++++++++++++++++++++++++++------- Cargo.toml | 10 +-- src/admin/client.rs | 11 ++- src/extractors.rs | 4 + src/http1.rs | 18 +++++ src/main.rs | 1 + src/requests.rs | 6 +- src/routes/media.rs | 7 +- 8 files changed, 207 insertions(+), 43 deletions(-) create mode 100644 src/http1.rs diff --git a/Cargo.lock b/Cargo.lock index 336b5a5..95f60cf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -416,7 +416,7 @@ dependencies = [ "pin-project-lite", "quanta", "rand", - "reqwest", + "reqwest 0.12.5", "reqwest-middleware", "reqwest-tracing", "ring", @@ -534,14 +534,14 @@ dependencies = [ "http-body 0.4.6", "hyper 0.14.30", "itoa", - "matchit", + "matchit 0.7.3", "memchr", "mime", "percent-encoding", "pin-project-lite", "rustversion", "serde", - "sync_wrapper", + "sync_wrapper 0.1.2", "tower", "tower-layer", "tower-service", @@ -1718,15 +1718,15 @@ dependencies = [ [[package]] name = "http-signature-normalization-reqwest" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86048ef6b1d59bcb2cdde0100bb16b1a29ce78ab6dd4a90706ba0791a2831b5a" +checksum = "b8822f7eab343cae1ce3bd3b6d0b9b58c72adaf3463627cfe150f8f5406f27aa" dependencies = [ "async-trait", - "base64 0.21.7", + "base64 0.22.1", "http-signature-normalization", "httpdate", - "reqwest", + "reqwest 0.12.5", "reqwest-middleware", "ring", "thiserror", @@ -1809,6 +1809,24 @@ dependencies = [ "tokio-rustls 0.24.1", ] +[[package]] +name = "hyper-rustls" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.4.1", + "hyper-util", + "rustls 0.23.11", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.0", + "tower-service", + "webpki-roots 0.26.3", +] + [[package]] name = "hyper-timeout" version = "0.4.1" @@ -2141,6 +2159,12 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "matchit" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3c2fcf089c060eb333302d80c5f3ffa8297abecf220f788e4a09ef85f59420" + [[package]] name = "md5" version = "0.7.0" @@ -2923,6 +2947,53 @@ dependencies = [ "winapi", ] +[[package]] +name = "quinn" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.11", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" +dependencies = [ + "bytes", + "rand", + "ring", + "rustc-hash", + "rustls 0.23.11", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46" +dependencies = [ + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "quote" version = "1.0.36" @@ -3108,7 +3179,7 @@ dependencies = [ "http 0.2.12", "http-body 0.4.6", "hyper 0.14.30", - "hyper-rustls", + "hyper-rustls 0.24.2", "ipnet", "js-sys", "log", @@ -3122,7 +3193,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "system-configuration", "tokio", "tokio-rustls 0.24.1", @@ -3133,38 +3204,82 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots", - "winreg", + "webpki-roots 0.25.4", + "winreg 0.50.0", +] + +[[package]] +name = "reqwest" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.4.1", + "hyper-rustls 0.27.2", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.11", + "rustls-pemfile 2.1.2", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.1", + "tokio", + "tokio-rustls 0.26.0", + "tokio-util", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots 0.26.3", + "winreg 0.52.0", ] [[package]] name = "reqwest-middleware" -version = "0.2.5" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a735987236a8e238bf0296c7e351b999c188ccc11477f311b82b55c93984216" +checksum = "39346a33ddfe6be00cbc17a34ce996818b97b230b87229f10114693becca1268" dependencies = [ "anyhow", "async-trait", - "http 0.2.12", - "reqwest", + "http 1.1.0", + "reqwest 0.12.5", "serde", - "task-local-extensions", "thiserror", + "tower-service", ] [[package]] name = "reqwest-tracing" -version = "0.4.8" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190838e54153d7a7e2ea98851304b3ce92daeabf14c54d32b01b84a3e636f683" +checksum = "71a37668dccbd75e045f26811891dd939f28c38d3b7ca572a4fce4bc462b83ec" dependencies = [ "anyhow", "async-trait", "getrandom", - "matchit", - "reqwest", + "http 1.1.0", + "matchit 0.8.3", + "reqwest 0.12.5", "reqwest-middleware", - "task-local-extensions", "tracing", ] @@ -3695,6 +3810,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" + [[package]] name = "system-configuration" version = "0.5.1" @@ -3734,15 +3855,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" -[[package]] -name = "task-local-extensions" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba323866e5d033818e3240feeb9f7db2c4296674e4d9e16b97b7bf8f490434e8" -dependencies = [ - "pin-utils", -] - [[package]] name = "teloxide" version = "0.12.2" @@ -3787,7 +3899,7 @@ dependencies = [ "once_cell", "pin-project", "rc-box", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "serde_with_macros", @@ -4411,6 +4523,15 @@ version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +[[package]] +name = "webpki-roots" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "winapi" version = "0.3.9" @@ -4620,6 +4741,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "wyz" version = "0.5.1" diff --git a/Cargo.toml b/Cargo.toml index 9859e53..da316d3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,9 +54,9 @@ pin-project-lite = "0.2.9" # pinned to metrics-util quanta = "0.12.0" rand = "0.8" -reqwest = { version = "0.11", default-features = false, features = ["rustls-tls", "stream"] } -reqwest-middleware = "0.2" -reqwest-tracing = "0.4.5" +reqwest = { version = "0.12", default-features = false, features = ["rustls-tls", "stream"]} +reqwest-middleware = { version = "0.3", default-features = false, features = ["json"] } +reqwest-tracing = "0.5.0" ring = "0.17.5" rsa = "0.9" rsa-magic-public-key = "0.8.0" @@ -92,12 +92,12 @@ default-features = false features = ["error-logging", "metrics", "tokio"] [dependencies.http-signature-normalization-actix] -version = "0.11.0" +version = "0.11.1" default-features = false features = ["server", "ring"] [dependencies.http-signature-normalization-reqwest] -version = "0.11.0" +version = "0.12.0" default-features = false features = ["middleware", "ring"] diff --git a/src/admin/client.rs b/src/admin/client.rs index 88151e1..af61e1e 100644 --- a/src/admin/client.rs +++ b/src/admin/client.rs @@ -5,7 +5,6 @@ use crate::{ error::{Error, ErrorKind}, extractors::XApiToken, }; -use actix_web::http::header::Header; use reqwest_middleware::ClientWithMiddleware; use serde::de::DeserializeOwned; @@ -87,13 +86,17 @@ async fn get_results( let res = client .get(iri.as_str()) - .header(XApiToken::name(), x_api_token.to_string()) + .header(XApiToken::http1_name(), x_api_token.to_string()) .send() .await .map_err(|e| ErrorKind::SendRequest(iri.to_string(), e.to_string()))?; if !res.status().is_success() { - return Err(ErrorKind::Status(iri.to_string(), res.status()).into()); + return Err(ErrorKind::Status( + iri.to_string(), + crate::http1::status_to_http02(res.status()), + ) + .into()); } let t = res @@ -116,7 +119,7 @@ async fn post_domains( let res = client .post(iri.as_str()) - .header(XApiToken::name(), x_api_token.to_string()) + .header(XApiToken::http1_name(), x_api_token.to_string()) .json(&Domains { domains }) .send() .await diff --git a/src/extractors.rs b/src/extractors.rs index d179906..4545199 100644 --- a/src/extractors.rs +++ b/src/extractors.rs @@ -163,6 +163,10 @@ impl XApiToken { pub(crate) fn new(token: String) -> Self { Self(token) } + + pub(crate) const fn http1_name() -> reqwest::header::HeaderName { + reqwest::header::HeaderName::from_static("x-api-token") + } } impl Header for XApiToken { diff --git a/src/http1.rs b/src/http1.rs new file mode 100644 index 0000000..510c830 --- /dev/null +++ b/src/http1.rs @@ -0,0 +1,18 @@ +pub(crate) fn name_to_http02( + name: &reqwest::header::HeaderName, +) -> actix_web::http::header::HeaderName { + actix_web::http::header::HeaderName::from_bytes(name.as_ref()) + .expect("headername conversions always work") +} + +pub(crate) fn value_to_http02( + value: &reqwest::header::HeaderValue, +) -> actix_web::http::header::HeaderValue { + actix_web::http::header::HeaderValue::from_bytes(value.as_bytes()) + .expect("headervalue conversions always work") +} + +pub(crate) fn status_to_http02(status: reqwest::StatusCode) -> actix_web::http::StatusCode { + actix_web::http::StatusCode::from_u16(status.as_u16()) + .expect("statuscode conversions always work") +} diff --git a/src/main.rs b/src/main.rs index 44c53ec..e3fdddb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -33,6 +33,7 @@ mod db; mod error; mod extractors; mod future; +mod http1; mod jobs; mod middleware; mod requests; diff --git a/src/requests.rs b/src/requests.rs index 63faa3c..f9f122b 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -233,7 +233,11 @@ impl Requests { } } - return Err(ErrorKind::Status(parsed_url.to_string(), status).into()); + return Err(ErrorKind::Status( + parsed_url.to_string(), + crate::http1::status_to_http02(status), + ) + .into()); } // only actually succeed a breaker on 2xx response diff --git a/src/routes/media.rs b/src/routes/media.rs index 686ab22..f2758bb 100644 --- a/src/routes/media.rs +++ b/src/routes/media.rs @@ -23,10 +23,13 @@ pub(crate) async fn route( .fetch_response(&url, BreakerStrategy::Allow404AndBelow) .await?; - let mut response = HttpResponse::build(res.status()); + let mut response = HttpResponse::build(crate::http1::status_to_http02(res.status())); for (name, value) in res.headers().iter().filter(|(h, _)| *h != "connection") { - response.insert_header((name.clone(), value.clone())); + response.insert_header(( + crate::http1::name_to_http02(name), + crate::http1::value_to_http02(value), + )); } return Ok(response.body(BodyStream::new(limit_stream(