RGWEnv env;
void init_env(CephContext *cct) override;
- std::size_t write_data(const char *buf, std::size_t len) override;
- std::size_t read_data(char *buf, std::size_t max) override;
+ std::size_t write_data(const char *buf, std::size_t len);
+ std::size_t read_data(char *buf, std::size_t max);
public:
RGWAsioClientIO(tcp::socket&& socket, request_type&& request);
std::size_t send_content_length(uint64_t len) override;
std::size_t complete_header() override;
+ std::size_t recv_body(char* buf, std::size_t max) override {
+ return read_data(buf, max);
+ }
+
+ std::size_t send_body(const char* buf, std::size_t len) override {
+ return write_data(buf, len);
+ }
+
RGWEnv& get_env() noexcept override {
return env;
}
bool explicit_keepalive;
bool explicit_conn_close;
+ std::size_t write_data(const char *buf, std::size_t len);
+ std::size_t read_data(char *buf, std::size_t len);
std::size_t dump_date_header();
+
public:
void init_env(CephContext *cct);
- std::size_t write_data(const char *buf, std::size_t len) override;
- std::size_t read_data(char *buf, std::size_t len) override;
-
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;
+
+ std::size_t recv_body(char* buf, std::size_t max) override {
+ return read_data(buf, max);
+ }
+
+ std::size_t send_body(const char* buf, std::size_t len) override {
+ return write_data(buf, len);
+ }
+
int complete_request() override;
void flush() override;
return 0;
}
- const auto ret = engine.write_data(buf, len);
+ const auto ret = engine.send_body(buf, len);
if (ret < 0) {
return ret;
} else if (ret < len) {
int RGWStreamIOFacade::read(char *buf, int max, int *actual)
{
- int ret = engine.read_data(buf, max);
+ int ret = engine.recv_body(buf, max);
if (ret < 0) {
return ret;
}
friend class RGWStreamIOFacade;
friend class RGWStreamIOLegacyWrapper;
-protected:
- virtual std::size_t read_data(char *buf, std::size_t max) = 0;
- virtual std::size_t write_data(const char *buf, std::size_t len) = 0;
-
public:
class Exception : public std::exception {
int err;
-
public:
Exception(const int err)
: err(err) {
virtual std::size_t send_content_length(uint64_t len) = 0;
virtual std::size_t complete_header() = 0;
+
+ /* Receive body. On success Returns number of bytes sent to the direct
+ * client of RadosGW. On failure throws int containing errno. */
+ virtual std::size_t recv_body(char* buf, std::size_t max) = 0;
+ virtual std::size_t send_body(const char* buf, std::size_t len) = 0;
+
virtual void flush() = 0;
};
RGWEnv env;
public:
- virtual int read_data(char *buf, int max) = 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 int complete_header() = 0;
+
+ virtual int recv_body(char* buf, std::size_t max) = 0;
+ virtual int send_body(const char* buf, std::size_t len) = 0;
virtual void flush() = 0;
+
virtual ~RGWStreamIO() {}
+
RGWStreamIO()
: RGWStreamIOFacade(this),
_account(false),
EXCPT_TO_VOID(get_decoratee().init_env(cct));
}
- int read_data(char* const buf, const int max) override {
- EXCPT_TO_RC(get_decoratee().read_data(buf, max));
- }
-
- int write_data(const char* const buf, const int len) override {
- EXCPT_TO_RC(get_decoratee().write_data(buf, len));
- }
-
public:
RGWStreamIOLegacyWrapper(RGWStreamIOEngine * const engine)
: engine(engine) {
EXCPT_TO_RC(get_decoratee().complete_header());
}
+ int recv_body(char* buf, const std::size_t max) override {
+ EXCPT_TO_RC(get_decoratee().recv_body(buf, max));
+ }
+
+ int send_body(const char* const buf, const std::size_t len) override {
+ EXCPT_TO_RC(get_decoratee().send_body(buf, len));
+ }
+
+
void flush() override {
EXCPT_TO_VOID(get_decoratee().flush());
}
return get_decoratee().init_env(cct);
}
- std::size_t read_data(char* const buf,
- const std::size_t max) override {
- return get_decoratee().read_data(buf, max);
- }
-
- std::size_t write_data(const char* const buf,
- const std::size_t len) override {
- return get_decoratee().write_data(buf, len);
- }
-
public:
- RGWDecoratedStreamIO(const DecorateeT& decoratee)
- : decoratee(decoratee) {
+ RGWDecoratedStreamIO(DecorateeT&& decoratee)
+ : decoratee(std::move(decoratee)) {
}
std::size_t send_status(const int status,
return get_decoratee().complete_header();
}
+ std::size_t recv_body(char* const buf, const std::size_t max) override {
+ return get_decoratee().recv_body(buf, max);
+ }
+
+ std::size_t send_body(const char* const buf,
+ const std::size_t len) override {
+ return get_decoratee().send_body(buf, len);
+ }
+
void flush() override {
return get_decoratee().flush();
}
uint64_t total_sent;
uint64_t total_received;
-protected:
- std::size_t read_data(char* const buf, const std::size_t max) override {
- const auto received = RGWDecoratedStreamIO<T>::read_data(buf, max);
- if (enabled) {
- total_received += received;
- }
- return received;
- }
-
- std::size_t write_data(const char* const buf,
- const std::size_t len) override {
- const auto sent = RGWDecoratedStreamIO<T>::write_data(buf, len);
- if (enabled) {
- total_sent += sent;
- }
- return sent;
- }
-
public:
template <typename U>
RGWStreamIOAccountingEngine(U&& decoratee)
return sent;
}
+ std::size_t recv_body(char* buf, std::size_t max) override {
+ const auto received = RGWDecoratedStreamIO<T>::recv_body(buf, max);
+ if (enabled) {
+ total_received += received;
+ }
+ return received;
+ }
+
+ std::size_t send_body(const char* const buf,
+ const std::size_t len) override {
+ const auto sent = RGWDecoratedStreamIO<T>::send_body(buf, len);
+ if (enabled) {
+ total_sent += sent;
+ }
+ return sent;
+ }
+
uint64_t get_bytes_sent() const override {
return total_sent;
}
bool has_content_length;
bool buffer_data;
- std::size_t write_data(const char* buf, const std::size_t len) override;
-
public:
template <typename U>
RGWStreamIOBufferingEngine(U&& decoratee)
std::size_t send_content_length(const uint64_t len) override;
std::size_t complete_header() override;
+ std::size_t send_body(const char* buf, std::size_t len) override;
int complete_request() override;
};
template <typename T>
-std::size_t RGWStreamIOBufferingEngine<T>::write_data(const char* buf,
- const std::size_t len)
+std::size_t RGWStreamIOBufferingEngine<T>::send_body(const char* const buf,
+ const std::size_t len)
{
if (buffer_data) {
data.append(buf, len);
return 0;
}
- return RGWDecoratedStreamIO<T>::write_data(buf, len);
+ return RGWDecoratedStreamIO<T>::send_body(buf, len);
}
template <typename T>
/* We are sending each buffer separately to avoid extra memory shuffling
* that would occur on data.c_str() to provide a continuous memory area. */
for (const auto& ptr : data.buffers()) {
- sent += RGWDecoratedStreamIO<T>::write_data(ptr.c_str(),
- ptr.length());
+ sent += RGWDecoratedStreamIO<T>::send_body(ptr.c_str(),
+ ptr.length());
}
data.clear();
buffer_data = false;
bool has_content_length;
bool chunking_enabled;
- std::size_t write_data(const char* const buf,
- const std::size_t len) override {
- if (! chunking_enabled) {
- return RGWDecoratedStreamIO<T>::write_data(buf, len);
- } else {
- constexpr char HEADER_END[] = "\r\n";
- char sizebuf[32];
- snprintf(sizebuf, sizeof(buf), "%" PRIx64 "\r\n", len);
-
- RGWDecoratedStreamIO<T>::write_data(sizebuf, strlen(sizebuf));
- RGWDecoratedStreamIO<T>::write_data(buf, len);
- return RGWDecoratedStreamIO<T>::write_data(HEADER_END, sizeof(HEADER_END) - 1);
- }
- }
-
public:
template <typename U>
RGWStreamIOChunkingEngine(U&& decoratee)
return sent + RGWDecoratedStreamIO<T>::complete_header();
}
+
+ std::size_t send_body(const char* buf,
+ const std::size_t len) override {
+ if (! chunking_enabled) {
+ return RGWDecoratedStreamIO<T>::send_body(buf, len);
+ } else {
+ static constexpr char HEADER_END[] = "\r\n";
+ char sizebuf[32];
+ const auto slen = snprintf(sizebuf, sizeof(buf), "%" PRIx64 "\r\n", len);
+ std::size_t sent = 0;
+
+ sent += RGWDecoratedStreamIO<T>::send_body(sizebuf, slen);
+ sent += RGWDecoratedStreamIO<T>::send_body(buf, len);
+ sent += RGWDecoratedStreamIO<T>::send_body(HEADER_END,
+ sizeof(HEADER_END) - 1);
+ return sent;
+ }
+ }
};
template <typename T>
FCGX_Request *fcgx;
RGWEnv env;
+ std::size_t read_data(char* buf, std::size_t len);
+ std::size_t write_data(const char* buf, std::size_t len);
+
public:
explicit RGWFCGX(FCGX_Request* const fcgx)
: fcgx(fcgx) {
}
void init_env(CephContext* cct) override;
- std::size_t read_data(char* buf, std::size_t len) override;
- std::size_t write_data(const char* buf, std::size_t len) override;
-
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,
std::size_t send_content_length(uint64_t len) override;
std::size_t complete_header() override;
+ std::size_t recv_body(char* buf, std::size_t max) override {
+ return read_data(buf, max);
+ }
+
+ std::size_t send_body(const char* buf, std::size_t len) override {
+ return write_data(buf, len);
+ }
+
void flush();
RGWEnv& get_env() noexcept override {
RGWLoadGenRequestEnv* req;
RGWEnv env;
+ void init_env(CephContext *cct) override;
+ std::size_t read_data(char *buf, std::size_t len);
+ std::size_t write_data(const char *buf, std::size_t len);
+
public:
explicit RGWLoadGenIO(RGWLoadGenRequestEnv* const req)
: left_to_read(0),
req(req) {
}
- void init_env(CephContext *cct);
- std::size_t read_data(char *buf, std::size_t len);
- std::size_t write_data(const char *buf, std::size_t len);
-
- std::size_t send_status(int status, const char *status_name);
- std::size_t send_100_continue();
+ 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 complete_header();
- std::size_t send_content_length(uint64_t len);
+ std::size_t complete_header() override;
+ std::size_t send_content_length(uint64_t len) override;
+
+ std::size_t recv_body(char* buf, std::size_t max) override {
+ return read_data(buf, max);
+ }
+
+ std::size_t send_body(const char* buf, std::size_t len) override {
+ return write_data(buf, len);
+ }
- void flush();
+ void flush() override;
RGWEnv& get_env() noexcept override {
return env;
}
- int complete_request();
+ int complete_request() override;
};
#endif