This flush variant won't exist in common/Formatter.cc.
Signed-off-by: Colin McCabe <colin.mccabe@dreamhost.com>
#include "common/Clock.h"
#include "auth/Crypto.h"
+#include <sstream>
+
using namespace ceph::crypto;
rgw_err::
free((void *)bucket);
}
+void flush_formatter_to_req_state(struct req_state *s, RGWFormatter *formatter)
+{
+ std::ostringstream oss;
+ formatter->flush(oss);
+ std::string outs(oss.str());
+ if (!outs.empty()) {
+ CGI_PutStr(s, outs.c_str(), outs.size());
+ }
+ s->formatter->reset();
+}
+
std::ostream& operator<<(std::ostream& oss, const rgw_err &err)
{
oss << "rgw_err(http_ret=" << err.http_ret << ", s3='" << err.s3_code << "') ";
max_len = 0;
}
-void RGWFormatter::flush(struct req_state *s)
-{
- if (!buf)
- return;
-
- RGW_LOG(10) << "flush(): buf='" << buf << "' strlen(buf)=" << strlen(buf) << dendl;
- CGI_PutStr(s, buf, len - 1);
- reset();
-}
-
void RGWFormatter::flush(ostream& os)
{
if (!buf)
}
void reset();
void write_data(const char *fmt, ...);
- virtual void flush(struct req_state *s);
virtual void flush(ostream& os);
virtual int get_len() { return (len ? len - 1 : 0); } // don't include null termination in length
virtual void open_array_section(const char *name) = 0;
~req_state();
};
+extern void flush_formatter_to_req_state(struct req_state *s,
+ RGWFormatter *formatter);
+
/** Store basic data on an object */
struct RGWObjEnt {
std::string name;
dump_content_length(s, s->formatter->get_len());
}
CGI_PRINTF(s,"Content-type: %s\r\n\r\n", content_type);
- s->formatter->flush(s);
+ flush_formatter_to_req_state(s, s->formatter);
s->header_ended = true;
}
set_req_state_err(s, err_no);
dump_errno(s);
end_header(s);
- s->formatter->flush(s);
+ flush_formatter_to_req_state(s, s->formatter);
}
void dump_continue(struct req_state *s)
#include "rgw_os.h"
#include "rgw_rest_os.h"
+#include <sstream>
+
void RGWListBuckets_REST_OS::send_response()
{
set_req_state_err(s, ret);
}
s->formatter->close_section("account");
- RGW_LOG(10) << "formatter->get_len=" << s->formatter->get_len() << dendl;
-
- dump_content_length(s, s->formatter->get_len());
+ ostringstream oss;
+ s->formatter->flush(oss);
+ std::string outs(oss.str());
+ string::size_type outs_size = outs.size();
+ dump_content_length(s, outs_size);
end_header(s);
- s->formatter->flush(s);
+ if (!outs.empty()) {
+ CGI_PutStr(s, outs.c_str(), outs_size);
+ }
+ s->formatter->reset();
}
void RGWListBucket_REST_OS::send_response()
s->formatter->close_section("container");
end_header(s);
- s->formatter->flush(s);
+ flush_formatter_to_req_state(s, s->formatter);
}
static void dump_container_metadata(struct req_state *s, RGWBucketEnt& bucket)
end_header(s);
dump_start(s);
- s->formatter->flush(s);
+ flush_formatter_to_req_state(s, s->formatter);
}
void RGWCreateBucket_REST_OS::send_response()
set_req_state_err(s, ret);
dump_errno(s);
end_header(s);
- s->formatter->flush(s);
+ flush_formatter_to_req_state(s, s->formatter);
}
void RGWDeleteBucket_REST_OS::send_response()
set_req_state_err(s, r);
dump_errno(s);
end_header(s);
- s->formatter->flush(s);
+ flush_formatter_to_req_state(s, s->formatter);
}
void RGWPutObj_REST_OS::send_response()
set_req_state_err(s, ret);
dump_errno(s);
end_header(s);
- s->formatter->flush(s);
+ flush_formatter_to_req_state(s, s->formatter);
}
void RGWDeleteObj_REST_OS::send_response()
set_req_state_err(s, r);
dump_errno(s);
end_header(s);
- s->formatter->flush(s);
+ flush_formatter_to_req_state(s, s->formatter);
}
int RGWGetObj_REST_OS::send_response(void *handle)
if (get_data && !orig_ret) {
CGI_PutStr(s, data, len);
}
- s->formatter->flush(s);
+ flush_formatter_to_req_state(s, s->formatter);
return 0;
}
list_all_buckets_end(s);
dump_content_length(s, s->formatter->get_len());
end_header(s, "application/xml");
- s->formatter->flush(s);
+ flush_formatter_to_req_state(s, s->formatter);
}
void RGWListBucket_REST_S3::send_response()
}
}
s->formatter->close_section("ListBucketResult");
- s->formatter->flush(s);
+ flush_formatter_to_req_state(s, s->formatter);
}
void RGWCreateBucket_REST_S3::send_response()
}
}
s->formatter->close_section("CopyObjectResult");
- s->formatter->flush(s);
+ flush_formatter_to_req_state(s, s->formatter);
}
}
s->formatter->dump_format("Key", s->object);
s->formatter->dump_format("UploadId", upload_id.c_str());
s->formatter->close_section("InitiateMultipartUploadResult");
- s->formatter->flush(s);
+ flush_formatter_to_req_state(s, s->formatter);
}
}
s->formatter->dump_format("Key", s->object);
s->formatter->dump_format("ETag", etag.c_str());
s->formatter->close_section("CompleteMultipartUploadResult");
- s->formatter->flush(s);
+ flush_formatter_to_req_state(s, s->formatter);
}
}
s->formatter->close_section("Part");
}
s->formatter->close_section("ListMultipartUploadResult");
- s->formatter->flush(s);
+ flush_formatter_to_req_state(s, s->formatter);
}
}
}
}
s->formatter->close_section("ListMultipartUploadsResult");
- s->formatter->flush(s);
+ flush_formatter_to_req_state(s, s->formatter);
}
RGWOp *RGWHandler_REST_S3::get_retrieve_obj_op(bool get_data)