]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: Searching for error codes and dumping output based on protocol flags. 10690/head
authorPritha Srivastava <prsrivas@redhat.com>
Tue, 6 Dec 2016 09:18:20 +0000 (14:48 +0530)
committerPritha Srivastava <prsrivas@redhat.com>
Tue, 16 May 2017 05:33:48 +0000 (11:03 +0530)
The previous commit uses dynamic allocation to search for s3/ swift specific
error codes and dump the results. In order to avoid dynamic allocation,
we are making use of protocol flags to achieve the above.

Signed-off-by: Pritha Srivastava <prsrivas@redhat.com>
19 files changed:
src/rgw/librgw.cc
src/rgw/rgw_common.cc
src/rgw/rgw_common.h
src/rgw/rgw_log.cc
src/rgw/rgw_log.h
src/rgw/rgw_op.cc
src/rgw/rgw_op.h
src/rgw/rgw_process.cc
src/rgw/rgw_rest.cc
src/rgw/rgw_rest.h
src/rgw/rgw_rest_config.cc
src/rgw/rgw_rest_log.cc
src/rgw/rgw_rest_metadata.cc
src/rgw/rgw_rest_opstate.cc
src/rgw/rgw_rest_realm.cc
src/rgw/rgw_rest_replica_log.cc
src/rgw/rgw_rest_s3.cc
src/rgw/rgw_rest_swift.cc
src/rgw/rgw_swift_auth.cc

index befceea3858d19de9ece0e603b90b8bf90ff3ee5..f7bb502fa0060b70184dcf49b6ab9ab2fea51afc 100644 (file)
@@ -312,7 +312,7 @@ namespace rgw {
                 (op ? op->name() : "unknown"), olog);
     }
 
-    int http_ret = s->err->http_ret;
+    int http_ret = s->err.http_ret;
 
     req->log_format(s, "http status=%d", http_ret);
 
@@ -321,7 +321,7 @@ namespace rgw {
            << http_ret
            << " ======" << dendl;
 
-    return (ret < 0 ? ret : s->err->ret);
+    return (ret < 0 ? ret : s->err.ret);
   } /* process_request */
 
   int RGWLibProcess::start_request(RGWLibContinuedReq* req)
@@ -414,7 +414,7 @@ namespace rgw {
     req->exec_start();
 
   done:
-    return (ret < 0 ? ret : s->err->ret);
+    return (ret < 0 ? ret : s->err.ret);
   }
 
   int RGWLibProcess::finish_request(RGWLibContinuedReq* req)
index 71e424878023248edd161a63e3382836ded3ed40..8f8791528f3a02cd98e4108a5ce46ab8267f6c9e 100644 (file)
@@ -11,6 +11,7 @@
 #include "json_spirit/json_spirit.h"
 #include "common/ceph_json.h"
 
+#include "rgw_op.h"
 #include "rgw_common.h"
 #include "rgw_acl.h"
 #include "rgw_string.h"
@@ -149,7 +150,7 @@ void rgw_perf_stop(CephContext *cct)
 using namespace ceph::crypto;
 
 rgw_err::
-rgw_err(req_state *s) : s(*s)
+rgw_err()
 {
   clear();
 }
@@ -248,7 +249,7 @@ void req_info::rebuild_from(req_info& src)
 
 
 req_state::req_state(CephContext* _cct, RGWEnv* e, RGWUserInfo* u)
-  : cct(_cct), cio(NULL), op(OP_UNKNOWN), err(0), user(u), has_acl_header(false),
+  : cct(_cct), cio(NULL), op(OP_UNKNOWN), user(u), has_acl_header(false),
     info(_cct, e)
 {
   enable_ops_log = e->conf.enable_ops_log;
@@ -284,11 +285,22 @@ req_state::req_state(CephContext* _cct, RGWEnv* e, RGWUserInfo* u)
 
 req_state::~req_state() {
   delete formatter;
-  delete err;
   delete bucket_acl;
   delete object_acl;
 }
 
+bool search_err(rgw_http_errors& errs, int err_no, bool is_website_redirect, int& http_ret, string& code)
+{
+  auto r = errs.find(err_no);
+  if (r != errs.end()) {
+    if (! is_website_redirect)
+      http_ret = r->second.first;
+     code = r->second.second;
+     return true;
+  }
+  return false;
+}
+
 void set_req_state_err(struct rgw_err& err,    /* out */
                        int err_no,             /* in  */
                        const int prot_flags)   /* in  */
@@ -297,10 +309,18 @@ void set_req_state_err(struct rgw_err& err,       /* out */
     err_no = -err_no;
 
   err.ret = -err_no;
-  err.is_website_redirect |= (prot_flags & RGW_REST_WEBSITE)
+  bool is_website_redirect = false;
+
+  if (prot_flags & RGW_REST_SWIFT) {
+    if (search_err(rgw_http_swift_errors, err_no, is_website_redirect, err.http_ret, err.s3_code))
+      return;
+  }
+
+  //Default to searching in s3 errors
+  is_website_redirect |= (prot_flags & RGW_REST_WEBSITE)
                && err_no == ERR_WEBSITE_REDIRECT && err.is_clear();
-  if (err.set_rgw_err(err_no))
-    return;
+  if (search_err(rgw_http_s3_errors, err_no, is_website_redirect, err.http_ret, err.s3_code))
+      return;
   dout(0) << "WARNING: set_req_state_err err_no=" << err_no
        << " resorting to 500" << dendl;
 
@@ -308,16 +328,36 @@ void set_req_state_err(struct rgw_err& err,       /* out */
   err.s3_code = "UnknownError";
 }
 
-void req_state::set_req_state_err(int err_no)
+void set_req_state_err(struct req_state* s, int err_no, const string& err_msg)
+{
+  if (s) {
+    set_req_state_err(s, err_no);
+    s->err.message = err_msg;
+  }
+}
+
+void set_req_state_err(struct req_state* s, int err_no)
 {
-  if (!err) err = new rgw_err(this);
-  ::set_req_state_err(*err, err_no, prot_flags);
+  if (s) {
+    set_req_state_err(s->err, err_no, s->prot_flags);
+  }
 }
 
-void req_state::set_req_state_err(int err_no, const string &err_msg)
+void dump(struct req_state* s)
 {
-   set_req_state_err(err_no);
-   err->message = err_msg;
+  if (s->format != RGW_FORMAT_HTML)
+    s->formatter->open_object_section("Error");
+  if (!s->err.s3_code.empty())
+    s->formatter->dump_string("Code", s->err.s3_code);
+  if (!s->err.message.empty())
+    s->formatter->dump_string("Message", s->err.message);
+  if (!s->bucket_name.empty()) // TODO: connect to expose_bucket
+    s->formatter->dump_string("BucketName", s->bucket_name);
+  if (!s->trans_id.empty())    // TODO: connect to expose_bucket or another toggle
+    s->formatter->dump_string("RequestId", s->trans_id);
+  s->formatter->dump_string("HostId", s->host_id);
+  if (s->format != RGW_FORMAT_HTML)
+    s->formatter->close_section();
 }
 
 struct str_len {
@@ -395,37 +435,6 @@ std::ostream& operator<<(std::ostream& oss, const rgw_err &err)
   return oss;
 }
 
-void rgw_err::dump() const
-{
-  if (s.format != RGW_FORMAT_HTML)
-    s.formatter->open_object_section("Error");
-  if (!s3_code.empty())
-    s.formatter->dump_string("Code", s3_code);
-  if (!message.empty())
-    s.formatter->dump_string("Message", message);
-  if (!s.bucket_name.empty())  // TODO: connect to expose_bucket
-    s.formatter->dump_string("BucketName", s.bucket_name);
-  if (!s.trans_id.empty())     // TODO: connect to expose_bucket or another toggle
-    s.formatter->dump_string("RequestId", s.trans_id);
-  s.formatter->dump_string("HostId", s.host_id);
-  if (s.format != RGW_FORMAT_HTML)
-    s.formatter->close_section();
-}
-
-bool rgw_err::set_rgw_err(int err_no)
-{
-  rgw_http_errors::const_iterator r;
-
-  r = rgw_http_s3_errors.find(err_no);
-  if (r != rgw_http_s3_errors.end()) {
-    if (!is_website_redirect)
-      http_ret = r->second.first;
-    s3_code = r->second.second;
-    return true;
-  }
-  return false;
-}
-
 string rgw_string_unquote(const string& s)
 {
   if (s[0] != '"' || s.size() < 2)
index 37e25a0840cf0f0d8d91ab2fd5fba18460eff0e2..63854015c8728b168fb5530727716c559dda85f4 100644 (file)
@@ -264,23 +264,20 @@ enum RGWObjCategory {
 
 /** Store error returns for output at a different point in the program */
 struct rgw_err {
-  rgw_err(req_state *s);
-  virtual ~rgw_err() { };
+  rgw_err();
   void clear();
   bool is_clear() const;
   bool is_err() const;
   friend std::ostream& operator<<(std::ostream& oss, const rgw_err &err);
-  virtual void dump() const;
-  virtual bool set_rgw_err(int);
 
-  req_state &s;
-  bool is_website_redirect;
   int http_ret;
   int ret;
   std::string s3_code;
   std::string message;
 };
 
+
+
 /* Helper class used for RGWHTTPArgs parsing */
 class NameVal
 {
@@ -1705,7 +1702,7 @@ struct req_state {
   const char *length;
   int64_t content_length;
   map<string, string> generic_attrs;
-  rgw_err *err;
+  rgw_err err;
   bool expect_cont;
   bool header_ended;
   uint64_t obj_size;
@@ -1810,11 +1807,13 @@ struct req_state {
   req_state(CephContext* _cct, RGWEnv* e, RGWUserInfo* u);
   ~req_state();
 
-  void set_req_state_err(int err_no);
-  void set_req_state_err(int err_no, const string &err_msg);
-  bool is_err() const { return err && err->is_err(); }
+  bool is_err() const { return err.is_err(); }
 };
+
+void set_req_state_err(struct req_state*, int);
+void set_req_state_err(struct req_state*, int, const string&);
 void set_req_state_err(struct rgw_err&, int, const int);
+void dump(struct req_state*);
 
 /** Store basic data on bucket */
 struct RGWBucketEnt {
index 6fc90372b6e75ac9c4d5102fe73bccd70451f085..51dbd1bbe93ba672f19027c4ee57ab4b0eae697d 100644 (file)
@@ -203,8 +203,8 @@ static void log_usage(struct req_state *s, const string& op_name)
       user = s->user->user_id;
   }
 
-  bool error = s->err->is_err();
-  if (error && s->err->http_ret == 404) {
+  bool error = s->err.is_err();
+  if (error && s->err.http_ret == 404) {
     bucket_name = "-"; /* bucket not found, use the invalid '-' as bucket name */
   }
 
@@ -316,7 +316,7 @@ int rgw_log_op(RGWRados *store, RGWREST* const rest, struct req_state *s,
     ldout(s->cct, 5) << "nothing to log for operation" << dendl;
     return -EINVAL;
   }
-  if (s->err->ret == -ERR_NO_SUCH_BUCKET) {
+  if (s->err.ret == -ERR_NO_SUCH_BUCKET) {
     if (!s->cct->_conf->rgw_log_nonexistent_bucket) {
       ldout(s->cct, 5) << "bucket " << s->bucket << " doesn't exist, not logging" << dendl;
       return 0;
@@ -374,14 +374,14 @@ int rgw_log_op(RGWRados *store, RGWREST* const rest, struct req_state *s,
   entry.total_time = ceph_clock_now() - s->time;
   entry.bytes_sent = bytes_sent;
   entry.bytes_received = bytes_received;
-  if (s->err->http_ret) {
+  if (s->err.http_ret) {
     char buf[16];
-    snprintf(buf, sizeof(buf), "%d", s->err->http_ret);
+    snprintf(buf, sizeof(buf), "%d", s->err.http_ret);
     entry.http_status = buf;
   } else
     entry.http_status = "200"; // default
 
-  entry.error_code = s->err->s3_code;
+  entry.error_code = s->err.s3_code;
   entry.bucket_id = bucket_id;
 
   bufferlist bl;
index 5e612b7ca22da404fce32cdf5c1c6ddcad2a7e2f..25e99e096dee3d7a3f1d2a3a72d8bccb4acb7af1 100644 (file)
@@ -3,7 +3,6 @@
 
 #ifndef CEPH_RGW_LOG_H
 #define CEPH_RGW_LOG_H
-
 #include <boost/container/flat_map.hpp>
 #include "rgw_common.h"
 #include "include/utime.h"
index 7278283ddb180ce8ead1386d3021719f9053ab7d..fbff621200a85289a9d389d5b0d6dff83389936d 100644 (file)
@@ -254,7 +254,6 @@ static int modify_obj_attr(RGWRados *store, struct req_state *s, rgw_obj& obj, c
   RGWRados::Object::Read read_op(&op_target);
 
   read_op.params.attrs = &attrs;
-  read_op.params.perr = &s->err;
   
   int r = read_op.prepare();
   if (r < 0) {
@@ -793,15 +792,6 @@ bool RGWOp::generate_cors_headers(string& origin, string& method, string& header
   return true;
 }
 
-/**
- * Return a callable that can invoke dump_access_control().
- */
-
-boost::function<void()> RGWOp::dump_access_control_f()
-{
-  return boost::bind(dump_access_control, s, this);
-}
-
 int RGWGetObj::read_user_manifest_part(rgw_bucket& bucket,
                                        const rgw_bucket_dir_entry& ent,
                                        RGWAccessControlPolicy * const bucket_policy,
index 827ae1c6c1acb274ff1556f0f5c786a69c406901..fe0cd6fdae9b6ed945a69c8799055e9b38e366f0 100644 (file)
@@ -94,6 +94,7 @@ public:
   virtual int authorize() = 0;
   virtual int postauth_init() = 0;
   virtual int error_handler(int err_no, std::string* error_content);
+  virtual void dump(const string& code, const string& message) const {}
 };
 
 
@@ -173,8 +174,6 @@ public:
   virtual uint32_t op_mask() { return 0; }
 
   virtual int error_handler(int err_no, string *error_content);
-
-  boost::function<void()> dump_access_control_f();
 };
 
 class RGWGetObj : public RGWOp {
index 333ee1ef3fdac74df4f0388dd73d0b52d7ba3955..6fbf2fdb594f005b5fdcb63a1457a96db1dc7327 100644 (file)
@@ -151,7 +151,6 @@ int process_request(RGWRados* const store,
                                                auth_registry,
                                                frontend_prefix,
                                                client_io, &mgr, &init_error);
-  if (!s->err) s->err = new rgw_err(s);
   if (init_error != 0) {
     abort_early(s, NULL, init_error, NULL);
     goto done;
@@ -217,7 +216,7 @@ done:
     rgw_log_op(store, rest, s, (op ? op->name() : "unknown"), olog);
   }
 
-  int http_ret = s->err->http_ret;
+  int http_ret = s->err.http_ret;
   int op_ret = 0;
   if (op) {
     op_ret = op->get_ret();
@@ -236,5 +235,5 @@ done:
          << " ======"
          << dendl;
 
-  return (ret < 0 ? ret : s->err->ret);
+  return (ret < 0 ? ret : s->err.ret);
 } /* process_request */
index 6063212436f9e2ce23c2af92a7db60edcd1e42c1..140d434e737a39df86b23e0aba8286b31f1890cb 100644 (file)
@@ -19,7 +19,6 @@
 #include "rgw_rest_s3.h"
 #include "rgw_swift_auth.h"
 #include "rgw_cors_s3.h"
-// #include "rgw_lib.h"        // XXX mdw is this necessary?
 
 #include "rgw_client_io.h"
 #include "rgw_resolve.h"
@@ -223,8 +222,10 @@ string camelcase_dash_http_attr(const string& orig)
 static set<string> hostnames_set;
 static set<string> hostnames_s3website_set;
 
-void rgw_rest_init(CephContext *cct)
+void rgw_rest_init(CephContext *cct, RGWRados *store, RGWZoneGroup& zone_group)
 {
+  store->init_host_id();
+
   for (const auto& rgw2http : base_rgw_to_http_attrs)  {
     rgw_to_http_attrs[rgw2http.rgw_attr] = rgw2http.http_attr;
   }
@@ -254,12 +255,6 @@ void rgw_rest_init(CephContext *cct)
   }
 
   hostnames_set.insert(cct->_conf->rgw_dns_name);
-}
-
-void rgw_rest_init(CephContext *cct, RGWRados *store, RGWZoneGroup& zone_group)
-{
-  store->init_host_id();
-  rgw_rest_init(cct);
   hostnames_set.insert(zone_group.hostnames.begin(), zone_group.hostnames.end());
   hostnames_set.erase(""); // filter out empty hostnames
   ldout(cct, 20) << "RGW hostnames: " << hostnames_set << dendl;
@@ -373,7 +368,7 @@ void dump_errno(const struct rgw_err &err, string& out) {
 
 void dump_errno(struct req_state *s)
 {
-  dump_status(s, s->err->http_ret, http_status_names[s->err->http_ret]);
+  dump_status(s, s->err.http_ret, http_status_names[s->err.http_ret]);
 }
 
 void dump_errno(struct req_state *s, int http_ret)
@@ -662,9 +657,9 @@ void dump_trans_id(req_state *s)
   }
 }
 
-void end_header(struct req_state* s, boost::function<void()> dump_more,
-               const char *content_type, const int64_t proposed_content_length,
-               bool force_content_type, bool force_no_error)
+void end_header(struct req_state* s, RGWOp* op, const char *content_type,
+               const int64_t proposed_content_length, bool force_content_type,
+               bool force_no_error)
 {
   string ctype;
 
@@ -676,8 +671,8 @@ void end_header(struct req_state* s, boost::function<void()> dump_more,
     dump_header(s, "x-amz-request-charged", "requester");
   }
 
-  if (dump_more) {
-    dump_more();
+  if (op) {
+    dump_access_control(s, op);
   }
 
   if (s->prot_flags & RGW_REST_SWIFT && !content_type) {
@@ -708,7 +703,7 @@ void end_header(struct req_state* s, boost::function<void()> dump_more,
   }
   if (!force_no_error && s->is_err()) {
     dump_start(s);
-    s->err->dump();
+    dump(s);
     dump_content_length(s, s->formatter->get_len());
   } else {
     if (proposed_content_length == CHUNKED_TRANSFER_ENCODING) {
@@ -733,38 +728,43 @@ void end_header(struct req_state* s, boost::function<void()> dump_more,
   rgw_flush_formatter_and_reset(s, s->formatter);
 }
 
-void end_header(struct req_state* s, RGWOp* op, const char *content_type,
-               const int64_t proposed_content_length, bool force_content_type,
-               bool force_no_error)
-{
-  boost::function<void()> dump_more;
-
-  if (op) dump_more = op->dump_access_control_f();
-  end_header(s, dump_more, content_type,
-       proposed_content_length, force_content_type, force_no_error);
-}
-
-void abort_early(struct req_state *s, boost::function<void()> dump_more,
-               string& error_content, int err_no)
+void abort_early(struct req_state *s, RGWOp* op, int err_no,
+               RGWHandler* handler)
 {
+  string error_content("");
   if (!s->formatter) {
     s->formatter = new JSONFormatter;
     s->format = RGW_FORMAT_JSON;
   }
 
+  // op->error_handler is responsible for calling it's handler error_handler
+  if (op != NULL) {
+    int new_err_no;
+    new_err_no = op->error_handler(err_no, &error_content);
+    ldout(s->cct, 20) << "op->ERRORHANDLER: err_no=" << err_no
+                     << " new_err_no=" << new_err_no << dendl;
+    err_no = new_err_no;
+  } else if (handler != NULL) {
+    int new_err_no;
+    new_err_no = handler->error_handler(err_no, &error_content);
+    ldout(s->cct, 20) << "handler->ERRORHANDLER: err_no=" << err_no
+                     << " new_err_no=" << new_err_no << dendl;
+    err_no = new_err_no;
+  }
+
   // If the error handler(s) above dealt with it completely, they should have
   // returned 0. If non-zero, we need to continue here.
   if (err_no) {
     // Watch out, we might have a custom error state already set!
-    if (!s->err->http_ret || s->err->http_ret == 200) {
-      s->set_req_state_err(err_no);
+    if (!s->err.http_ret || s->err.http_ret == 200) {
+      set_req_state_err(s, err_no);
     }
     dump_errno(s);
     dump_bucket_from_state(s);
     if (err_no == -ERR_PERMANENT_REDIRECT || err_no == -ERR_WEBSITE_REDIRECT) {
       string dest_uri;
       if (!s->redirect.empty()) {
-       dest_uri = s->redirect;
+        dest_uri = s->redirect;
       } else if (!s->zonegroup_endpoint.empty()) {
         dest_uri = s->zonegroup_endpoint;
         /*
@@ -793,39 +793,15 @@ void abort_early(struct req_state *s, boost::function<void()> dump_more,
        *   x-amz-error-message: The specified key does not exist.
        *   x-amz-error-detail-Key: foo
        */
-      end_header(s, dump_more, NULL, error_content.size(), false, true);
+      end_header(s, op, NULL, error_content.size(), false, true);
       RESTFUL_IO(s)->send_body(error_content.c_str(), error_content.size());
     } else {
-      end_header(s, dump_more);
+      end_header(s, op);
     }
   }
   perfcounter->inc(l_rgw_failed_req);
 }
 
-void abort_early(struct req_state *s, RGWOp* op, int err_no,
-               RGWHandler* handler)
-{
-  string error_content("");
-  boost::function<void()> dump_more;
-
-  // op->error_handler is responsible for calling it's handler error_handler
-  if (op != NULL) {
-    int new_err_no;
-    new_err_no = op->error_handler(err_no, &error_content);
-    ldout(s->cct, 20) << "op->ERRORHANDLER: err_no=" << err_no
-                     << " new_err_no=" << new_err_no << dendl;
-    err_no = new_err_no;
-  } else if (handler != NULL) {
-    int new_err_no;
-    new_err_no = handler->error_handler(err_no, &error_content);
-    ldout(s->cct, 20) << "handler->ERRORHANDLER: err_no=" << err_no
-                     << " new_err_no=" << new_err_no << dendl;
-    err_no = new_err_no;
-  }
-  if (op) dump_more = op->dump_access_control_f();
-  abort_early(s, dump_more, error_content, err_no);
-}
-
 void dump_continue(struct req_state * const s)
 {
   try {
@@ -1105,7 +1081,7 @@ int RESTArgs::get_bool(struct req_state *s, const string& name, bool def_val, bo
 
 void RGWRESTFlusher::do_start(int ret)
 {
-  s->set_req_state_err(ret); /* no going back from here */
+  set_req_state_err(s, ret); /* no going back from here */
   dump_errno(s);
   dump_start(s);
   end_header(s, op);
@@ -1799,7 +1775,7 @@ int RGWDeleteMultiObj_ObjStore::get_params()
 void RGWRESTOp::send_response()
 {
   if (!flusher.did_start()) {
-    s->set_req_state_err(http_ret);
+    set_req_state_err(s, http_ret);
     dump_errno(s);
     end_header(s, this);
   }
index 0a9f0b9db7a902c15d6d6bc7ec7250e76389044f..41597a2d476b16e1e30d51b34a19db16a6726956 100644 (file)
@@ -20,7 +20,6 @@ extern std::map<std::string, std::string> rgw_to_http_attrs;
 extern string camelcase_dash_http_attr(const string& orig);
 extern string lowercase_dash_http_attr(const string& orig);
 
-extern void rgw_rest_init(CephContext *cct);
 extern void rgw_rest_init(CephContext *cct, RGWRados *store, RGWZoneGroup& zone_group);
 
 extern void rgw_flush_formatter_and_reset(struct req_state *s,
@@ -131,16 +130,16 @@ public:
 
 class RGWRESTFlusher : public RGWFormatterFlusher {
   struct req_state *s;
-  boost::function<void()> op;
+  RGWOp *op;
 protected:
   void do_flush() override;
   void do_start(int ret) override;
 public:
-  RGWRESTFlusher(struct req_state *_s, boost::function<void()> _op) :
+  RGWRESTFlusher(struct req_state *_s, RGWOp *_op) :
     RGWFormatterFlusher(_s->formatter), s(_s), op(_op) {}
   RGWRESTFlusher() : RGWFormatterFlusher(NULL), s(NULL), op(NULL) {}
 
-  void init(struct req_state *_s, boost::function<void()> _op) {
+  void init(struct req_state *_s, RGWOp *_op) {
     s = _s;
     op = _op;
     set_formatter(s->formatter);
@@ -463,7 +462,7 @@ public:
   void init(RGWRados *store, struct req_state *s,
             RGWHandler *dialect_handler) override {
     RGWOp::init(store, s, dialect_handler);
-    flusher.init(s, dump_access_control_f());
+    flusher.init(s, this);
   }
   void send_response() override;
   virtual int check_caps(RGWUserCaps& caps)
@@ -638,13 +637,6 @@ extern void end_header(struct req_state *s,
                       NO_CONTENT_LENGTH,
                       bool force_content_type = false,
                       bool force_no_error = false);
-extern void end_header(struct req_state *s,
-                       boost::function<void()> dump_more,
-                       const char *content_type = nullptr,
-                       const int64_t proposed_content_length =
-                      NO_CONTENT_LENGTH,
-                      bool force_content_type = false,
-                      bool force_no_error = false);
 extern void dump_start(struct req_state *s);
 extern void list_all_buckets_start(struct req_state *s);
 extern void dump_owner(struct req_state *s, const rgw_user& id, string& name,
@@ -708,8 +700,6 @@ extern void dump_time_header(struct req_state *s, const char *name, real_time t)
 extern void dump_last_modified(struct req_state *s, real_time t);
 extern void abort_early(struct req_state* s, RGWOp* op, int err,
                        RGWHandler* handler);
-extern void abort_early(struct req_state* s, boost::function<void()> dump_more,
-                       string& error_content, int err);
 extern void dump_range(struct req_state* s, uint64_t ofs, uint64_t end,
                       uint64_t total_size);
 extern void dump_continue(struct req_state *s);
index 4a4cb3901f7f97005a0de0af16ba25869f0d075f..3770cec15dedeaea04cbaa93cafeab69fedae63f 100644 (file)
@@ -33,7 +33,7 @@ void RGWOp_ZoneGroupMap_Get::execute() {
 }
 
 void RGWOp_ZoneGroupMap_Get::send_response() {
-  s->set_req_state_err(http_ret);
+  set_req_state_err(s, http_ret);
   dump_errno(s);
   end_header(s);
 
index 2e933c2ddc094f8a7f2a61eb363868d6ee2cec0a..9220917c99a63f2395715ebb65d91cad75f85363 100644 (file)
@@ -109,7 +109,7 @@ void RGWOp_MDLog_List::execute() {
 }
 
 void RGWOp_MDLog_List::send_response() {
-  s->set_req_state_err(http_ret);
+  set_req_state_err(s, http_ret);
   dump_errno(s);
   end_header(s);
 
@@ -140,7 +140,7 @@ void RGWOp_MDLog_Info::execute() {
 }
 
 void RGWOp_MDLog_Info::send_response() {
-  s->set_req_state_err(http_ret);
+  set_req_state_err(s, http_ret);
   dump_errno(s);
   end_header(s);
 
@@ -182,7 +182,7 @@ void RGWOp_MDLog_ShardInfo::execute() {
 }
 
 void RGWOp_MDLog_ShardInfo::send_response() {
-  s->set_req_state_err(http_ret);
+  set_req_state_err(s, http_ret);
   dump_errno(s);
   end_header(s);
 
@@ -435,7 +435,7 @@ void RGWOp_BILog_List::send_response() {
   if (sent_header)
     return;
 
-  s->set_req_state_err(http_ret);
+  set_req_state_err(s, http_ret);
   dump_errno(s);
   end_header(s);
 
@@ -505,7 +505,7 @@ void RGWOp_BILog_Info::execute() {
 }
 
 void RGWOp_BILog_Info::send_response() {
-  s->set_req_state_err(http_ret);
+  set_req_state_err(s, http_ret);
   dump_errno(s);
   end_header(s);
 
@@ -621,7 +621,7 @@ void RGWOp_DATALog_List::execute() {
 }
 
 void RGWOp_DATALog_List::send_response() {
-  s->set_req_state_err(http_ret);
+  set_req_state_err(s, http_ret);
   dump_errno(s);
   end_header(s);
 
@@ -656,7 +656,7 @@ void RGWOp_DATALog_Info::execute() {
 }
 
 void RGWOp_DATALog_Info::send_response() {
-  s->set_req_state_err(http_ret);
+  set_req_state_err(s, http_ret);
   dump_errno(s);
   end_header(s);
 
@@ -681,7 +681,7 @@ void RGWOp_DATALog_ShardInfo::execute() {
 }
 
 void RGWOp_DATALog_ShardInfo::send_response() {
-  s->set_req_state_err(http_ret);
+  set_req_state_err(s, http_ret);
   dump_errno(s);
   end_header(s);
 
@@ -869,7 +869,7 @@ void RGWOp_MDLog_Status::execute()
 
 void RGWOp_MDLog_Status::send_response()
 {
-  s->set_req_state_err(http_ret);
+  set_req_state_err(s, http_ret);
   dump_errno(s);
   end_header(s);
 
@@ -908,7 +908,7 @@ void RGWOp_DATALog_Status::execute()
 
 void RGWOp_DATALog_Status::send_response()
 {
-  s->set_req_state_err(http_ret);
+  set_req_state_err(s, http_ret);
   dump_errno(s);
   end_header(s);
 
index 792f49ab64d195a3d1810b824659f65c7d876fee..272e304f17ebf086dca7e878389d50821e726110 100644 (file)
@@ -201,7 +201,7 @@ void RGWOp_Metadata_Put::send_response() {
   int http_return_code = http_ret;
   if ((http_ret == STATUS_NO_APPLY) || (http_ret == STATUS_APPLIED))
     http_return_code = STATUS_NO_CONTENT;
-  s->set_req_state_err(http_return_code);
+  set_req_state_err(s, http_return_code);
   dump_errno(s);
   stringstream ver_stream;
   ver_stream << "ver:" << ondisk_version.ver
index af07980333325a2b5c5a5c939477336bf5bf4249..af9c024e13f7ba91ce0123c0fa25884e25aa2bd2 100644 (file)
@@ -75,7 +75,7 @@ void RGWOp_Opstate_List::send_response() {
   if (sent_header)
     return;
 
-  s->set_req_state_err(http_ret);
+  set_req_state_err(s, http_ret);
   dump_errno(s);
   end_header(s);
 
index 3dde7803cbd97f2f87f3ca8f4ea225604c775955..0f5abcdfe053841dbffc6fcaa7c004ca69f309a0 100644 (file)
@@ -26,13 +26,13 @@ class RGWOp_Period_Base : public RGWRESTOp {
 // reply with the period object on success
 void RGWOp_Period_Base::send_response()
 {
-  s->set_req_state_err(http_ret, error_stream.str());
+  set_req_state_err(s, http_ret, error_stream.str());
   dump_errno(s);
 
   if (http_ret < 0) {
-    if (!s->err->message.empty()) {
+    if (!s->err.message.empty()) {
       ldout(s->cct, 4) << "Request failed with " << http_ret
-          << ": " << s->err->message << dendl;
+          << ": " << s->err.message << dendl;
     }
     end_header(s);
     return;
@@ -263,7 +263,7 @@ void RGWOp_Realm_Get::execute()
 
 void RGWOp_Realm_Get::send_response()
 {
-  s->set_req_state_err(http_ret);
+  set_req_state_err(s, http_ret);
   dump_errno(s);
 
   if (http_ret < 0) {
index dd40c34286a23130a90c2487119bd68cf50dfd19..919815f572366027caa65dd53f79e99bf9c9266a 100644 (file)
@@ -108,7 +108,7 @@ void RGWOp_OBJLog_GetBounds::execute() {
 }
 
 void RGWOp_OBJLog_GetBounds::send_response() {
-  s->set_req_state_err(http_ret);
+  set_req_state_err(s, http_ret);
   dump_errno(s);
   end_header(s);
 
@@ -230,7 +230,7 @@ void RGWOp_BILog_GetBounds::execute() {
 }
 
 void RGWOp_BILog_GetBounds::send_response() {
-  s->set_req_state_err(http_ret);
+  set_req_state_err(s, http_ret);
   dump_errno(s);
   end_header(s);
 
index 9c7ac61b0c9222bfa780fa0b2aa41d58621bd0e2..a45521b597ab078c6f8da5c2f2c86b1752d09c8b 100644 (file)
@@ -99,10 +99,10 @@ int RGWGetObj_ObjStore_S3Website::send_response_data(bufferlist& bl, off_t bl_of
   if (iter != attrs.end()) {
     bufferlist &bl = iter->second;
     s->redirect = string(bl.c_str(), bl.length());
-    s->err->http_ret = 301;
+    s->err.http_ret = 301;
     ldout(s->cct, 20) << __CEPH_ASSERT_FUNCTION << " redirecting per x-amz-website-redirect-location=" << s->redirect << dendl;
     op_ret = -ERR_WEBSITE_REDIRECT;
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
     dump_errno(s);
     dump_content_length(s, 0);
     dump_redirect(s, s->redirect);
@@ -168,11 +168,11 @@ int RGWGetObj_ObjStore_S3::send_response_data(bufferlist& bl, off_t bl_ofs,
     goto send_data;
 
   if (custom_http_ret) {
-    s->set_req_state_err(0);
+    set_req_state_err(s, 0);
     dump_errno(s, custom_http_ret);
   } else {
-    s->set_req_state_err((partial_content && !op_ret) ? STATUS_PARTIAL_CONTENT
-                 : op_ret);
+    set_req_state_err(s, (partial_content && !op_ret) ? STATUS_PARTIAL_CONTENT
+                  : op_ret);
     dump_errno(s);
   }
 
@@ -340,7 +340,7 @@ int RGWGetObj_ObjStore_S3::get_decrypt_filter(std::unique_ptr<RGWGetDataCB> *fil
 void RGWListBuckets_ObjStore_S3::send_response_begin(bool has_buckets)
 {
   if (op_ret)
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   dump_errno(s);
   dump_start(s);
   end_header(s, NULL, "application/xml");
@@ -406,7 +406,7 @@ static void dump_usage_categories_info(Formatter *formatter, const rgw_usage_log
 void RGWGetUsage_ObjStore_S3::send_response()
 {
   if (op_ret < 0)
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   dump_errno(s);
 
   end_header(s, this, "application/xml");
@@ -618,7 +618,7 @@ void RGWListBucket_ObjStore_S3::send_versioned_response()
 void RGWListBucket_ObjStore_S3::send_response()
 {
   if (op_ret < 0)
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   dump_errno(s);
 
   end_header(s, this, "application/xml");
@@ -816,7 +816,7 @@ int RGWSetBucketVersioning_ObjStore_S3::get_params()
 void RGWSetBucketVersioning_ObjStore_S3::send_response()
 {
   if (op_ret)
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s);
 }
@@ -867,7 +867,7 @@ int RGWSetBucketWebsite_ObjStore_S3::get_params()
 void RGWSetBucketWebsite_ObjStore_S3::send_response()
 {
   if (op_ret < 0)
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s);
 }
@@ -877,7 +877,7 @@ void RGWDeleteBucketWebsite_ObjStore_S3::send_response()
   if (op_ret == 0) {
     op_ret = STATUS_NO_CONTENT;
   }
-  s->set_req_state_err(op_ret);
+  set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s);
 }
@@ -885,7 +885,7 @@ void RGWDeleteBucketWebsite_ObjStore_S3::send_response()
 void RGWGetBucketWebsite_ObjStore_S3::send_response()
 {
   if (op_ret)
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s, this, "application/xml");
   dump_start(s);
@@ -914,7 +914,7 @@ void RGWStatBucket_ObjStore_S3::send_response()
     dump_bucket_metadata(s, bucket);
   }
 
-  s->set_req_state_err(op_ret);
+  set_req_state_err(s, op_ret);
   dump_errno(s);
 
   end_header(s, this);
@@ -1054,7 +1054,7 @@ void RGWCreateBucket_ObjStore_S3::send_response()
   if (op_ret == -ERR_BUCKET_EXISTS)
     op_ret = 0;
   if (op_ret)
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s);
 
@@ -1079,7 +1079,7 @@ void RGWDeleteBucket_ObjStore_S3::send_response()
   if (!r)
     r = STATUS_NO_CONTENT;
 
-  s->set_req_state_err(r);
+  set_req_state_err(s, r);
   dump_errno(s);
   end_header(s, this);
 
@@ -1359,13 +1359,13 @@ static int get_success_retcode(int code)
 void RGWPutObj_ObjStore_S3::send_response()
 {
   if (op_ret) {
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
     dump_errno(s);
   } else {
     if (s->cct->_conf->rgw_s3_success_create_obj_status) {
       op_ret = get_success_retcode(
        s->cct->_conf->rgw_s3_success_create_obj_status);
-      s->set_req_state_err(op_ret);
+      set_req_state_err(s, op_ret);
     }
     if (!copy_source) {
       dump_errno(s);
@@ -1405,7 +1405,6 @@ static inline int get_obj_attrs(RGWRados *store, struct req_state *s, rgw_obj& o
   RGWRados::Object::Read read_op(&op_target);
 
   read_op.params.attrs = &attrs;
-  read_op.params.perr = &s->err;
 
   return read_op.prepare();
 }
@@ -1887,8 +1886,8 @@ done:
     s->formatter->dump_string("Key", s->object.name);
     s->formatter->close_section();
   }
-  s->err->message = err_msg;
-  s->set_req_state_err(op_ret);
+  s->err.message = err_msg;
+  set_req_state_err(s, op_ret);
   dump_errno(s);
   if (op_ret >= 0) {
     dump_content_length(s, s->formatter->get_len());
@@ -1947,7 +1946,7 @@ void RGWDeleteObj_ObjStore_S3::send_response()
   if (!r)
     r = STATUS_NO_CONTENT;
 
-  s->set_req_state_err(r);
+  set_req_state_err(s, r);
   dump_errno(s);
   if (!version_id.empty()) {
     dump_header(s, "x-amz-version-id", version_id);
@@ -2036,7 +2035,7 @@ void RGWCopyObj_ObjStore_S3::send_partial_response(off_t ofs)
 {
   if (! sent_header) {
     if (op_ret)
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
     dump_errno(s);
 
     end_header(s, this, "application/xml");
@@ -2072,7 +2071,7 @@ void RGWCopyObj_ObjStore_S3::send_response()
 void RGWGetACLs_ObjStore_S3::send_response()
 {
   if (op_ret)
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s, this, "application/xml");
   dump_start(s);
@@ -2118,7 +2117,7 @@ int RGWPutACLs_ObjStore_S3::get_policy_from_state(RGWRados *store,
 void RGWPutACLs_ObjStore_S3::send_response()
 {
   if (op_ret)
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s, this, "application/xml");
   dump_start(s);
@@ -2148,9 +2147,9 @@ void RGWGetLC_ObjStore_S3::send_response()
 {
   if (op_ret) {
     if (op_ret == -ENOENT) {   
-      s->set_req_state_err(ERR_NO_SUCH_LC);
+      set_req_state_err(s, ERR_NO_SUCH_LC);
     } else {
-      s->set_req_state_err(op_ret);
+      set_req_state_err(s, op_ret);
     }
   }
   dump_errno(s);
@@ -2167,7 +2166,7 @@ void RGWGetLC_ObjStore_S3::send_response()
 void RGWPutLC_ObjStore_S3::send_response()
 {
   if (op_ret)
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s, this, "application/xml");
   dump_start(s);
@@ -2178,7 +2177,7 @@ void RGWDeleteLC_ObjStore_S3::send_response()
   if (op_ret == 0)
       op_ret = STATUS_NO_CONTENT;
   if (op_ret) {   
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   }
   dump_errno(s);
   end_header(s, this, "application/xml");
@@ -2189,9 +2188,9 @@ void RGWGetCORS_ObjStore_S3::send_response()
 {
   if (op_ret) {
     if (op_ret == -ENOENT)
-      s->set_req_state_err(ERR_NOT_FOUND);
+      set_req_state_err(s, ERR_NOT_FOUND);
     else
-      s->set_req_state_err(op_ret);
+      set_req_state_err(s, op_ret);
   }
   dump_errno(s);
   end_header(s, NULL, "application/xml");
@@ -2259,7 +2258,7 @@ int RGWPutCORS_ObjStore_S3::get_params()
 void RGWPutCORS_ObjStore_S3::send_response()
 {
   if (op_ret)
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s, NULL, "application/xml");
   dump_start(s);
@@ -2271,7 +2270,7 @@ void RGWDeleteCORS_ObjStore_S3::send_response()
   if (!r || r == -ENOENT)
     r = STATUS_NO_CONTENT;
 
-  s->set_req_state_err(r);
+  set_req_state_err(s, r);
   dump_errno(s);
   end_header(s, NULL);
 }
@@ -2286,7 +2285,7 @@ void RGWOptionsCORS_ObjStore_S3::send_response()
   if (op_ret == -ENOENT)
     op_ret = -EACCES;
   if (op_ret < 0) {
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
     dump_errno(s);
     end_header(s, NULL);
     return;
@@ -2381,7 +2380,7 @@ done:
 void RGWSetRequestPayment_ObjStore_S3::send_response()
 {
   if (op_ret)
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s);
 }
@@ -2401,7 +2400,7 @@ int RGWInitMultipart_ObjStore_S3::get_params()
 void RGWInitMultipart_ObjStore_S3::send_response()
 {
   if (op_ret)
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   dump_errno(s);
   for (auto &it : crypt_http_responses)
      dump_header(s, it.first, it.second);
@@ -2445,7 +2444,7 @@ int RGWCompleteMultipart_ObjStore_S3::get_params()
 void RGWCompleteMultipart_ObjStore_S3::send_response()
 {
   if (op_ret)
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s, this, "application/xml");
   if (op_ret == 0) { 
@@ -2480,7 +2479,7 @@ void RGWAbortMultipart_ObjStore_S3::send_response()
   if (!r)
     r = STATUS_NO_CONTENT;
 
-  s->set_req_state_err(r);
+  set_req_state_err(s, r);
   dump_errno(s);
   end_header(s, this);
 }
@@ -2488,7 +2487,7 @@ void RGWAbortMultipart_ObjStore_S3::send_response()
 void RGWListMultipart_ObjStore_S3::send_response()
 {
   if (op_ret)
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s, this, "application/xml");
 
@@ -2538,7 +2537,7 @@ void RGWListMultipart_ObjStore_S3::send_response()
 void RGWListBucketMultiparts_ObjStore_S3::send_response()
 {
   if (op_ret < 0)
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   dump_errno(s);
 
   end_header(s, this, "application/xml");
@@ -2616,7 +2615,7 @@ void RGWDeleteMultiObj_ObjStore_S3::send_status()
 {
   if (! status_dumped) {
     if (op_ret < 0)
-      s->set_req_state_err(op_ret);
+      set_req_state_err(s, op_ret);
     dump_errno(s);
     status_dumped = true;
   }
@@ -3867,7 +3866,7 @@ int RGWHandler_REST_S3Website::retarget(RGWOp* op, RGWOp** new_op) {
                    &redirect_code);
     // APply a custom HTTP response code
     if (redirect_code > 0)
-      s->err->http_ret = redirect_code; // Apply a custom HTTP response code
+      s->err.http_ret = redirect_code; // Apply a custom HTTP response code
     ldout(s->cct, 10) << "retarget redirect code=" << redirect_code
                      << " proto+host:" << protocol << "://" << hostname
                      << " -> " << s->redirect << dendl;
@@ -3990,7 +3989,7 @@ int RGWHandler_REST_S3Website::error_handler(int err_no,
                    &redirect_code);
     // Apply a custom HTTP response code
     if (redirect_code > 0)
-      s->err->http_ret = redirect_code; // Apply a custom HTTP response code
+      s->err.http_ret = redirect_code; // Apply a custom HTTP response code
     ldout(s->cct, 10) << "error handler redirect code=" << redirect_code
                      << " proto+host:" << protocol << "://" << hostname
                      << " -> " << s->redirect << dendl;
index f05ced9e28228ceda9af68f62f8a97650c57f91d..6cca4f2efc2979055b8cba1a128d6e9e16c814b1 100644 (file)
 #define dout_context g_ceph_context
 #define dout_subsys ceph_subsys_rgw
 
-struct swift_err : public rgw_err {
-  swift_err(struct req_state *s) : rgw_err(s) {};
-
-  virtual bool set_rgw_err(int err_no) {
-    rgw_http_errors::const_iterator r;
-
-    r = rgw_http_swift_errors.find(err_no);
-    if (r != rgw_http_swift_errors.end()) {
-      http_ret = r->second.first;
-      s3_code = r->second.second;
-      return true;
-    }
-    return rgw_err::set_rgw_err(err_no);
-  }
-};
-
 int RGWListBuckets_ObjStore_SWIFT::get_params()
 {
   prefix = s->info.args.get("prefix");
@@ -156,10 +140,10 @@ static void dump_account_metadata(struct req_state * const s,
 void RGWListBuckets_ObjStore_SWIFT::send_response_begin(bool has_buckets)
 {
   if (op_ret) {
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   } else if (!has_buckets && s->format == RGW_FORMAT_PLAIN) {
     op_ret = STATUS_NO_CONTENT;
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
   }
 
   if (! s->cct->_conf->rgw_swift_enforce_content_length) {
@@ -376,7 +360,7 @@ next:
     op_ret = 0;
   }
 
-  s->set_req_state_err(op_ret);
+  set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s, this, NULL, content_len);
   if (op_ret < 0) {
@@ -493,7 +477,7 @@ void RGWStatAccount_ObjStore_SWIFT::send_response()
             static_cast<RGWAccessControlPolicy_SWIFTAcct&>(*s->user_acl));
   }
 
-  s->set_req_state_err(op_ret);
+  set_req_state_err(s, op_ret);
   dump_errno(s);
 
   end_header(s, NULL, NULL, 0,  true);
@@ -509,7 +493,7 @@ void RGWStatBucket_ObjStore_SWIFT::send_response()
                             s->bucket_info.website_conf);
   }
 
-  s->set_req_state_err(op_ret);
+  set_req_state_err(s, op_ret);
   dump_errno(s);
 
   end_header(s, this, NULL, 0, true);
@@ -668,7 +652,7 @@ void RGWCreateBucket_ObjStore_SWIFT::send_response()
     op_ret = STATUS_CREATED;
   else if (op_ret == -ERR_BUCKET_EXISTS)
     op_ret = STATUS_ACCEPTED;
-  s->set_req_state_err(op_ret);
+  set_req_state_err(s, op_ret);
   dump_errno(s);
   /* Propose ending HTTP header with 0 Content-Length header. */
   end_header(s, NULL, NULL, 0);
@@ -681,7 +665,7 @@ void RGWDeleteBucket_ObjStore_SWIFT::send_response()
   if (!r)
     r = STATUS_NO_CONTENT;
 
-  s->set_req_state_err(r);
+  set_req_state_err(s, r);
   dump_errno(s);
   end_header(s, this, NULL, 0);
   rgw_flush_formatter_and_reset(s, s->formatter);
@@ -854,7 +838,7 @@ void RGWPutObj_ObjStore_SWIFT::send_response()
   }
 
   dump_last_modified(s, mtime);
-  s->set_req_state_err(op_ret);
+  set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s, this);
   rgw_flush_formatter_and_reset(s, s->formatter);
@@ -911,7 +895,7 @@ void RGWPutMetadataAccount_ObjStore_SWIFT::send_response()
   if (! op_ret) {
     op_ret = STATUS_NO_CONTENT;
   }
-  s->set_req_state_err(op_ret);
+  set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s, this);
   rgw_flush_formatter_and_reset(s, s->formatter);
@@ -941,7 +925,7 @@ void RGWPutMetadataBucket_ObjStore_SWIFT::send_response()
   if (!op_ret && (op_ret != -EINVAL)) {
     op_ret = STATUS_NO_CONTENT;
   }
-  s->set_req_state_err(op_ret);
+  set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s, this);
   rgw_flush_formatter_and_reset(s, s->formatter);
@@ -971,7 +955,7 @@ void RGWPutMetadataObject_ObjStore_SWIFT::send_response()
   if (! op_ret) {
     op_ret = STATUS_ACCEPTED;
   }
-  s->set_req_state_err(op_ret);
+  set_req_state_err(s, op_ret);
   if (!s->is_err()) {
     dump_content_length(s, 0);
   }
@@ -983,9 +967,10 @@ void RGWPutMetadataObject_ObjStore_SWIFT::send_response()
 static void bulkdelete_respond(const unsigned num_deleted,
                                const unsigned int num_unfound,
                                const std::list<RGWBulkDelete::fail_desc_t>& failures,
-                               struct req_state *s)                  /* out */
+                               const int prot_flags,                  /* in  */
+                               ceph::Formatter& formatter)            /* out */
 {
-  s->formatter->open_object_section("delete");
+  formatter.open_object_section("delete");
 
   string resp_status;
   string resp_body;
@@ -997,9 +982,8 @@ static void bulkdelete_respond(const unsigned num_deleted,
         reason = fail_desc.err;
       }
     }
-
-    swift_err err(s);
-    err.set_rgw_err(reason);
+    rgw_err err;
+    set_req_state_err(err, reason, prot_flags);
     dump_errno(err, resp_status);
   } else if (0 == num_deleted && 0 == num_unfound) {
     /* 400 Bad Request */
@@ -1010,29 +994,29 @@ static void bulkdelete_respond(const unsigned num_deleted,
     dump_errno(200, resp_status);
   }
 
-  encode_json("Number Deleted", num_deleted, s->formatter);
-  encode_json("Number Not Found", num_unfound, s->formatter);
-  encode_json("Response Body", resp_body, s->formatter);
-  encode_json("Response Status", resp_status, s->formatter);
+  encode_json("Number Deleted", num_deleted, &formatter);
+  encode_json("Number Not Found", num_unfound, &formatter);
+  encode_json("Response Body", resp_body, &formatter);
+  encode_json("Response Status", resp_status, &formatter);
 
-  s->formatter->open_array_section("Errors");
+  formatter.open_array_section("Errors");
   for (const auto fail_desc : failures) {
-    s->formatter->open_array_section("object");
+    formatter.open_array_section("object");
 
     stringstream ss_name;
     ss_name << fail_desc.path;
-    encode_json("Name", ss_name.str(), s->formatter);
+    encode_json("Name", ss_name.str(), &formatter);
 
-    swift_err err(s);
-    err.set_rgw_err(fail_desc.err);
+    rgw_err err;
+    set_req_state_err(err, fail_desc.err, prot_flags);
     string status;
     dump_errno(err, status);
-    encode_json("Status", status, s->formatter);
-    s->formatter->close_section();
+    encode_json("Status", status, &formatter);
+    formatter.close_section();
   }
-  s->formatter->close_section();
+  formatter.close_section();
 
-  s->formatter->close_section();
+  formatter.close_section();
 }
 
 int RGWDeleteObj_ObjStore_SWIFT::verify_permission()
@@ -1067,7 +1051,7 @@ void RGWDeleteObj_ObjStore_SWIFT::send_response()
     r = STATUS_NO_CONTENT;
   }
 
-  s->set_req_state_err(r);
+  set_req_state_err(s, r);
   dump_errno(s);
 
   if (multipart_delete) {
@@ -1078,9 +1062,10 @@ void RGWDeleteObj_ObjStore_SWIFT::send_response()
       bulkdelete_respond(deleter->get_num_deleted(),
                          deleter->get_num_unfound(),
                          deleter->get_failures(),
-                         s);
+                         s->prot_flags,
+                         *s->formatter);
     } else if (-ENOENT == op_ret) {
-      bulkdelete_respond(0, 1, {}, s);
+      bulkdelete_respond(0, 1, {}, s->prot_flags, *s->formatter);
     } else {
       RGWBulkDelete::acct_path_t path;
       path.bucket_name = s->bucket_name;
@@ -1090,7 +1075,7 @@ void RGWDeleteObj_ObjStore_SWIFT::send_response()
       fail_desc.err = op_ret;
       fail_desc.path = path;
 
-      bulkdelete_respond(0, 0, { fail_desc }, s);
+      bulkdelete_respond(0, 0, { fail_desc }, s->prot_flags, *s->formatter);
     }
   } else {
     end_header(s, this);
@@ -1204,7 +1189,7 @@ void RGWCopyObj_ObjStore_SWIFT::send_partial_response(off_t ofs)
   if (! sent_header) {
     if (! op_ret)
       op_ret = STATUS_CREATED;
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
     dump_errno(s);
     end_header(s, this);
 
@@ -1241,7 +1226,7 @@ void RGWCopyObj_ObjStore_SWIFT::send_response()
     string content_type;
     if (! op_ret)
       op_ret = STATUS_CREATED;
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
     dump_errno(s);
     dump_etag(s, etag);
     dump_last_modified(s, mtime);
@@ -1303,10 +1288,10 @@ int RGWGetObj_ObjStore_SWIFT::send_response_data(bufferlist& bl,
   }
 
   if (custom_http_ret) {
-    s->set_req_state_err(0);
+    set_req_state_err(s, 0);
     dump_errno(s, custom_http_ret);
   } else {
-    s->set_req_state_err((partial_content && !op_ret) ? STATUS_PARTIAL_CONTENT
+    set_req_state_err(s, (partial_content && !op_ret) ? STATUS_PARTIAL_CONTENT
                    : op_ret);
     dump_errno(s);
 
@@ -1373,7 +1358,7 @@ void RGWOptionsCORS_ObjStore_SWIFT::send_response()
   if (op_ret == -ENOENT)
     op_ret = -EACCES;
   if (op_ret < 0) {
-    s->set_req_state_err(op_ret);
+    set_req_state_err(s, op_ret);
     dump_errno(s);
     end_header(s, NULL);
     return;
@@ -1440,7 +1425,7 @@ int RGWBulkDelete_ObjStore_SWIFT::get_data(
 
 void RGWBulkDelete_ObjStore_SWIFT::send_response()
 {
-  s->set_req_state_err(op_ret);
+  set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s, this /* RGWOp */, nullptr /* contype */,
              CHUNKED_TRANSFER_ENCODING);
@@ -1448,7 +1433,8 @@ void RGWBulkDelete_ObjStore_SWIFT::send_response()
   bulkdelete_respond(deleter->get_num_deleted(),
                      deleter->get_num_unfound(),
                      deleter->get_failures(),
-                     s);
+                     s->prot_flags,
+                     *s->formatter);
   rgw_flush_formatter_and_reset(s, s->formatter);
 }
 
@@ -1584,7 +1570,7 @@ void RGWBulkUploadOp_ObjStore_SWIFT::send_response()
 
 void RGWGetCrossDomainPolicy_ObjStore_SWIFT::send_response()
 {
-  s->set_req_state_err(op_ret);
+  set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s, this, "application/xml");
 
@@ -1602,7 +1588,7 @@ void RGWGetCrossDomainPolicy_ObjStore_SWIFT::send_response()
 
 void RGWGetHealthCheck_ObjStore_SWIFT::send_response()
 {
-  s->set_req_state_err(op_ret);
+  set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s, this, "application/xml");
 
@@ -1660,7 +1646,7 @@ void RGWInfo_ObjStore_SWIFT::send_response()
   if (op_ret <  0) {
     op_ret = STATUS_NO_CONTENT;
   }
-  s->set_req_state_err(op_ret);
+  set_req_state_err(s, op_ret);
   dump_errno(s);
   end_header(s, this);
   rgw_flush_formatter_and_reset(s, s->formatter);
@@ -2086,9 +2072,8 @@ int RGWSwiftWebsiteHandler::error_handler(const int err_no,
   const auto& ws_conf = s->bucket_info.website_conf;
 
   if (can_be_website_req() && ! ws_conf.error_doc.empty()) {
-    struct rgw_err err(s);
-    set_req_state_err(err, err_no, s->prot_flags);
-    return serve_errordoc(err.http_ret, ws_conf.error_doc);
+    set_req_state_err(s, err_no);
+    return serve_errordoc(s->err.http_ret, ws_conf.error_doc);
   }
 
   /* Let's go to the default, no-op handler. */
@@ -2144,7 +2129,7 @@ RGWOp* RGWSwiftWebsiteHandler::get_ws_redirect_op()
     }
 
     void send_response() override {
-      s->set_req_state_err(op_ret);
+      set_req_state_err(s, op_ret);
       dump_errno(s);
       dump_content_length(s, 0);
       dump_redirect(s, location);
@@ -2189,7 +2174,7 @@ RGWOp* RGWSwiftWebsiteHandler::get_ws_listing_op()
 
     void send_response() override {
       /* Generate the header now. */
-      s->set_req_state_err(op_ret);
+      set_req_state_err(s, op_ret);
       dump_errno(s);
       dump_container_metadata(s, bucket, bucket_quota,
                               s->bucket_info.website_conf);
@@ -2625,8 +2610,6 @@ int RGWHandler_REST_SWIFT::init_from_header(struct req_state* const s,
   string req;
   string first;
 
-  assert(!s->err);
-  s->err = new swift_err(s);
   s->prot_flags |= RGW_REST_SWIFT;
 
   char reqbuf[frontend_prefix.length() + s->decoded_uri.length() + 1];
index 4365385d8e5a3aae50b464fadef132f7d75f5edf..cc26db4fcce50526f3a2f725d1931a1716c6af6a 100644 (file)
@@ -627,7 +627,7 @@ void RGW_SWIFT_Auth_Get::execute()
   ret = STATUS_NO_CONTENT;
 
 done:
-  s->set_req_state_err(ret);
+  set_req_state_err(s, ret);
   dump_errno(s);
   end_header(s);
 }