From: Yehuda Sadeh Date: Tue, 29 Jan 2019 21:51:16 +0000 (-0800) Subject: rgw: rest cr: can return json decoded errors X-Git-Tag: v14.1.0~210^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0bb0f234a46c12fd964956d5ab3ac55caa1df69c;p=ceph.git rgw: rest cr: can return json decoded errors Signed-off-by: Yehuda Sadeh --- diff --git a/src/rgw/rgw_cr_rest.h b/src/rgw/rgw_cr_rest.h index c67b0006b95..a73828b3f22 100644 --- a/src/rgw/rgw_cr_rest.h +++ b/src/rgw/rgw_cr_rest.h @@ -143,7 +143,7 @@ class RGWReadRESTResourceCR : public RGWReadRawRESTResourceCR { }; -template +template class RGWSendRawRESTResourceCR: public RGWSimpleCoroutine { protected: RGWRESTConn *conn; @@ -154,6 +154,7 @@ class RGWSendRawRESTResourceCR: public RGWSimpleCoroutine { param_vec_t headers; map *attrs; T *result; + E *err_result; bufferlist input_bl; bool send_content_length=false; boost::intrusive_ptr http_op; @@ -164,18 +165,23 @@ class RGWSendRawRESTResourceCR: public RGWSimpleCoroutine { const string& _method, const string& _path, rgw_http_param_pair *_params, map *_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 *_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 RGWSendRESTResourceCR : public RGWSendRawRESTResourceCR { +template +class RGWSendRESTResourceCR : public RGWSendRawRESTResourceCR { public: RGWSendRESTResourceCR(CephContext *_cct, RGWRESTConn *_conn, RGWHTTPManager *_http_manager, const string& _method, const string& _path, rgw_http_param_pair *_params, map *_attrs, - S& _input, T *_result) - : RGWSendRawRESTResourceCR(_cct, _conn, _http_manager, _method, _path, _params, _attrs, _result) { + S& _input, T *_result, E *_err_result = nullptr) + : RGWSendRawRESTResourceCR(_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 { }; -template -class RGWPostRESTResourceCR : public RGWSendRESTResourceCR { +template +class RGWPostRESTResourceCR : public RGWSendRESTResourceCR { public: RGWPostRESTResourceCR(CephContext *_cct, RGWRESTConn *_conn, RGWHTTPManager *_http_manager, const string& _path, - rgw_http_param_pair *_params, S& _input, T *_result) - : RGWSendRESTResourceCR(_cct, _conn, _http_manager, + rgw_http_param_pair *_params, S& _input, + T *_result, E *_err_result = nullptr) + : RGWSendRESTResourceCR(_cct, _conn, _http_manager, "POST", _path, - _params, nullptr, _input, _result) {} + _params, nullptr, _input, + _result, _err_result) {} }; -template -class RGWPutRawRESTResourceCR: public RGWSendRawRESTResourceCR { +template +class RGWPutRawRESTResourceCR: public RGWSendRawRESTResourceCR { public: RGWPutRawRESTResourceCR(CephContext *_cct, RGWRESTConn *_conn, RGWHTTPManager *_http_manager, const string& _path, - rgw_http_param_pair *_params, bufferlist& _input, T *_result) - : RGWSendRawRESTResourceCR(_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(_cct, _conn, _http_manager, "PUT", _path, + _params, nullptr, _input, _result, true, _err_result) {} }; -template -class RGWPostRawRESTResourceCR: public RGWSendRawRESTResourceCR { +template +class RGWPostRawRESTResourceCR: public RGWSendRawRESTResourceCR { public: RGWPostRawRESTResourceCR(CephContext *_cct, RGWRESTConn *_conn, RGWHTTPManager *_http_manager, const string& _path, rgw_http_param_pair *_params, map * _attrs, - bufferlist& _input, T *_result) - : RGWSendRawRESTResourceCR(_cct, _conn, _http_manager, "POST", _path, _params, _attrs, _input, _result, true){} + bufferlist& _input, + T *_result, E *_err_result = nullptr) + : RGWSendRawRESTResourceCR(_cct, _conn, _http_manager, "POST", _path, + _params, _attrs, _input, _result, true, _err_result) {} }; -template -class RGWPutRESTResourceCR : public RGWSendRESTResourceCR { +template +class RGWPutRESTResourceCR : public RGWSendRESTResourceCR { public: RGWPutRESTResourceCR(CephContext *_cct, RGWRESTConn *_conn, RGWHTTPManager *_http_manager, const string& _path, - rgw_http_param_pair *_params, S& _input, T *_result) - : RGWSendRESTResourceCR(_cct, _conn, _http_manager, + rgw_http_param_pair *_params, S& _input, + T *_result, E *_err_result = nullptr) + : RGWSendRESTResourceCR(_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 *_attrs, - S& _input, T *_result) - : RGWSendRESTResourceCR(_cct, _conn, _http_manager, + S& _input, T *_result, E *_err_result = nullptr) + : RGWSendRESTResourceCR(_cct, _conn, _http_manager, "PUT", _path, - _params, _attrs, _input, _result) {} + _params, _attrs, _input, + _result, _err_result) {} }; diff --git a/src/rgw/rgw_rest_conn.h b/src/rgw/rgw_rest_conn.h index 0af85a4df0a..fa273e91a7c 100644 --- a/src/rgw/rgw_rest_conn.h +++ b/src/rgw/rgw_rest_conn.h @@ -411,8 +411,8 @@ public: return req.get_io_user_info(); } - template - int decode_resource(T *dest); + template + int decode_resource(T *dest, E *err_result); int send(bufferlist& bl); @@ -439,17 +439,25 @@ public: return 0; } - template - int wait(T *dest); + template + int wait(T *dest, E *err_result = nullptr); }; -template -int RGWRESTSendResource::decode_resource(T *dest) +template +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 -int RGWRESTSendResource::wait(T *dest) +template +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; }