From 6983a3ffceff6849de86c2010a47619da8149871 Mon Sep 17 00:00:00 2001 From: weisd Date: Thu, 3 Jul 2025 13:51:38 +0800 Subject: [PATCH] feat: change default listen to IPv4 and add panic recovery (#36) --- Cargo.lock | 1 + crates/utils/src/net.rs | 9 +++++---- rustfs/Cargo.toml | 1 + rustfs/src/main.rs | 2 ++ 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 34f21265..6287dda0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10085,6 +10085,7 @@ dependencies = [ "futures-util", "http 1.3.1", "http-body 1.0.1", + "http-body-util", "iri-string", "pin-project-lite", "tokio", diff --git a/crates/utils/src/net.rs b/crates/utils/src/net.rs index 4fb78c3a..13d2df24 100644 --- a/crates/utils/src/net.rs +++ b/crates/utils/src/net.rs @@ -18,10 +18,11 @@ use futures::{Stream, StreamExt}; use hyper::client::conn::http2::Builder; use hyper_util::rt::TokioExecutor; use lazy_static::lazy_static; +use std::net::Ipv4Addr; use std::{ collections::HashSet, fmt::Display, - net::{IpAddr, Ipv6Addr, SocketAddr, TcpListener, ToSocketAddrs}, + net::{IpAddr, SocketAddr, TcpListener, ToSocketAddrs}, }; use transform_stream::AsyncTryStream; use url::{Host, Url}; @@ -201,7 +202,7 @@ pub fn parse_and_resolve_address(addr_str: &str) -> std::io::Result } else { port }; - SocketAddr::new(IpAddr::V6(Ipv6Addr::UNSPECIFIED), final_port) + SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), final_port) } else { let mut addr = check_local_server_addr(addr_str)?; // assume check_local_server_addr is available here if addr.port() == 0 { @@ -477,12 +478,12 @@ mod test { fn test_parse_and_resolve_address() { // Test port-only format let result = parse_and_resolve_address(":8080").unwrap(); - assert_eq!(result.ip(), IpAddr::V6(Ipv6Addr::UNSPECIFIED)); + assert_eq!(result.ip(), IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))); assert_eq!(result.port(), 8080); // Test port-only format with port 0 (should get available port) let result = parse_and_resolve_address(":0").unwrap(); - assert_eq!(result.ip(), IpAddr::V6(Ipv6Addr::UNSPECIFIED)); + assert_eq!(result.ip(), IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))); assert!(result.port() > 0); // Test localhost with port diff --git a/rustfs/Cargo.toml b/rustfs/Cargo.toml index 11f951f2..68cceeb5 100644 --- a/rustfs/Cargo.toml +++ b/rustfs/Cargo.toml @@ -94,6 +94,7 @@ tower-http = { workspace = true, features = [ "compression-deflate", "compression-gzip", "cors", + "catch-panic", ] } urlencoding = { workspace = true } uuid = { workspace = true } diff --git a/rustfs/src/main.rs b/rustfs/src/main.rs index 840f8a58..1e974ef6 100644 --- a/rustfs/src/main.rs +++ b/rustfs/src/main.rs @@ -77,6 +77,7 @@ use tokio::net::TcpListener; use tokio::signal::unix::{SignalKind, signal}; use tokio_rustls::TlsAcceptor; use tonic::{Request, Status, metadata::MetadataValue}; +use tower_http::catch_panic::CatchPanicLayer; use tower_http::cors::CorsLayer; use tower_http::trace::TraceLayer; use tracing::{Span, debug, error, info, instrument, warn}; @@ -336,6 +337,7 @@ async fn run(opt: config::Opt) -> Result<()> { let hybrid_service = TowerToHyperService::new( tower::ServiceBuilder::new() + .layer(CatchPanicLayer::new()) .layer( TraceLayer::new_for_http() .make_span_with(|request: &HttpRequest<_>| {