]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: implement RGWStreamIO[Engine]::send_header().
authorRadoslaw Zarzynski <rzarzynski@mirantis.com>
Wed, 10 Aug 2016 16:14:26 +0000 (18:14 +0200)
committerRadoslaw Zarzynski <rzarzynski@mirantis.com>
Fri, 21 Oct 2016 20:57:20 +0000 (22:57 +0200)
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
src/rgw/rgw_asio_client.cc
src/rgw/rgw_asio_client.h
src/rgw/rgw_civetweb.cc
src/rgw/rgw_civetweb.h
src/rgw/rgw_client_io.h
src/rgw/rgw_client_io_decoimpl.h
src/rgw/rgw_fcgi.cc
src/rgw/rgw_fcgi.h
src/rgw/rgw_loadgen.cc
src/rgw/rgw_loadgen.h

index 8d6a9c3f858510b6925b02c72e107d28514e3925..d9696d3a35c2482c6a754e7c8a5e0106ea08a2d1 100644 (file)
@@ -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<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;
index 6f196927705397d744923b38fb80861e191dd4d7..e2d12bfeeea8ea7cb27e289505eab64a4246db7a 100644 (file)
@@ -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;
index 7cc8bd1e70fdb1ecf7a0fa7787f55ea4e2611d2e..fd245138f3fa1e503d865e10ae48a1d140d0fc98 100644 (file)
@@ -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];
index b0e9a0f41a1abf06a59e6884a9fb36d4e5beec50..46e0d0044eec3a46006e7485b7f83b5ee85b14d4 100644 (file)
@@ -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;
index 62a99d9e8953d3304681b10aa666bf810a9aefda..7a822c05bbbf807856fa13719cc35bc1e25bfa92 100644 (file)
@@ -10,8 +10,9 @@
 #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 {
@@ -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());
   }
index 8f963fe6b62e4d8efef17e0e4519f66e1fb7bb97..250ba8c7aba891dba416f9f916c27610196b7a32 100644 (file)
@@ -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<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) {
index 13722a77492f6ddac193c8563d253dcfa95bcfa5..9cd64ee4616d728d382e017b230ec02fbbcf69f4 100644 (file)
@@ -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<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)
@@ -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);
 }
index 6f5e4fdb9930a7a6d6553ccda3880baaf413666e..8d8454b0b70d3074791dba055f88e74ab267ff6e 100644 (file)
@@ -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;
 
index 0f54bca44fdc08a80b3d5685aa886a0c22d642c9..4c5f0ebc214346d284aff1e9c071563f4c926d1e 100644 (file)
@@ -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;
index 5f269c8ad371879e6a1b4cbcd1bbd20281ebd2b2..2154cdea5076bdf92fd5c9312f94196f25f437e1 100644 (file)
@@ -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);