RGWRESTMgr *mgr;
RGWHandler *handler = rest->get_handler(store, s, &client_io, &mgr, &init_error);
if (init_error != 0) {
- abort_early(s, init_error);
+ abort_early(s, NULL, init_error);
goto done;
}
req->log(s, "getting op");
op = handler->get_op(store);
if (!op) {
- abort_early(s, -ERR_METHOD_NOT_ALLOWED);
+ abort_early(s, NULL, -ERR_METHOD_NOT_ALLOWED);
goto done;
}
req->op = op;
ret = handler->authorize();
if (ret < 0) {
dout(10) << "failed to authorize request" << dendl;
- abort_early(s, ret);
+ abort_early(s, op, ret);
goto done;
}
if (s->user.suspended) {
dout(10) << "user is suspended, uid=" << s->user.user_id << dendl;
- abort_early(s, -ERR_USER_SUSPENDED);
+ abort_early(s, op, -ERR_USER_SUSPENDED);
goto done;
}
req->log(s, "reading permissions");
ret = handler->read_permissions(op);
if (ret < 0) {
- abort_early(s, ret);
+ abort_early(s, op, ret);
goto done;
}
req->log(s, "verifying op mask");
ret = op->verify_op_mask();
if (ret < 0) {
- abort_early(s, ret);
+ abort_early(s, op, ret);
goto done;
}
if (s->system_request) {
dout(2) << "overriding permissions due to system operation" << dendl;
} else {
- abort_early(s, ret);
+ abort_early(s, op, ret);
goto done;
}
}
req->log(s, "verifying op params");
ret = op->verify_params();
if (ret < 0) {
- abort_early(s, ret);
+ abort_early(s, op, ret);
goto done;
}
}
}
-void end_header(struct req_state *s, const char *content_type)
+void end_header(struct req_state *s, RGWOp *op, const char *content_type)
{
string ctype;
+ if (op) {
+ dump_access_control(s, op);
+ }
+
if (!content_type || s->err.is_err()) {
switch (s->format) {
case RGW_FORMAT_XML:
rgw_flush_formatter_and_reset(s, s->formatter);
}
-void abort_early(struct req_state *s, int err_no)
+void abort_early(struct req_state *s, RGWOp *op, int err_no)
{
if (!s->formatter) {
s->formatter = new JSONFormatter;
}
set_req_state_err(s, err_no);
dump_errno(s);
- end_header(s);
+ end_header(s, op);
rgw_flush_formatter_and_reset(s, s->formatter);
perfcounter->inc(l_rgw_failed_req);
}
set_req_state_err(s, ret); /* no going back from here */
dump_errno(s);
dump_start(s);
- end_header(s);
+ end_header(s, op);
rgw_flush_formatter_and_reset(s, s->formatter);
}
if (!flusher.did_start()) {
set_req_state_err(s, http_ret);
dump_errno(s);
- end_header(s);
+ end_header(s, this);
}
flusher.flush();
}
class RGWRESTFlusher : public RGWFormatterFlusher {
struct req_state *s;
+ RGWOp *op;
protected:
virtual void do_flush();
virtual void do_start(int ret);
public:
- RGWRESTFlusher(struct req_state *_s) : RGWFormatterFlusher(_s->formatter), s(_s) {}
- RGWRESTFlusher() : RGWFormatterFlusher(NULL), s(NULL) {}
+ 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) {
+ void init(struct req_state *_s, RGWOp *_op) {
s = _s;
+ op = _op;
set_formatter(s->formatter);
}
};
RGWRESTOp() : http_ret(0) {}
virtual void init(RGWRados *store, struct req_state *s, RGWHandler *dialect_handler) {
RGWOp::init(store, s, dialect_handler);
- flusher.init(s);
+ flusher.init(s, this);
}
virtual void send_response();
virtual int check_caps(RGWUserCaps& caps) { return -EPERM; } /* should to be implemented! */
extern void set_req_state_err(struct req_state *s, int err_no);
extern void dump_errno(struct req_state *s);
extern void dump_errno(struct req_state *s, int ret);
-extern void end_header(struct req_state *s, const char *content_type = NULL);
+extern void end_header(struct req_state *s, RGWOp *op = NULL, const char *content_type = NULL);
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, string& id, string& name, const char *section = NULL);
extern void dump_etag(struct req_state *s, const char *etag);
extern void dump_epoch_header(struct req_state *s, const char *name, time_t t);
extern void dump_last_modified(struct req_state *s, time_t t);
-extern void abort_early(struct req_state *s, int err);
+extern void abort_early(struct req_state *s, RGWOp *op, 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);
extern void list_all_buckets_end(struct req_state *s);
if (!content_type)
content_type = "binary/octet-stream";
- dump_access_control(s, this);
- end_header(s, content_type);
+ end_header(s, this, content_type);
if (metadata_bl.length()) {
s->cio->write(metadata_bl.c_str(), metadata_bl.length());
set_req_state_err(s, ret);
dump_errno(s);
dump_start(s);
- end_header(s, "application/xml");
+ end_header(s, NULL, "application/xml");
if (!ret) {
list_all_buckets_start(s);
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s, "application/xml");
+ end_header(s, this, "application/xml");
dump_start(s);
if (ret < 0)
return;
void RGWGetBucketLogging_ObjStore_S3::send_response()
{
dump_errno(s);
- end_header(s, "application/xml");
+ end_header(s, this, "application/xml");
dump_start(s);
s->formatter->open_object_section_in_ns("BucketLoggingStatus",
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s);
+ end_header(s, this);
dump_start(s);
}
set_req_state_err(s, r);
dump_errno(s);
- end_header(s);
+ end_header(s, this);
if (s->system_request) {
JSONFormatter f; /* use json formatter for system requests output */
dump_epoch_header(s, "Rgwx-Mtime", mtime);
}
dump_errno(s);
- end_header(s);
+ end_header(s, this);
}
/*
set_req_state_err(s, ret);
dump_errno(s);
dump_content_length(s, s->formatter->get_len());
- end_header(s);
+ end_header(s, this);
if (ret != STATUS_CREATED)
return;
set_req_state_err(s, r);
dump_errno(s);
- end_header(s);
+ end_header(s, this);
}
int RGWCopyObj_ObjStore_S3::init_dest_policy()
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s, "binary/octet-stream");
+ end_header(s, this, "binary/octet-stream");
if (ret == 0) {
s->formatter->open_object_section("CopyObjectResult");
}
if (ret)
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s, "application/xml");
+ end_header(s, this, "application/xml");
dump_start(s);
s->cio->write(acls.c_str(), acls.size());
}
if (ret)
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s, "application/xml");
+ end_header(s, this, "application/xml");
dump_start(s);
}
set_req_state_err(s, ret);
}
dump_errno(s);
- end_header(s, "application/xml");
+ end_header(s, NULL, "application/xml");
dump_start(s);
if (!ret) {
string cors;
if (ret)
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s, "application/xml");
+ end_header(s, NULL, "application/xml");
dump_start(s);
}
set_req_state_err(s, r);
dump_errno(s);
- end_header(s);
+ end_header(s, NULL);
}
void RGWOptionsCORS_ObjStore_S3::send_response()
} else {
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s);
+ end_header(s, NULL);
return;
}
dump_errno(s);
dump_access_control(s, origin, req_meth, hdrs.c_str(), exp_hdrs.c_str(), max_age);
- end_header(s);
+ end_header(s, NULL);
}
int RGWInitMultipart_ObjStore_S3::get_params()
if (ret)
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s, "application/xml");
+ end_header(s, this, "application/xml");
if (ret == 0) {
dump_start(s);
s->formatter->open_object_section_in_ns("InitiateMultipartUploadResult",
if (ret)
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s, "application/xml");
+ end_header(s, this, "application/xml");
if (ret == 0) {
dump_start(s);
s->formatter->open_object_section_in_ns("CompleteMultipartUploadResult",
set_req_state_err(s, r);
dump_errno(s);
- end_header(s);
+ end_header(s, this);
}
void RGWListMultipart_ObjStore_S3::send_response()
if (ret)
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s, "application/xml");
+ end_header(s, this, "application/xml");
if (ret == 0) {
dump_start(s);
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s, "application/xml");
+ end_header(s, this, "application/xml");
dump_start(s);
if (ret < 0)
return;
}
dump_start(s);
- end_header(s, "application/xml");
+ end_header(s, this, "application/xml");
s->formatter->open_object_section_in_ns("DeleteResult",
"http://s3.amazonaws.com/doc/2006-03-01/");
set_req_state_err(s, ret);
}
dump_errno(s);
- end_header(s);
+ end_header(s, NULL);
if (!ret) {
dump_start(s);
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s);
+ end_header(s, this);
if (ret < 0) {
return;
}
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s);
+ end_header(s, NULL);
dump_start(s);
}
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s);
+ end_header(s, this);
dump_start(s);
}
ret = STATUS_ACCEPTED;
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s);
+ end_header(s, NULL);
rgw_flush_formatter_and_reset(s, s->formatter);
}
set_req_state_err(s, r);
dump_errno(s);
- end_header(s);
+ end_header(s, this);
rgw_flush_formatter_and_reset(s, s->formatter);
}
dump_etag(s, etag.c_str());
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s);
+ end_header(s, this);
rgw_flush_formatter_and_reset(s, s->formatter);
}
ret = STATUS_ACCEPTED;
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s);
+ end_header(s, this);
rgw_flush_formatter_and_reset(s, s->formatter);
}
set_req_state_err(s, r);
dump_errno(s);
- end_header(s);
+ end_header(s, this);
rgw_flush_formatter_and_reset(s, s->formatter);
}
ret = STATUS_CREATED;
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s);
+ end_header(s, this);
/* Send progress information. Note that this diverge from the original swift
* spec. We do this in order to keep connection alive.
ret = STATUS_CREATED;
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s);
+ end_header(s, this);
} else {
s->formatter->close_section();
rgw_flush_formatter(s, s->formatter);
if (!content_type)
content_type = "binary/octet-stream";
- end_header(s, content_type);
+ end_header(s, this, content_type);
sent_header = true;
} else {
set_req_state_err(s, ret);
dump_errno(s);
- end_header(s);
+ end_header(s, NULL);
return;
}
dump_errno(s);
dump_access_control(s, origin, req_meth, hdrs.c_str(), exp_hdrs.c_str(), max_age);
- end_header(s);
+ end_header(s, NULL);
}
RGWOp *RGWHandler_ObjStore_Service_SWIFT::op_get()