public inbox for pbs-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Dietmar Maurer <dietmar@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox] proxmox-rest-server: return status code with ExtJsFormatter
Date: Mon, 27 Nov 2023 10:09:17 +0100	[thread overview]
Message-ID: <20231127090917.2871106-1-dietmar@proxmox.com> (raw)

Makes it possible to detect things like authentification failure (401).

Signed-off-by: Dietmar Maurer <dietmar@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




             reply	other threads:[~2023-11-27  9:09 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-27  9:09 Dietmar Maurer [this message]
2023-11-27  9:26 ` Dietmar Maurer
2023-11-28 10:35   ` [pbs-devel] applied: " Wolfgang Bumiller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231127090917.2871106-1-dietmar@proxmox.com \
    --to=dietmar@proxmox.com \
    --cc=pbs-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal