[pbs-devel] [PATCH proxmox] proxmox-rest-server: return status code with ExtJsFormatter
Dietmar Maurer
dietmar at proxmox.com
Mon Nov 27 10:09:17 CET 2023
Makes it possible to detect things like authentification failure (401).
Signed-off-by: Dietmar Maurer <dietmar at proxmox.com>
---
proxmox-rest-server/src/formatter.rs | 35 ++++++++++++++++++++--------
1 file changed, 25 insertions(+), 10 deletions(-)
diff --git a/proxmox-rest-server/src/formatter.rs b/proxmox-rest-server/src/formatter.rs
index d05ddd9..d19d680 100644
--- a/proxmox-rest-server/src/formatter.rs
+++ b/proxmox-rest-server/src/formatter.rs
@@ -166,6 +166,8 @@ pub(crate) fn error_to_response(err: Error) -> Response<Body> {
///
/// * ``success``: boolean attribute indicating the success.
///
+/// * ``status``: api call status code.
+///
/// * ``data``: The result data (on success)
///
/// * ``message``: The error message (on failure)
@@ -174,8 +176,9 @@ pub(crate) fn error_to_response(err: Error) -> Response<Body> {
///
/// Any result attributes set on ``rpcenv`` are also added to the object.
///
-/// Please note that errors return status code OK, but setting success
-/// to false.
+/// Please note that errors return a HTTP response with status code OK, but setting success
+/// to false. The real status from the API call is encoded in the status
+/// property.
pub static EXTJS_FORMATTER: &'static dyn OutputFormatter = &ExtJsFormatter();
struct ExtJsFormatter();
@@ -184,7 +187,8 @@ impl OutputFormatter for ExtJsFormatter {
fn format_data(&self, data: Value, rpcenv: &dyn RpcEnvironment) -> Response<Body> {
let mut result = json!({
"data": data,
- "success": true
+ "success": true,
+ "status": StatusCode::OK.as_u16(),
});
add_result_attributes(&mut result, rpcenv);
@@ -199,6 +203,7 @@ impl OutputFormatter for ExtJsFormatter {
) -> Result<Response<Body>, Error> {
let mut value = json!({
"success": true,
+ "status": StatusCode::OK.as_u16(),
});
add_result_attributes(&mut value, rpcenv);
@@ -212,20 +217,30 @@ impl OutputFormatter for ExtJsFormatter {
fn format_error(&self, err: Error) -> Response<Body> {
let mut errors = HashMap::new();
- let message: String = match err.downcast::<ParameterError>() {
- Ok(param_err) => {
- for (name, err) in param_err {
- errors.insert(name, err.to_string());
+ let (message, status) = if err.is::<ParameterError>() {
+ match err.downcast::<ParameterError>() {
+ Ok(param_err) => {
+ for (name, err) in param_err {
+ errors.insert(name, err.to_string());
+ }
+ (String::from("parameter verification errors"), StatusCode::BAD_REQUEST)
}
- String::from("parameter verification errors")
+ Err(err) => (err.to_string(), StatusCode::BAD_REQUEST),
}
- Err(err) => err.to_string(),
+ } else {
+ let status = if let Some(apierr) = err.downcast_ref::<HttpError>() {
+ apierr.code
+ } else {
+ StatusCode::BAD_REQUEST
+ };
+ (err.to_string(), status)
};
let result = json!({
"message": message,
"errors": errors,
- "success": false
+ "success": false,
+ "status": status.as_u16(),
});
let mut response = json_data_response(result);
--
2.39.2
More information about the pbs-devel
mailing list