ClientIO::~ClientIO() = default;
-void ClientIO::init_env(CephContext *cct)
+int ClientIO::init_env(CephContext *cct)
{
env.init(cct);
env.set("REMOTE_ADDR", socket.remote_endpoint().address().to_string());
// TODO: set SERVER_PORT_SECURE if using ssl
// TODO: set REMOTE_USER if authenticated
+ return 0;
}
size_t ClientIO::write_data(const char* buf, size_t len)
beast::flat_buffer& buffer);
~ClientIO() override;
- void init_env(CephContext *cct) override;
+ int init_env(CephContext *cct) override;
size_t complete_request() override;
void flush() override;
size_t send_status(int status, const char *status_name) override;
return 0;
}
-void RGWCivetWeb::init_env(CephContext *cct)
+int RGWCivetWeb::init_env(CephContext *cct)
{
env.init(cct);
const struct mg_request_info* info = mg_get_request_info(conn);
if (! info) {
- return;
+ // request info is NULL; we have no info about the connection
+ return -EINVAL;
}
for (int i = 0; i < info->num_headers; i++) {
const struct mg_request_info::mg_header* header = &info->http_headers[i];
+
+ if (header->name == nullptr || header->value==nullptr) {
+ lderr(cct) << "client supplied malformatted headers" << dendl;
+ return -EINVAL;
+ }
+
const boost::string_ref name(header->name);
const auto& value = header->value;
if (info->is_ssl) {
env.set("SERVER_PORT_SECURE", port_buf);
}
+ return 0;
}
size_t RGWCivetWeb::send_status(int status, const char *status_name)
size_t dump_date_header();
public:
- void init_env(CephContext *cct) override;
+ [[nodiscard]] int init_env(CephContext *cct) override;
size_t send_status(int status, const char *status_name) override;
size_t send_100_continue() override;
namespace rgw {
namespace io {
-void BasicClient::init(CephContext *cct) {
- init_env(cct);
+[[nodiscard]] int BasicClient::init(CephContext *cct) {
+ int init_error = init_env(cct);
+
+ if (init_error != 0)
+ return init_error;
if (cct->_conf->subsys.should_gather(ceph_subsys_rgw, 20)) {
const auto& env_map = get_env().get_map();
ldout(cct, 20) << iter.first << "=" << (x) << dendl;
}
}
+ return init_error;
}
} /* namespace io */
* interacted with. */
class BasicClient {
protected:
- virtual void init_env(CephContext *cct) = 0;
+ virtual int init_env(CephContext *cct) = 0;
public:
virtual ~BasicClient() = default;
/* Initialize the BasicClient and inject CephContext. */
- void init(CephContext *cct);
+ int init(CephContext *cct);
/* Return the RGWEnv describing the environment that a given request lives in.
* The method does not throw exceptions. */
decoratee = &new_dec;
}
- void init_env(CephContext *cct) override {
+ int init_env(CephContext *cct) override {
return get_decoratee().init_env(cct);
}
FCGX_FFlush(fcgx->out);
}
-void RGWFCGX::init_env(CephContext* const cct)
+int RGWFCGX::init_env(CephContext* const cct)
{
env.init(cct, (char **)fcgx->envp);
+ return 0;
}
size_t RGWFCGX::send_status(const int status, const char* const status_name)
txbuf(*this) {
}
- void init_env(CephContext* cct) override;
+ int init_env(CephContext* cct) override;
size_t send_status(int status, const char* status_name) override;
size_t send_100_continue() override;
size_t send_header(const boost::string_ref& name,
RGWLibIO(const RGWUserInfo &_user_info)
: user_info(_user_info) {}
- void init_env(CephContext *cct) override {
+ int init_env(CephContext *cct) override {
env.init(cct);
+ return 0;
}
const RGWUserInfo& get_user() {
return 0;
}
-void RGWLoadGenIO::init_env(CephContext *cct)
+int RGWLoadGenIO::init_env(CephContext *cct)
{
env.init(cct);
char port_buf[16];
snprintf(port_buf, sizeof(port_buf), "%d", req->port);
env.set("SERVER_PORT", port_buf);
+ return 0;
}
size_t RGWLoadGenIO::send_status(const int status,
RGWLoadGenRequestEnv* req;
RGWEnv env;
- void init_env(CephContext *cct) override;
+ int init_env(CephContext *cct) override;
size_t read_data(char *buf, size_t len);
size_t write_data(const char *buf, size_t len);
OpsLogSocket* const olog,
int* http_ret)
{
- int ret = 0;
-
- client_io->init(g_ceph_context);
+ int ret = client_io->init(g_ceph_context);
req->log_init();
RGWObjectCtx rados_ctx(store, s);
s->obj_ctx = &rados_ctx;
+ if (ret < 0) {
+ s->cio = client_io;
+ abort_early(s, nullptr, ret, nullptr);
+ return ret;
+ }
+
s->req_id = store->unique_id(req->id);
s->trans_id = store->unique_trans_id(req->id);
s->host_id = store->host_id;
req->log_format(s, "initializing for trans_id = %s", s->trans_id.c_str());
- RGWOp* op = NULL;
+ RGWOp* op = nullptr;
int init_error = 0;
bool should_log = false;
RGWRESTMgr *mgr;
frontend_prefix,
client_io, &mgr, &init_error);
if (init_error != 0) {
- abort_early(s, NULL, init_error, NULL);
+ abort_early(s, nullptr, init_error, nullptr);
goto done;
}
dout(10) << "handler=" << typeid(*handler).name() << dendl;