From 9b7f223a161388c31b5c7536557dc8632d084315 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Fri, 15 Apr 2011 11:15:11 -0700 Subject: [PATCH] rgw: fix other err related issues also remove the now redundant formatter->flush() --- src/rgw/rgw_common.cc | 6 ++++++ src/rgw/rgw_common.h | 1 + src/rgw/rgw_rest.cc | 15 ++++++++++++--- src/rgw/rgw_rest.h | 1 + src/rgw/rgw_rest_s3.cc | 21 ++++++++------------- 5 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index 797e9c921c3da..bc31cef4b315b 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -32,6 +32,12 @@ is_clear() const 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 << "') "; diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index e9660a791d089..fb160e62f358e 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -78,6 +78,7 @@ struct rgw_err { 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; diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc index 6d9865ff56ab7..126d189dc063f 100644 --- a/src/rgw/rgw_rest.cc +++ b/src/rgw/rgw_rest.cc @@ -78,6 +78,13 @@ void dump_errno(struct req_state *s) 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]; @@ -146,7 +153,7 @@ void dump_start(struct req_state *s) 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"; @@ -159,8 +166,7 @@ void end_header(struct req_state *s, const char *content_type) 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()) @@ -168,7 +174,10 @@ void end_header(struct req_state *s, const char *content_type) 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; } diff --git a/src/rgw/rgw_rest.h b/src/rgw/rgw_rest.h index e280f88c4bf08..7e483a26f2445 100644 --- a/src/rgw/rgw_rest.h +++ b/src/rgw/rgw_rest.h @@ -112,6 +112,7 @@ public: 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); diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index ca5af8c477caa..91f46c96b949e 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -34,6 +34,9 @@ int RGWGetObj_REST_S3::send_response(void *handle) const char *content_type = NULL; int orig_ret = ret; + if (ret) + goto done; + if (sent_header) goto send_data; @@ -66,15 +69,14 @@ int RGWGetObj_REST_S3::send_response(void *handle) 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: @@ -164,7 +166,6 @@ void RGWCreateBucket_REST_S3::send_response() set_req_state_err(s, ret); dump_errno(s); end_header(s); - s->formatter->flush(); } void RGWDeleteBucket_REST_S3::send_response() @@ -173,11 +174,9 @@ 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() @@ -187,7 +186,6 @@ 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() @@ -199,7 +197,6 @@ 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() @@ -221,8 +218,8 @@ void RGWCopyObj_REST_S3::send_response() } } s->formatter->close_section("CopyObjectResult"); + s->formatter->flush(); } - s->formatter->flush(); } void RGWGetACLs_REST_S3::send_response() @@ -232,7 +229,6 @@ 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); } @@ -243,7 +239,6 @@ void RGWPutACLs_REST_S3::send_response() 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) -- 2.39.5