]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: port the FCGI frontend to the new RGWStreamIOEngine infrastructure.
authorRadoslaw Zarzynski <rzarzynski@mirantis.com>
Thu, 4 Aug 2016 13:38:44 +0000 (15:38 +0200)
committerRadoslaw Zarzynski <rzarzynski@mirantis.com>
Fri, 21 Oct 2016 20:57:19 +0000 (22:57 +0200)
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
src/rgw/rgw_fcgi.cc
src/rgw/rgw_fcgi.h
src/rgw/rgw_fcgi_process.cc

index 097417d5bfab356ec2f2f842353331634b8604d5..2db97dd739529c998bf3d58c0d41fec7e8953752 100644 (file)
@@ -27,8 +27,13 @@ void RGWFCGX::init_env(CephContext *cct)
 
 int RGWFCGX::send_status(int status, const char *status_name)
 {
-  status_num = status;
-  return print("Status: %d %s\r\n", status, status_name);
+  static constexpr size_t STATUS_BUF_SIZE = 128;
+
+  char statusbuf[STATUS_BUF_SIZE];
+  const auto statuslen = snprintf(statusbuf, sizeof(statusbuf),
+                                  "Status: %d %s\r\n", status, status_name);
+
+  return write_data(statusbuf, statuslen);
 }
 
 int RGWFCGX::send_100_continue()
@@ -42,19 +47,17 @@ int RGWFCGX::send_100_continue()
 
 int RGWFCGX::send_content_length(uint64_t len)
 {
-  /*
-   * Status 204 should not include a content-length header
-   * RFC7230 says so
-   */
-  if (status_num == 204)
-    return 0;
+  static constexpr size_t CONLEN_BUF_SIZE = 128;
+
+  char sizebuf[CONLEN_BUF_SIZE];
+  const auto sizelen = snprintf(sizebuf, sizeof(sizebuf),
+                                "Content-Length: %" PRIu64 "\r\n", len);
 
-  char buf[21];
-  snprintf(buf, sizeof(buf), "%" PRIu64, len);
-  return print("Content-Length: %s\r\n", buf);
+  return write_data(sizebuf, sizelen);
 }
 
 int RGWFCGX::complete_header()
 {
-  return print("\r\n");
+  constexpr char HEADER_END[] = "\r\n";
+  return write_data(HEADER_END, sizeof(HEADER_END) - 1);
 }
index 90928c4f7be64af731810be990626c32b351d7b8..f49c3586125a043103a42261a84fc9d0c0af21c0 100644 (file)
 
 struct FCGX_Request;
 
-class RGWFCGX : public RGWStreamIO
+class RGWFCGX : public RGWStreamIOEngine
 {
   FCGX_Request *fcgx;
+  RGWEnv env;
 
-  int status_num;
-
-protected:
+public:
   void init_env(CephContext *cct);
   int write_data(const char *buf, int len);
   int read_data(char *buf, int len);
@@ -27,9 +26,12 @@ protected:
   int complete_header();
   int complete_request() { return 0; }
   int send_content_length(uint64_t len);
-public:
-  explicit RGWFCGX(FCGX_Request *_fcgx) : fcgx(_fcgx), status_num(0) {}
+  explicit RGWFCGX(FCGX_Request *_fcgx) : fcgx(_fcgx) {}
   void flush();
+
+  RGWEnv& get_env() override {
+    return env;
+  }
 };
 
 #endif
index b9246aeb6474cc8f7feeb48c1f886c929199e09d..7bc469befb6d1a32019ccc7cbcd35927c2bfeea5 100644 (file)
@@ -12,6 +12,7 @@
 #include "rgw_process.h"
 #include "rgw_loadgen.h"
 #include "rgw_client_io.h"
+#include "rgw_client_io_decoimpl.h"
 
 #define dout_subsys ceph_subsys_rgw
 
@@ -115,7 +116,9 @@ void RGWFCGXProcess::handle_request(RGWRequest* r)
 {
   RGWFCGXRequest* req = static_cast<RGWFCGXRequest*>(r);
   FCGX_Request* fcgx = req->fcgx;
-  RGWFCGX client_io(fcgx);
+  auto real_client_io = add_conlen_controlling(
+                          RGWFCGX(fcgx));
+  RGWStreamIOLegacyWrapper client_io(&real_client_io);
 
  
   int ret = process_request(store, rest, req, &client_io, olog);