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()
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);
}
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);
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
#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
{
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);