Provide more fine grained error reason for reqwest error (#15032)

This commit is contained in:
fzyzcjy
2025-12-13 13:27:06 +08:00
committed by GitHub
parent 06617a9ec8
commit 31c23e5fe3
2 changed files with 56 additions and 9 deletions

View File

@@ -37,7 +37,7 @@ pub fn method_not_allowed(code: impl Into<String>, message: impl Into<String>) -
create_error(StatusCode::METHOD_NOT_ALLOWED, code, message)
}
fn create_error(
pub fn create_error(
status: StatusCode,
code: impl Into<String>,
message: impl Into<String>,

View File

@@ -112,9 +112,7 @@ impl Router {
),
}
}
Err(e) => {
error::internal_error("request_failed", format!("Request failed: {}", e))
}
Err(e) => convert_reqwest_error(e),
}
}
Err(e) => error::service_unavailable("no_workers", e),
@@ -363,10 +361,7 @@ impl Router {
}
}
Err(e) => {
last_response = Some(error::internal_error(
"request_failed",
format!("Request failed: {}", e),
));
last_response = Some(convert_reqwest_error(e));
}
}
}
@@ -506,7 +501,7 @@ impl Router {
}
}
return error::internal_error("request_failed", format!("Request failed: {}", e));
return convert_reqwest_error(e);
}
};
@@ -666,6 +661,58 @@ fn decrement_load(w: &Arc<dyn Worker>) {
RouterMetrics::set_running_requests(w.url(), w.load());
}
fn convert_reqwest_error(e: reqwest::Error) -> Response {
let url = e
.url()
.map(|u| u.to_string())
.unwrap_or_else(|| "unknown".to_string());
let message = format!("{}. URL: {}", e, url);
// TODO improve error status code
let (status, code) = if let Some(upstream_status) = e.status() {
(upstream_status, "call_upstream_status_error")
} else if e.is_builder() {
(
StatusCode::INTERNAL_SERVER_ERROR,
"call_upstream_builder_error",
)
} else if e.is_request() {
(
StatusCode::INTERNAL_SERVER_ERROR,
"call_upstream_request_error",
)
} else if e.is_redirect() {
(
StatusCode::INTERNAL_SERVER_ERROR,
"call_upstream_redirect_error",
)
} else if e.is_body() {
(
StatusCode::INTERNAL_SERVER_ERROR,
"call_upstream_body_error",
)
} else if e.is_decode() {
(
StatusCode::INTERNAL_SERVER_ERROR,
"call_upstream_decode_error",
)
} else if e.is_timeout() {
(StatusCode::INTERNAL_SERVER_ERROR, "call_upstream_timeout")
} else if e.is_connect() {
(
StatusCode::INTERNAL_SERVER_ERROR,
"call_upstream_connection_failed",
)
} else {
(
StatusCode::INTERNAL_SERVER_ERROR,
"call_upstream_request_failed",
)
};
error::create_error(status, code, message)
}
use async_trait::async_trait;
#[async_trait]