]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: rest cr: can return json decoded errors
authorYehuda Sadeh <yehuda@redhat.com>
Tue, 29 Jan 2019 21:51:16 +0000 (13:51 -0800)
committerYehuda Sadeh <yehuda@redhat.com>
Tue, 29 Jan 2019 23:33:00 +0000 (15:33 -0800)
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/rgw/rgw_cr_rest.h
src/rgw/rgw_rest_conn.h

index c67b0006b9529d7b03f59624dc88809de5dc6486..a73828b3f22cf9e4f139995bbd05f743fd8eb853 100644 (file)
@@ -143,7 +143,7 @@ class RGWReadRESTResourceCR : public RGWReadRawRESTResourceCR {
 
 };
 
-template <class T>
+template <class T, class E = int>
 class RGWSendRawRESTResourceCR: public RGWSimpleCoroutine {
  protected:
   RGWRESTConn *conn;
@@ -154,6 +154,7 @@ class RGWSendRawRESTResourceCR: public RGWSimpleCoroutine {
   param_vec_t headers;
   map<string, string> *attrs;
   T *result;
+  E *err_result;
   bufferlist input_bl;
   bool send_content_length=false;
   boost::intrusive_ptr<RGWRESTSendResource> http_op;
@@ -164,18 +165,23 @@ class RGWSendRawRESTResourceCR: public RGWSimpleCoroutine {
                           const string& _method, const string& _path,
                           rgw_http_param_pair *_params,
                           map<string, string> *_attrs,
-                          bufferlist& _input, T *_result, bool _send_content_length)
+                          bufferlist& _input, T *_result,
+                          bool _send_content_length,
+                          E *_err_result = nullptr)
    : RGWSimpleCoroutine(_cct), conn(_conn), http_manager(_http_manager),
-    method(_method), path(_path), params(make_param_list(_params)), headers(make_param_list(_attrs)), attrs(_attrs), result(_result),
-    input_bl(_input), send_content_length(_send_content_length) {}
+     method(_method), path(_path), params(make_param_list(_params)),
+     headers(make_param_list(_attrs)), attrs(_attrs),
+     result(_result), err_result(_err_result),
+     input_bl(_input), send_content_length(_send_content_length) {}
 
   RGWSendRawRESTResourceCR(CephContext *_cct, RGWRESTConn *_conn,
                           RGWHTTPManager *_http_manager,
                           const string& _method, const string& _path,
                           rgw_http_param_pair *_params, map<string, string> *_attrs,
-                          T *_result)
+                          T *_result, E *_err_result = nullptr)
    : RGWSimpleCoroutine(_cct), conn(_conn), http_manager(_http_manager),
-    method(_method), path(_path), params(make_param_list(_params)), headers(make_param_list(_attrs)), attrs(_attrs), result(_result) {}
+    method(_method), path(_path), params(make_param_list(_params)), headers(make_param_list(_attrs)), attrs(_attrs), result(_result),
+    err_result(_err_result) {}
 
   ~RGWSendRawRESTResourceCR() override {
     request_cleanup();
@@ -199,8 +205,8 @@ class RGWSendRawRESTResourceCR: public RGWSimpleCoroutine {
 
   int request_complete() override {
     int ret;
-    if (result) {
-      ret = http_op->wait(result);
+    if (result || err_result) {
+      ret = http_op->wait(result, err_result);
     } else {
       bufferlist bl;
       ret = http_op->wait(&bl);
@@ -226,15 +232,15 @@ class RGWSendRawRESTResourceCR: public RGWSimpleCoroutine {
   }
 };
 
-template <class S, class T>
-class RGWSendRESTResourceCR : public RGWSendRawRESTResourceCR<T> {
+template <class S, class T, class E = int>
+class RGWSendRESTResourceCR : public RGWSendRawRESTResourceCR<T, E> {
  public:
   RGWSendRESTResourceCR(CephContext *_cct, RGWRESTConn *_conn,
                            RGWHTTPManager *_http_manager,
                            const string& _method, const string& _path,
                         rgw_http_param_pair *_params, map<string, string> *_attrs,
-                        S& _input, T *_result)
-    : RGWSendRawRESTResourceCR<T>(_cct, _conn, _http_manager, _method, _path, _params, _attrs, _result) {
+                        S& _input, T *_result, E *_err_result = nullptr)
+    : RGWSendRawRESTResourceCR<T, E>(_cct, _conn, _http_manager, _method, _path, _params, _attrs, _result, _err_result) {
 
     JSONFormatter jf;
     encode_json("data", _input, &jf);
@@ -246,63 +252,72 @@ class RGWSendRESTResourceCR : public RGWSendRawRESTResourceCR<T> {
 
 };
 
-template <class S, class T>
-class RGWPostRESTResourceCR : public RGWSendRESTResourceCR<S, T> {
+template <class S, class T, class E = int>
+class RGWPostRESTResourceCR : public RGWSendRESTResourceCR<S, T, E> {
 public:
   RGWPostRESTResourceCR(CephContext *_cct, RGWRESTConn *_conn,
                         RGWHTTPManager *_http_manager,
                         const string& _path,
-                        rgw_http_param_pair *_params, S& _input, T *_result)
-    : RGWSendRESTResourceCR<S, T>(_cct, _conn, _http_manager,
+                        rgw_http_param_pair *_params, S& _input,
+                        T *_result, E *_err_result = nullptr)
+    : RGWSendRESTResourceCR<S, T, E>(_cct, _conn, _http_manager,
                             "POST", _path,
-                            _params, nullptr, _input, _result) {}
+                            _params, nullptr, _input,
+                            _result, _err_result) {}
 };
 
-template <class T>
-class RGWPutRawRESTResourceCR: public RGWSendRawRESTResourceCR <T> {
+template <class T, class E = int>
+class RGWPutRawRESTResourceCR: public RGWSendRawRESTResourceCR <T, E> {
  public:
   RGWPutRawRESTResourceCR(CephContext *_cct, RGWRESTConn *_conn,
                           RGWHTTPManager *_http_manager,
                           const string& _path,
-                          rgw_http_param_pair *_params, bufferlist& _input, T *_result)
-    : RGWSendRawRESTResourceCR<T>(_cct, _conn, _http_manager, "PUT", _path, _params, nullptr, _input, _result, true){}
+                          rgw_http_param_pair *_params, bufferlist& _input,
+                          T *_result, E *_err_result = nullptr)
+    : RGWSendRawRESTResourceCR<T, E>(_cct, _conn, _http_manager, "PUT", _path,
+                                  _params, nullptr, _input, _result, true, _err_result) {}
 
 };
 
-template <class T>
-class RGWPostRawRESTResourceCR: public RGWSendRawRESTResourceCR <T> {
+template <class T, class E = int>
+class RGWPostRawRESTResourceCR: public RGWSendRawRESTResourceCR <T, E> {
  public:
   RGWPostRawRESTResourceCR(CephContext *_cct, RGWRESTConn *_conn,
                           RGWHTTPManager *_http_manager,
                           const string& _path,
                           rgw_http_param_pair *_params,
                           map<string, string> * _attrs,
-                          bufferlist& _input, T *_result)
-    : RGWSendRawRESTResourceCR<T>(_cct, _conn, _http_manager, "POST", _path, _params, _attrs, _input, _result, true){}
+                          bufferlist& _input,
+                          T *_result, E *_err_result = nullptr)
+    : RGWSendRawRESTResourceCR<T, E>(_cct, _conn, _http_manager, "POST", _path,
+                                  _params, _attrs, _input, _result, true, _err_result) {}
 
 };
 
 
-template <class S, class T>
-class RGWPutRESTResourceCR : public RGWSendRESTResourceCR<S, T> {
+template <class S, class T, class E = int>
+class RGWPutRESTResourceCR : public RGWSendRESTResourceCR<S, T, E> {
 public:
   RGWPutRESTResourceCR(CephContext *_cct, RGWRESTConn *_conn,
                         RGWHTTPManager *_http_manager,
                         const string& _path,
-                        rgw_http_param_pair *_params, S& _input, T *_result)
-    : RGWSendRESTResourceCR<S, T>(_cct, _conn, _http_manager,
+                        rgw_http_param_pair *_params, S& _input,
+                        T *_result, E *_err_result = nullptr)
+    : RGWSendRESTResourceCR<S, T, E>(_cct, _conn, _http_manager,
                                   "PUT", _path,
-                                  _params, nullptr, _input, _result) {}
+                                  _params, nullptr, _input,
+                                  _result, _err_result) {}
 
   RGWPutRESTResourceCR(CephContext *_cct, RGWRESTConn *_conn,
                        RGWHTTPManager *_http_manager,
                        const string& _path,
                        rgw_http_param_pair *_params,
                        map <string, string> *_attrs,
-                       S& _input, T *_result)
-    : RGWSendRESTResourceCR<S, T>(_cct, _conn, _http_manager,
+                       S& _input, T *_result, E *_err_result = nullptr)
+    : RGWSendRESTResourceCR<S, T, E>(_cct, _conn, _http_manager,
                                   "PUT", _path,
-                                  _params, _attrs, _input, _result) {}
+                                  _params, _attrs, _input,
+                                  _result, _err_result) {}
 
 };
 
index 0af85a4df0a7406a87acfaeafec7329f076daf44..fa273e91a7cd5f8d86cbf34b265948d188606f07 100644 (file)
@@ -411,8 +411,8 @@ public:
     return req.get_io_user_info();
   }
 
-  template <class T>
-  int decode_resource(T *dest);
+  template <class T, class E>
+  int decode_resource(T *dest, E *err_result);
 
   int send(bufferlist& bl);
 
@@ -439,17 +439,25 @@ public:
     return 0;
   }
 
-  template <class T>
-  int wait(T *dest);
+  template <class T, class E = int>
+  int wait(T *dest, E *err_result = nullptr);
 };
 
-template <class T>
-int RGWRESTSendResource::decode_resource(T *dest)
+template <class T, class E>
+int RGWRESTSendResource::decode_resource(T *dest, E *err_result)
 {
   int ret = req.get_status();
   if (ret < 0) {
+    if (err_result) {
+      parse_decode_json(cct, *err_result, bl);
+    }
     return ret;
   }
+
+  if (!dest) {
+    return 0;
+  }
+
   ret = parse_decode_json(cct, *dest, bl);
   if (ret < 0) {
     return ret;
@@ -457,15 +465,18 @@ int RGWRESTSendResource::decode_resource(T *dest)
   return 0;
 }
 
-template <class T>
-int RGWRESTSendResource::wait(T *dest)
+template <class T, class E>
+int RGWRESTSendResource::wait(T *dest, E *err_result)
 {
   int ret = req.wait();
   if (ret < 0) {
+    if (err_result) {
+      parse_decode_json(cct, *err_result, bl);
+    }
     return ret;
   }
 
-  ret = decode_resource(dest);
+  ret = decode_resource(dest, err_result);
   if (ret < 0) {
     return ret;
   }