Provide more fine grained error reason for reqwest error (#15032)
This commit is contained in:
@@ -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)
|
create_error(StatusCode::METHOD_NOT_ALLOWED, code, message)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_error(
|
pub fn create_error(
|
||||||
status: StatusCode,
|
status: StatusCode,
|
||||||
code: impl Into<String>,
|
code: impl Into<String>,
|
||||||
message: impl Into<String>,
|
message: impl Into<String>,
|
||||||
|
|||||||
@@ -112,9 +112,7 @@ impl Router {
|
|||||||
),
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => convert_reqwest_error(e),
|
||||||
error::internal_error("request_failed", format!("Request failed: {}", e))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(e) => error::service_unavailable("no_workers", e),
|
Err(e) => error::service_unavailable("no_workers", e),
|
||||||
@@ -363,10 +361,7 @@ impl Router {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
last_response = Some(error::internal_error(
|
last_response = Some(convert_reqwest_error(e));
|
||||||
"request_failed",
|
|
||||||
format!("Request failed: {}", 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());
|
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;
|
use async_trait::async_trait;
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
|
|||||||
Reference in New Issue
Block a user