(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);
<< 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)
req->exec_start();
done:
- return (ret < 0 ? ret : s->err->ret);
+ return (ret < 0 ? ret : s->err.ret);
}
int RGWLibProcess::finish_request(RGWLibContinuedReq* req)
#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"
using namespace ceph::crypto;
rgw_err::
-rgw_err(req_state *s) : s(*s)
+rgw_err()
{
clear();
}
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;
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 */
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;
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 {
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)
/** 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
{
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;
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 {
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 */
}
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;
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;
#ifndef CEPH_RGW_LOG_H
#define CEPH_RGW_LOG_H
-
#include <boost/container/flat_map.hpp>
#include "rgw_common.h"
#include "include/utime.h"
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) {
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,
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 {}
};
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 {
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;
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();
<< " ======"
<< dendl;
- return (ret < 0 ? ret : s->err->ret);
+ return (ret < 0 ? ret : s->err.ret);
} /* process_request */
#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"
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;
}
}
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;
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)
}
}
-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;
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) {
}
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) {
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;
/*
* 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 {
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);
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);
}
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,
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);
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)
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,
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);
}
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);
}
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);
}
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);
}
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);
if (sent_header)
return;
- s->set_req_state_err(http_ret);
+ set_req_state_err(s, http_ret);
dump_errno(s);
end_header(s);
}
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);
}
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);
}
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);
}
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);
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);
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);
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
if (sent_header)
return;
- s->set_req_state_err(http_ret);
+ set_req_state_err(s, http_ret);
dump_errno(s);
end_header(s);
// 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;
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) {
}
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);
}
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);
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);
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);
}
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");
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");
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");
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);
}
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);
}
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);
}
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);
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);
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);
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);
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);
RGWRados::Object::Read read_op(&op_target);
read_op.params.attrs = &attrs;
- read_op.params.perr = &s->err;
return read_op.prepare();
}
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());
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);
{
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");
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);
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);
{
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);
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);
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");
{
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");
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);
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);
}
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;
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);
}
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);
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) {
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);
}
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");
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");
{
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;
}
&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;
&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;
#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");
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) {
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) {
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);
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);
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);
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);
}
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);
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);
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);
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);
}
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;
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 */
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()
r = STATUS_NO_CONTENT;
}
- s->set_req_state_err(r);
+ set_req_state_err(s, r);
dump_errno(s);
if (multipart_delete) {
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;
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);
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);
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);
}
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);
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;
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);
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);
}
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");
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");
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);
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. */
}
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);
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);
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];
ret = STATUS_NO_CONTENT;
done:
- s->set_req_state_err(ret);
+ set_req_state_err(s, ret);
dump_errno(s);
end_header(s);
}