return sent + write_data(HEADER_END, sizeof(HEADER_END) - 1);
}
+std::size_t RGWAsioClientIO::send_header(const boost::string_ref& name,
+ const boost::string_ref& value)
+{
+ char hdrbuf[name.size() + 2 + value.size() + 2 + 1];
+ const auto hdrlen = snprintf(hdrbuf, sizeof(hdrbuf), "%.*s: %.*s\r\n",
+ static_cast<int>(name.length()),
+ name.data(),
+ static_cast<int>(value.length()),
+ value.data());
+ return write_data(hdrbuf, hdrlen);
+}
+
std::size_t RGWAsioClientIO::send_content_length(const uint64_t len)
{
static constexpr size_t CONLEN_BUF_SIZE = 128;
void flush() override;
std::size_t send_status(int status, const char *status_name) override;
std::size_t send_100_continue() override;
- std::size_t complete_header() override;
+ std::size_t send_header(const boost::string_ref& name,
+ const boost::string_ref& value) override;
std::size_t send_content_length(uint64_t len) override;
+ std::size_t complete_header() override;
RGWEnv& get_env() noexcept override {
return env;
return write_data(HTTTP_100_CONTINUE, sizeof(HTTTP_100_CONTINUE) - 1);
}
+std::size_t RGWCivetWeb::send_header(const boost::string_ref& name,
+ const boost::string_ref& value)
+{
+ return safe_mg_printf(conn, "%.*s: %.*s\r\n", name.length(), name.data(),
+ value.length(), value.data());
+}
+
std::size_t RGWCivetWeb::dump_date_header()
{
char timestr[TIME_BUF_SIZE];
std::size_t send_status(int status, const char *status_name) override;
std::size_t send_100_continue() override;
+ std::size_t send_header(const boost::string_ref& name,
+ const boost::string_ref& value) override;
std::size_t send_content_length(uint64_t len) override;
std::size_t complete_header() override;
int complete_request() override;
#include <istream>
#include <stdlib.h>
-#include "include/types.h"
+#include <boost/utility/string_ref.hpp>
+#include "include/types.h"
#include "rgw_common.h"
class RGWClientIO {
virtual std::size_t send_status(int status, const char *status_name) = 0;
virtual std::size_t send_100_continue() = 0;
- virtual std::size_t complete_header() = 0;
+
+ /* Send header to client. On success returns number of bytes sent to the direct
+ * client of RadosGW. On failure throws int containing errno. boost::string_ref
+ * is being used because of length it internally carries. */
+ virtual std::size_t send_header(const boost::string_ref& name,
+ const boost::string_ref& value) = 0;
+
virtual std::size_t send_content_length(uint64_t len) = 0;
+ virtual std::size_t complete_header() = 0;
virtual void flush() = 0;
};
virtual int write_data(const char *buf, int len) = 0;
virtual int send_status(int status, const char *status_name) = 0;
virtual int send_100_continue() = 0;
+ virtual std::size_t send_header(const boost::string_ref& name,
+ const boost::string_ref& value) noexcept = 0;
virtual int complete_header() = 0;
virtual int send_content_length(uint64_t len) = 0;
virtual void flush() = 0;
EXCPT_TO_RC(get_decoratee().send_status(status, status_name));
}
+ std::size_t send_header(const boost::string_ref& name,
+ const boost::string_ref& value) noexcept override {
+ EXCPT_TO_RC(get_decoratee().send_header(name, value));
+ }
+
int send_100_continue() override {
EXCPT_TO_RC(get_decoratee().send_100_continue());
}
return get_decoratee().send_100_continue();
}
+ std::size_t send_header(const boost::string_ref& name,
+ const boost::string_ref& value) override {
+ return get_decoratee().send_header(name, value);
+ }
+
std::size_t send_content_length(const uint64_t len) override {
return get_decoratee().send_content_length(len);
}
return sent;
}
+ std::size_t send_header(const boost::string_ref& name,
+ const boost::string_ref& value) override {
+ const auto sent = RGWDecoratedStreamIO<T>::send_header(name, value);
+ if (enabled) {
+ total_sent += sent;
+ }
+ return sent;
+ }
+
std::size_t send_content_length(const uint64_t len) override {
const auto sent = RGWDecoratedStreamIO<T>::send_content_length(len);
if (enabled) {
std::size_t RGWFCGX::send_100_continue()
{
- return send_status(100, "Continue");
+ const auto sent = send_status(100, "Continue");
+ flush();
+ return sent;
+}
+
+std::size_t RGWFCGX::send_header(const boost::string_ref& name,
+ const boost::string_ref& value)
+{
+ char hdrbuf[name.size() + 2 + value.size() + 2 + 1];
+ const auto hdrlen = snprintf(hdrbuf, sizeof(hdrbuf),
+ "%.*s: %.*s\r\n",
+ static_cast<int>(name.length()),
+ name.data(),
+ static_cast<int>(value.length()),
+ value.data());
+
+ return write_data(hdrbuf, hdrlen);
}
std::size_t RGWFCGX::send_content_length(const uint64_t len)
std::size_t RGWFCGX::complete_header()
{
- constexpr char HEADER_END[] = "\r\n";
+ static constexpr char HEADER_END[] = "\r\n";
return write_data(HEADER_END, sizeof(HEADER_END) - 1);
}
std::size_t send_status(int status, const char* status_name) override;
std::size_t send_100_continue() override;
+ std::size_t send_header(const boost::string_ref& name,
+ const boost::string_ref& value) override;
std::size_t send_content_length(uint64_t len) override;
std::size_t complete_header() override;
return 0;
}
+std::size_t RGWLoadGenIO::send_header(const boost::string_ref& name,
+ const boost::string_ref& value)
+{
+ return 0;
+}
+
std::size_t RGWLoadGenIO::complete_header()
{
return 0;
std::size_t send_status(int status, const char *status_name);
std::size_t send_100_continue();
+ std::size_t send_header(const boost::string_ref& name,
+ const boost::string_ref& value) override;
std::size_t complete_header();
std::size_t send_content_length(uint64_t len);