]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fix other err related issues
authorYehuda Sadeh <yehuda@hq.newdream.net>
Fri, 15 Apr 2011 18:15:11 +0000 (11:15 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Fri, 15 Apr 2011 18:15:11 +0000 (11:15 -0700)
also remove the now redundant formatter->flush()

src/rgw/rgw_common.cc
src/rgw/rgw_common.h
src/rgw/rgw_rest.cc
src/rgw/rgw_rest.h
src/rgw/rgw_rest_s3.cc

index 797e9c921c3dab50e12c482434b66d491bcce45c..bc31cef4b315bf5d032cf1154bc5822e95a91580 100644 (file)
@@ -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 << "') ";
index e9660a791d089b6a3159911b7ce4dc1f0c1517a7..fb160e62f358e3dd30ca9304600d0423181227a8 100644 (file)
@@ -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;
index 6d9865ff56ab74f876edaf73293cbff8b8761e33..126d189dc063ffb923780ddef8e8ff1e6591ec4a 100644 (file)
@@ -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;
 }
 
index e280f88c4bf08d33cc54663b5f142f985cbe5536..7e483a26f24454b753ee8e36ed3e781bf899dd9c 100644 (file)
@@ -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);
index ca5af8c477caac6ace75b81fca1f393a6b6d4f97..91f46c96b949e0e477b6bf303b8a8038fc484500 100644 (file)
@@ -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)