From: Radoslaw Zarzynski Date: Wed, 10 Aug 2016 16:14:26 +0000 (+0200) Subject: rgw: implement RGWStreamIO[Engine]::send_header(). X-Git-Tag: v11.1.0~454^2~33 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d64c6041cb99103d02d44b1f829e537c0a87b19f;p=ceph.git rgw: implement RGWStreamIO[Engine]::send_header(). Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/rgw/rgw_asio_client.cc b/src/rgw/rgw_asio_client.cc index 8d6a9c3f8585..d9696d3a35c2 100644 --- a/src/rgw/rgw_asio_client.cc +++ b/src/rgw/rgw_asio_client.cc @@ -160,6 +160,18 @@ std::size_t RGWAsioClientIO::complete_header() 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(name.length()), + name.data(), + static_cast(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; diff --git a/src/rgw/rgw_asio_client.h b/src/rgw/rgw_asio_client.h index 6f1969277053..e2d12bfeeea8 100644 --- a/src/rgw/rgw_asio_client.h +++ b/src/rgw/rgw_asio_client.h @@ -50,8 +50,10 @@ class RGWAsioClientIO : public RGWStreamIOEngine { 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; diff --git a/src/rgw/rgw_civetweb.cc b/src/rgw/rgw_civetweb.cc index 7cc8bd1e70fd..fd245138f3fa 100644 --- a/src/rgw/rgw_civetweb.cc +++ b/src/rgw/rgw_civetweb.cc @@ -142,6 +142,13 @@ std::size_t RGWCivetWeb::send_100_continue() 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]; diff --git a/src/rgw/rgw_civetweb.h b/src/rgw/rgw_civetweb.h index b0e9a0f41a1a..46e0d0044eec 100644 --- a/src/rgw/rgw_civetweb.h +++ b/src/rgw/rgw_civetweb.h @@ -29,6 +29,8 @@ public: 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; diff --git a/src/rgw/rgw_client_io.h b/src/rgw/rgw_client_io.h index 62a99d9e8953..7a822c05bbbf 100644 --- a/src/rgw/rgw_client_io.h +++ b/src/rgw/rgw_client_io.h @@ -10,8 +10,9 @@ #include #include -#include "include/types.h" +#include +#include "include/types.h" #include "rgw_common.h" class RGWClientIO { @@ -62,8 +63,15 @@ public: 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; }; @@ -110,6 +118,8 @@ public: 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; @@ -194,6 +204,11 @@ public: 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()); } diff --git a/src/rgw/rgw_client_io_decoimpl.h b/src/rgw/rgw_client_io_decoimpl.h index 8f963fe6b62e..250ba8c7aba8 100644 --- a/src/rgw/rgw_client_io_decoimpl.h +++ b/src/rgw/rgw_client_io_decoimpl.h @@ -70,6 +70,11 @@ public: 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); } @@ -143,6 +148,15 @@ public: return sent; } + std::size_t send_header(const boost::string_ref& name, + const boost::string_ref& value) override { + const auto sent = RGWDecoratedStreamIO::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::send_content_length(len); if (enabled) { diff --git a/src/rgw/rgw_fcgi.cc b/src/rgw/rgw_fcgi.cc index 13722a77492f..9cd64ee4616d 100644 --- a/src/rgw/rgw_fcgi.cc +++ b/src/rgw/rgw_fcgi.cc @@ -46,7 +46,23 @@ std::size_t RGWFCGX::send_status(const int status, const char* const status_name 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(name.length()), + name.data(), + static_cast(value.length()), + value.data()); + + return write_data(hdrbuf, hdrlen); } std::size_t RGWFCGX::send_content_length(const uint64_t len) @@ -62,6 +78,6 @@ 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); } diff --git a/src/rgw/rgw_fcgi.h b/src/rgw/rgw_fcgi.h index 6f5e4fdb9930..8d8454b0b70d 100644 --- a/src/rgw/rgw_fcgi.h +++ b/src/rgw/rgw_fcgi.h @@ -27,6 +27,8 @@ public: 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; diff --git a/src/rgw/rgw_loadgen.cc b/src/rgw/rgw_loadgen.cc index 0f54bca44fdc..4c5f0ebc2143 100644 --- a/src/rgw/rgw_loadgen.cc +++ b/src/rgw/rgw_loadgen.cc @@ -107,6 +107,12 @@ std::size_t RGWLoadGenIO::send_100_continue() 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; diff --git a/src/rgw/rgw_loadgen.h b/src/rgw/rgw_loadgen.h index 5f269c8ad371..2154cdea5076 100644 --- a/src/rgw/rgw_loadgen.h +++ b/src/rgw/rgw_loadgen.h @@ -50,6 +50,8 @@ public: 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);