diff --git a/crates/core/src/host/instance_env.rs b/crates/core/src/host/instance_env.rs index a47f035cf34..afda477eb58 100644 --- a/crates/core/src/host/instance_env.rs +++ b/crates/core/src/host/instance_env.rs @@ -857,8 +857,18 @@ impl InstanceEnv { err } - fn http_error(err: E) -> NodesError { - NodesError::HttpError(err.to_string()) + fn http_error(err: E) -> NodesError { + // Include the full error chain, not just the top-level message. + // `reqwest::Error` wraps underlying causes (DNS failure, connection refused, + // timeout, TLS errors, etc.) which are essential for debugging. + use std::fmt::Write; + let mut message = err.to_string(); + let mut source = err.source(); + while let Some(cause) = source { + write!(message, ": {cause}").unwrap(); + source = cause.source(); + } + NodesError::HttpError(message) } // Then convert the request into an `http::Request`, a semi-standard "lingua franca" type in the Rust ecosystem, @@ -888,7 +898,7 @@ impl InstanceEnv { // Check if we have a blocked IP address, since IP literals bypass DNS resolution. if is_blocked_ip_literal(reqwest.url()) { - return Err(http_error(BLOCKED_HTTP_ADDRESS_ERROR)); + return Err(NodesError::HttpError(BLOCKED_HTTP_ADDRESS_ERROR.to_string())); } let redirect_policy = reqwest::redirect::Policy::custom(|attempt| {