Files
sglang/sgl-model-gateway/src/routers/error.rs
T

96 lines
2.6 KiB
Rust

use axum::{
http::{HeaderMap, HeaderValue, StatusCode},
response::{IntoResponse, Response},
Json,
};
use serde::Serialize;
#[derive(Serialize)]
struct ErrorResponse<'a> {
error: ErrorDetail<'a>,
}
#[derive(Serialize)]
struct ErrorDetail<'a> {
#[serde(rename = "type")]
error_type: &'static str,
code: &'a str,
message: &'a str,
}
pub const HEADER_X_SMG_ERROR_CODE: &str = "X-SMG-Error-Code";
pub fn internal_error(code: impl Into<String>, message: impl Into<String>) -> Response {
create_error(StatusCode::INTERNAL_SERVER_ERROR, code, message)
}
pub fn bad_request(code: impl Into<String>, message: impl Into<String>) -> Response {
create_error(StatusCode::BAD_REQUEST, code, message)
}
pub fn not_found(code: impl Into<String>, message: impl Into<String>) -> Response {
create_error(StatusCode::NOT_FOUND, code, message)
}
pub fn service_unavailable(code: impl Into<String>, message: impl Into<String>) -> Response {
create_error(StatusCode::SERVICE_UNAVAILABLE, code, message)
}
pub fn failed_dependency(code: impl Into<String>, message: impl Into<String>) -> Response {
create_error(StatusCode::FAILED_DEPENDENCY, code, message)
}
pub fn not_implemented(code: impl Into<String>, message: impl Into<String>) -> Response {
create_error(StatusCode::NOT_IMPLEMENTED, code, message)
}
pub fn bad_gateway(code: impl Into<String>, message: impl Into<String>) -> Response {
create_error(StatusCode::BAD_GATEWAY, code, message)
}
pub fn method_not_allowed(code: impl Into<String>, message: impl Into<String>) -> Response {
create_error(StatusCode::METHOD_NOT_ALLOWED, code, message)
}
pub fn create_error(
status: StatusCode,
code: impl Into<String>,
message: impl Into<String>,
) -> Response {
let code_str = code.into();
let message_str = message.into();
let mut headers = HeaderMap::with_capacity(1);
headers.insert(
HEADER_X_SMG_ERROR_CODE,
HeaderValue::from_str(&code_str).unwrap(),
);
(
status,
headers,
Json(ErrorResponse {
error: ErrorDetail {
error_type: status_code_to_str(status),
code: &code_str,
message: &message_str,
},
}),
)
.into_response()
}
fn status_code_to_str(status_code: StatusCode) -> &'static str {
status_code
.canonical_reason()
.unwrap_or("Unknown Status Code")
}
pub fn extract_error_code_from_response<B>(response: &Response<B>) -> &str {
response
.headers()
.get(HEADER_X_SMG_ERROR_CODE)
.and_then(|v| v.to_str().ok())
.unwrap_or_default()
}