From 4019e6ac908737251a69bb809bf6deecff4a948c Mon Sep 17 00:00:00 2001 From: elizabeth Date: Wed, 22 Oct 2025 15:30:47 -0400 Subject: [PATCH 1/3] fix unreachable_pub --- Cargo.toml | 9 +++++++++ crates/rproxy/Cargo.toml | 3 +++ crates/rproxy/src/config.rs | 2 +- crates/rproxy/src/jrpc/jrpc_request.rs | 3 ++- crates/rproxy/src/server/proxy.rs | 2 +- crates/rproxy/src/server/proxy/http/proxy.rs | 4 ++-- crates/rproxy/src/utils/utils_compression.rs | 2 +- crates/rproxy/src/utils/utils_http.rs | 2 +- crates/rproxy/src/utils/utils_op_stack.rs | 2 +- 9 files changed, 21 insertions(+), 8 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d825a03..74148d6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,3 +6,12 @@ default-members = ["crates/rproxy"] members = [ "crates/rproxy", ] + +[workspace.lints.rust] +unreachable_pub = "deny" + +[workspace.lints.clippy] +match_same_arms = "warn" +unused_async = "warn" +uninlined_format_args = "warn" +manual_let_else = "warn" diff --git a/crates/rproxy/Cargo.toml b/crates/rproxy/Cargo.toml index a6aa97d..6abb033 100644 --- a/crates/rproxy/Cargo.toml +++ b/crates/rproxy/Cargo.toml @@ -8,6 +8,9 @@ default-run = "rproxy" name = "rproxy" path = "src/bin/main.rs" +[lints] +workspace = true + [dependencies] actix = "0.13.5" actix-http = { version = "3.11.1", features = ["ws"] } diff --git a/crates/rproxy/src/config.rs b/crates/rproxy/src/config.rs index 32ee416..0a116aa 100644 --- a/crates/rproxy/src/config.rs +++ b/crates/rproxy/src/config.rs @@ -4,7 +4,7 @@ use clap::Parser; use thiserror::Error; use crate::server::{ - config::{ConfigLoggingError, ConfigLogging, ConfigMetrics, ConfigMetricsError}, + config::{ConfigLogging, ConfigLoggingError, ConfigMetrics, ConfigMetricsError}, proxy::config::{ ConfigAuthrpc, ConfigAuthrpcError, diff --git a/crates/rproxy/src/jrpc/jrpc_request.rs b/crates/rproxy/src/jrpc/jrpc_request.rs index 2523e96..fba69a7 100644 --- a/crates/rproxy/src/jrpc/jrpc_request.rs +++ b/crates/rproxy/src/jrpc/jrpc_request.rs @@ -1,6 +1,7 @@ -use serde::Deserialize; use std::borrow::Cow; +use serde::Deserialize; + // JrpcRequestMeta ----------------------------------------------------- const JRPC_METHOD_FCUV1_WITH_PAYLOAD: Cow<'static, str> = diff --git a/crates/rproxy/src/server/proxy.rs b/crates/rproxy/src/server/proxy.rs index b1fb68b..0fb9ae4 100644 --- a/crates/rproxy/src/server/proxy.rs +++ b/crates/rproxy/src/server/proxy.rs @@ -95,7 +95,7 @@ pub(crate) trait ProxyInner: 'static { // ProxyConnectionGuard ------------------------------------------------ -pub struct ProxyConnectionGuard { +pub(crate) struct ProxyConnectionGuard { pub id: Uuid, pub remote_addr: Option, pub local_addr: Option, diff --git a/crates/rproxy/src/server/proxy/http/proxy.rs b/crates/rproxy/src/server/proxy/http/proxy.rs index f491d40..3b3f024 100644 --- a/crates/rproxy/src/server/proxy/http/proxy.rs +++ b/crates/rproxy/src/server/proxy/http/proxy.rs @@ -1187,12 +1187,12 @@ impl ProxyHttpRequestInfo { } #[inline] - pub fn path_and_query(&self) -> &str { + pub(crate) fn path_and_query(&self) -> &str { &self.path_and_query } #[inline] - pub fn remote_addr(&self) -> &Option { + pub(crate) fn remote_addr(&self) -> &Option { &self.remote_addr } } diff --git a/crates/rproxy/src/utils/utils_compression.rs b/crates/rproxy/src/utils/utils_compression.rs index 56cdc49..6a21151 100644 --- a/crates/rproxy/src/utils/utils_compression.rs +++ b/crates/rproxy/src/utils/utils_compression.rs @@ -4,7 +4,7 @@ use bytes::Bytes; // decompress ---------------------------------------------------------- -pub fn decompress(body: Bytes, size: usize, content_encoding: String) -> (Bytes, usize) { +pub(crate) fn decompress(body: Bytes, size: usize, content_encoding: String) -> (Bytes, usize) { match content_encoding.to_ascii_lowercase().as_str() { "br" => { let mut decoder = brotli::Decompressor::new(std::io::Cursor::new(body.clone()), 4096); diff --git a/crates/rproxy/src/utils/utils_http.rs b/crates/rproxy/src/utils/utils_http.rs index 7c6a3ed..746c289 100644 --- a/crates/rproxy/src/utils/utils_http.rs +++ b/crates/rproxy/src/utils/utils_http.rs @@ -1,5 +1,5 @@ // is_hop_by_hop_header ------------------------------------------------ -pub fn is_hop_by_hop_header(name: &actix_web::http::header::HeaderName) -> bool { +pub(crate) fn is_hop_by_hop_header(name: &actix_web::http::header::HeaderName) -> bool { matches!(name.as_str().to_ascii_lowercase().as_str(), "connection" | "host" | "keep-alive") } diff --git a/crates/rproxy/src/utils/utils_op_stack.rs b/crates/rproxy/src/utils/utils_op_stack.rs index 70a9ba5..5c4f237 100644 --- a/crates/rproxy/src/utils/utils_op_stack.rs +++ b/crates/rproxy/src/utils/utils_op_stack.rs @@ -3,7 +3,7 @@ use hex::FromHex; // raw_transaction_to_hash --------------------------------------------- -pub fn raw_transaction_to_hash(transaction: &mut serde_json::Value) { +pub(crate) fn raw_transaction_to_hash(transaction: &mut serde_json::Value) { let hex = match transaction.as_str() { Some(hex) => hex, None => return, From 99f9c4b62f4d33eb24a30c266cc4d4873cee50ec Mon Sep 17 00:00:00 2001 From: elizabeth Date: Wed, 22 Oct 2025 16:11:07 -0400 Subject: [PATCH 2/3] clippy --- crates/rproxy/src/config.rs | 2 +- crates/rproxy/src/server/metrics.rs | 1 + .../rproxy/src/server/proxy/config/authrpc.rs | 4 +- crates/rproxy/src/server/proxy/config/rpc.rs | 4 +- crates/rproxy/src/server/proxy/http/proxy.rs | 73 +++++-------------- crates/rproxy/src/server/proxy/ws/proxy.rs | 6 +- crates/rproxy/src/utils/utils_loggable.rs | 7 +- crates/rproxy/src/utils/utils_op_stack.rs | 15 ++-- 8 files changed, 36 insertions(+), 76 deletions(-) diff --git a/crates/rproxy/src/config.rs b/crates/rproxy/src/config.rs index 0a116aa..7933bcd 100644 --- a/crates/rproxy/src/config.rs +++ b/crates/rproxy/src/config.rs @@ -59,7 +59,7 @@ impl Config { if let Some(errs) = res.clone().validate() { for err in errs.iter() { - eprintln!("fatal: {}", err); + eprintln!("fatal: {err}"); } process::exit(1); }; diff --git a/crates/rproxy/src/server/metrics.rs b/crates/rproxy/src/server/metrics.rs index c2fdca8..01303be 100644 --- a/crates/rproxy/src/server/metrics.rs +++ b/crates/rproxy/src/server/metrics.rs @@ -342,6 +342,7 @@ impl Metrics { Ok(socket.into()) } + #[expect(clippy::unused_async, reason = "required by the actix framework")] async fn receive( req: HttpRequest, _: web::Payload, diff --git a/crates/rproxy/src/server/proxy/config/authrpc.rs b/crates/rproxy/src/server/proxy/config/authrpc.rs index 9800d5d..f136798 100644 --- a/crates/rproxy/src/server/proxy/config/authrpc.rs +++ b/crates/rproxy/src/server/proxy/config/authrpc.rs @@ -223,7 +223,7 @@ impl ConfigAuthrpc { let backend_url = Url::parse(&self.backend_url.clone()).expect(ALREADY_VALIDATED); let backend_host = backend_url.host_str().expect(ALREADY_VALIDATED); - let backend_ips: Vec = match format!("{}:0", backend_host).to_socket_addrs() { + let backend_ips: Vec = match format!("{backend_host}:0").to_socket_addrs() { Ok(res) => res, Err(err) => { warn!(host = backend_host, error = ?err, "Failed to resolve backend host"); @@ -249,7 +249,7 @@ impl ConfigAuthrpc { return false; } - let peer_ips: Vec = match format!("{}:0", peer_host).to_socket_addrs() { + let peer_ips: Vec = match format!("{peer_host}:0").to_socket_addrs() { Ok(res) => res, Err(err) => { warn!(host = peer_host, error = ?err, "Failed to resolve peer host"); diff --git a/crates/rproxy/src/server/proxy/config/rpc.rs b/crates/rproxy/src/server/proxy/config/rpc.rs index 3f7a1e9..618490d 100644 --- a/crates/rproxy/src/server/proxy/config/rpc.rs +++ b/crates/rproxy/src/server/proxy/config/rpc.rs @@ -229,7 +229,7 @@ impl ConfigRpc { let backend_url = Url::parse(&self.backend_url.clone()).expect(ALREADY_VALIDATED); let backend_host = backend_url.host_str().expect(ALREADY_VALIDATED); - let backend_ips: Vec = match format!("{}:0", backend_host).to_socket_addrs() { + let backend_ips: Vec = match format!("{backend_host}:0").to_socket_addrs() { Ok(res) => res, Err(err) => { warn!(host = backend_host, error = ?err, "Failed to resolve backend host"); @@ -255,7 +255,7 @@ impl ConfigRpc { return false; } - let peer_ips: Vec = match format!("{}:0", peer_host).to_socket_addrs() { + let peer_ips: Vec = match format!("{peer_host}:0").to_socket_addrs() { Ok(res) => res, Err(err) => { warn!(host = peer_host, error = ?err, "Failed to resolve peer host"); diff --git a/crates/rproxy/src/server/proxy/http/proxy.rs b/crates/rproxy/src/server/proxy/http/proxy.rs index 3b3f024..63e8588 100644 --- a/crates/rproxy/src/server/proxy/http/proxy.rs +++ b/crates/rproxy/src/server/proxy/http/proxy.rs @@ -338,7 +338,7 @@ where .http_proxy_failure_count .get_or_create(&LabelsProxy { proxy: P::name() }) .inc(); - return Ok(HttpResponse::BadGateway().body(format!("Backend error: {:?}", err))); + return Ok(HttpResponse::BadGateway().body(format!("Backend error: {err:?}"))); } }; @@ -374,9 +374,7 @@ where } fn postprocess_backend_response(&self, bck_res: ProxiedHttpResponse) { - let cli_req = match self.requests.remove_sync(&bck_res.info.id) { - Some((_, req)) => req, - None => { + let Some((_, cli_req)) = self.requests.remove_sync(&bck_res.info.id) else { error!( proxy = P::name(), request_id = %bck_res.info.id, @@ -384,8 +382,7 @@ where "Proxied http response for unmatching request", ); return; - } - }; + }; // hand over to postprocessor asynchronously so that we can return the // response to the client as early as possible @@ -584,10 +581,7 @@ where return; } - let message = match message.as_object_mut() { - Some(message) => message, - None => return, - }; + let Some(message) = message.as_object_mut() else { return }; let method = (match message.get_key_value("method") { Some((_, method)) => method.as_str(), @@ -599,15 +593,11 @@ where if !method.is_empty() { // single-shot request - let params = match match message.get_mut("params") { + let Some(params) = match message.get_mut("params") { Some(params) => params, None => return, } - .as_array_mut() - { - Some(params) => params, - None => return, - }; + .as_array_mut() else { return }; match method.as_str() { "engine_forkchoiceUpdatedV3" => { @@ -615,20 +605,13 @@ where return; } - let execution_payload = match params[1].as_object_mut() { - Some(execution_payload) => execution_payload, - None => return, - }; + let Some(execution_payload) = params[1].as_object_mut() else { return }; - let transactions = match match execution_payload.get_mut("transactions") { + let Some(transactions) = match execution_payload.get_mut("transactions") { Some(transactions) => transactions, None => return, } - .as_array_mut() - { - Some(transactions) => transactions, - None => return, - }; + .as_array_mut() else { return }; for transaction in transactions { raw_transaction_to_hash(transaction); @@ -640,20 +623,13 @@ where return; } - let execution_payload = match params[0].as_object_mut() { - Some(execution_payload) => execution_payload, - None => return, - }; + let Some(execution_payload) = params[0].as_object_mut() else { return }; - let transactions = match match execution_payload.get_mut("transactions") { + let Some(transactions) = match execution_payload.get_mut("transactions") { Some(transactions) => transactions, None => return, } - .as_array_mut() - { - Some(transactions) => transactions, - None => return, - }; + .as_array_mut() else { return }; for transaction in transactions { raw_transaction_to_hash(transaction); @@ -665,20 +641,13 @@ where return; } - let execution_payload = match params[0].as_object_mut() { - Some(execution_payload) => execution_payload, - None => return, - }; + let Some(execution_payload) = params[0].as_object_mut() else { return }; - let transactions = match match execution_payload.get_mut("txs") { + let Some(transactions) = match execution_payload.get_mut("txs") { Some(transactions) => transactions, None => return, } - .as_array_mut() - { - Some(transactions) => transactions, - None => return, - }; + .as_array_mut() else { return }; for transaction in transactions { raw_transaction_to_hash(transaction); @@ -697,13 +666,10 @@ where } } - let result = match match message.get_mut("result") { + let Some(result) = (match message.get_mut("result") { Some(result) => result.as_object_mut(), None => return, - } { - Some(result) => result, - None => return, - }; + }) else { return }; if let Some(execution_payload) = result.get_mut("executionPayload") && let Some(transactions) = execution_payload.get_mut("transactions") && @@ -1022,8 +988,7 @@ where Ok(mrr_res_body) => { let size = match mrr_res_body.size() { BodySize::Sized(size) => size, // Body is always sized - BodySize::None => 0, - BodySize::Stream => 0, + BodySize::None | BodySize::Stream => 0, }; let info = ProxyHttpResponseInfo::new( cli_req.info.id, @@ -1152,7 +1117,7 @@ impl ProxyHttpRequestInfo { let path_and_query = match req.query_string() { "" => path.clone(), - val => format!("{}?{}", path, val), + val => format!("{path}?{val}"), }; Self { diff --git a/crates/rproxy/src/server/proxy/ws/proxy.rs b/crates/rproxy/src/server/proxy/ws/proxy.rs index cea8955..a2b2698 100644 --- a/crates/rproxy/src/server/proxy/ws/proxy.rs +++ b/crates/rproxy/src/server/proxy/ws/proxy.rs @@ -242,6 +242,7 @@ where Ok(socket.into()) } + #[expect(clippy::unused_async, reason = "required by the actix framework")] async fn receive( cli_req: HttpRequest, cli_req_body: web::Payload, @@ -1303,10 +1304,7 @@ impl ProxyWsPing { let id = Uuid::from_u128(bytes.get_u128()); let connection_id = Uuid::from_u128(bytes.get_u128()); - let timestamp = match UtcDateTime::from_unix_timestamp_nanos(bytes.get_i128()) { - Ok(timestamp) => timestamp, - Err(_) => return None, - }; + let Ok(timestamp) = UtcDateTime::from_unix_timestamp_nanos(bytes.get_i128()) else { return None }; Some(Self { id, connection_id, timestamp }) } diff --git a/crates/rproxy/src/utils/utils_loggable.rs b/crates/rproxy/src/utils/utils_loggable.rs index f41ba4f..cb4874d 100644 --- a/crates/rproxy/src/utils/utils_loggable.rs +++ b/crates/rproxy/src/utils/utils_loggable.rs @@ -28,11 +28,10 @@ impl valuable::Valuable for Loggable<'_> { fn visit(&self, visitor: &mut dyn valuable::Visit) { match &self.0 { - serde_json::Value::Null => visitor.visit_value(self.as_value()), - serde_json::Value::Bool(_) => visitor.visit_value(self.as_value()), - serde_json::Value::String(_) => visitor.visit_value(self.as_value()), + serde_json::Value::Null | + serde_json::Value::Bool(_) | + serde_json::Value::String(_) | serde_json::Value::Number(_) => visitor.visit_value(self.as_value()), - serde_json::Value::Array(list) => { for val in list { visitor.visit_value(Self(val).as_value()); diff --git a/crates/rproxy/src/utils/utils_op_stack.rs b/crates/rproxy/src/utils/utils_op_stack.rs index 5c4f237..8cf53f2 100644 --- a/crates/rproxy/src/utils/utils_op_stack.rs +++ b/crates/rproxy/src/utils/utils_op_stack.rs @@ -4,19 +4,16 @@ use hex::FromHex; // raw_transaction_to_hash --------------------------------------------- pub(crate) fn raw_transaction_to_hash(transaction: &mut serde_json::Value) { - let hex = match transaction.as_str() { - Some(hex) => hex, - None => return, + let Some(hex) = transaction.as_str() else { + return; }; let hex = hex.strip_prefix("0x").unwrap_or(hex); - let bytes = match Vec::from_hex(hex) { - Ok(bytes) => bytes, - Err(_) => return, + let Ok(bytes) = Vec::from_hex(hex) else { + return; }; let mut buf = bytes.as_slice(); - let envelope = match op_alloy_consensus::OpTxEnvelope::decode(&mut buf) { - Ok(envelope) => envelope, - Err(_) => return, + let Ok(envelope) = op_alloy_consensus::OpTxEnvelope::decode(&mut buf) else { + return; }; let hash = envelope.hash().to_string(); *transaction = serde_json::Value::String(hash); From 8ec7e87affb7e0ebafad50774c8eab8879b704a7 Mon Sep 17 00:00:00 2001 From: Anton Bronnikov Date: Thu, 23 Oct 2025 09:14:21 +0200 Subject: [PATCH 3/3] chore: run cargo fmt --- crates/rproxy/src/server/proxy/http/proxy.rs | 36 +++++++++++++------- crates/rproxy/src/server/proxy/ws/proxy.rs | 4 ++- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/crates/rproxy/src/server/proxy/http/proxy.rs b/crates/rproxy/src/server/proxy/http/proxy.rs index 63e8588..6b51b97 100644 --- a/crates/rproxy/src/server/proxy/http/proxy.rs +++ b/crates/rproxy/src/server/proxy/http/proxy.rs @@ -375,14 +375,14 @@ where fn postprocess_backend_response(&self, bck_res: ProxiedHttpResponse) { let Some((_, cli_req)) = self.requests.remove_sync(&bck_res.info.id) else { - error!( - proxy = P::name(), - request_id = %bck_res.info.id, - worker_id = %self.id, - "Proxied http response for unmatching request", - ); - return; - }; + error!( + proxy = P::name(), + request_id = %bck_res.info.id, + worker_id = %self.id, + "Proxied http response for unmatching request", + ); + return; + }; // hand over to postprocessor asynchronously so that we can return the // response to the client as early as possible @@ -597,7 +597,9 @@ where Some(params) => params, None => return, } - .as_array_mut() else { return }; + .as_array_mut() else { + return + }; match method.as_str() { "engine_forkchoiceUpdatedV3" => { @@ -611,7 +613,9 @@ where Some(transactions) => transactions, None => return, } - .as_array_mut() else { return }; + .as_array_mut() else { + return + }; for transaction in transactions { raw_transaction_to_hash(transaction); @@ -629,7 +633,9 @@ where Some(transactions) => transactions, None => return, } - .as_array_mut() else { return }; + .as_array_mut() else { + return + }; for transaction in transactions { raw_transaction_to_hash(transaction); @@ -647,7 +653,9 @@ where Some(transactions) => transactions, None => return, } - .as_array_mut() else { return }; + .as_array_mut() else { + return + }; for transaction in transactions { raw_transaction_to_hash(transaction); @@ -669,7 +677,9 @@ where let Some(result) = (match message.get_mut("result") { Some(result) => result.as_object_mut(), None => return, - }) else { return }; + }) else { + return + }; if let Some(execution_payload) = result.get_mut("executionPayload") && let Some(transactions) = execution_payload.get_mut("transactions") && diff --git a/crates/rproxy/src/server/proxy/ws/proxy.rs b/crates/rproxy/src/server/proxy/ws/proxy.rs index a2b2698..e7cb593 100644 --- a/crates/rproxy/src/server/proxy/ws/proxy.rs +++ b/crates/rproxy/src/server/proxy/ws/proxy.rs @@ -1304,7 +1304,9 @@ impl ProxyWsPing { let id = Uuid::from_u128(bytes.get_u128()); let connection_id = Uuid::from_u128(bytes.get_u128()); - let Ok(timestamp) = UtcDateTime::from_unix_timestamp_nanos(bytes.get_i128()) else { return None }; + let Ok(timestamp) = UtcDateTime::from_unix_timestamp_nanos(bytes.get_i128()) else { + return None + }; Some(Self { id, connection_id, timestamp }) }