return (http_ret == 200);
}
+bool rgw_err::
+is_err() const
+{
+ return (http_ret != 200 && http_ret != 204);
+}
+
std::ostream& operator<<(std::ostream& oss, const rgw_err &err)
{
oss << "rgw_err(http_ret=" << err.http_ret << ", s3='" << err.s3_code << "') ";
rgw_err(int http, const std::string &s3);
void clear();
bool is_clear() const;
+ bool is_err() const;
friend std::ostream& operator<<(std::ostream& oss, const rgw_err &err);
int http_ret;
dump_status(s, buf);
}
+void dump_errno(struct req_state *s, int err)
+{
+ char buf[32];
+ snprintf(buf, sizeof(buf), "%d", err);
+ dump_status(s, buf);
+}
+
void dump_content_length(struct req_state *s, size_t len)
{
char buf[16];
void end_header(struct req_state *s, const char *content_type)
{
- if (!content_type) {
+ if (!content_type || s->err.is_err()) {
switch (s->format) {
case RGW_FORMAT_XML:
content_type = "application/xml";
break;
}
}
- CGI_PRINTF(s,"Content-type: %s\r\n\r\n", content_type);
- if (!s->err.is_clear()) {
+ if (s->err.is_err()) {
dump_start(s);
s->formatter->open_obj_section("Error");
if (!s->err.s3_code.empty())
if (!s->err.message.empty())
s->formatter->dump_value_str("Message", s->err.message.c_str());
s->formatter->close_section("Error");
+ dump_content_length(s, s->formatter->get_len());
}
+ CGI_PRINTF(s,"Content-type: %s\r\n\r\n", content_type);
+ s->formatter->flush();
s->header_ended = true;
}
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 dump_start(struct req_state *s);
extern void list_all_buckets_start(struct req_state *s);
const char *content_type = NULL;
int orig_ret = ret;
+ if (ret)
+ goto done;
+
if (sent_header)
goto send_data;
if (range_str && !ret)
ret = 206; /* partial content */
-
- if (ret)
+done:
+ if (orig_ret)
set_req_state_err(s, ret);
+
dump_errno(s);
if (!content_type)
content_type = "binary/octet-stream";
end_header(s, content_type);
- s->formatter->flush();
-
sent_header = true;
send_data:
set_req_state_err(s, ret);
dump_errno(s);
end_header(s);
- s->formatter->flush();
}
void RGWDeleteBucket_REST_S3::send_response()
if (!r)
r = 204;
- if (ret)
- set_req_state_err(s, r);
+ set_req_state_err(s, r);
dump_errno(s);
end_header(s);
- s->formatter->flush();
}
void RGWPutObj_REST_S3::send_response()
set_req_state_err(s, ret);
dump_errno(s);
end_header(s);
- s->formatter->flush();
}
void RGWDeleteObj_REST_S3::send_response()
set_req_state_err(s, r);
dump_errno(s);
end_header(s);
- s->formatter->flush();
}
void RGWCopyObj_REST_S3::send_response()
}
}
s->formatter->close_section("CopyObjectResult");
+ s->formatter->flush();
}
- s->formatter->flush();
}
void RGWGetACLs_REST_S3::send_response()
dump_errno(s);
end_header(s, "application/xml");
dump_start(s);
- s->formatter->flush();
FCGX_PutStr(acls.c_str(), acls.size(), s->fcgx->out);
}
dump_errno(s);
end_header(s, "application/xml");
dump_start(s);
- s->formatter->flush();
}
RGWOp *RGWHandler_REST_S3::get_retrieve_obj_op(struct req_state *s, bool get_data)