}
}
- while (data_pending) {
- bufferlist data;
- len = get_data(data);
+ bool again;
+ do {
+ ceph::bufferlist data;
+ len = get_data(data, again);
if (len < 0) {
op_ret = len;
op_ret = -ERR_TOO_LARGE;
return;
}
- }
+ } while (again);
{
bufferlist flush;
const char *supplied_md5_b64;
const char *supplied_etag;
string etag;
- bool data_pending;
string content_type;
RGWAccessControlPolicy policy;
map<string, bufferlist> attrs;
len(0),
ofs(0),
supplied_md5_b64(nullptr),
- supplied_etag(nullptr),
- data_pending(false) {
+ supplied_etag(nullptr) {
}
void emplace_attr(std::string&& key, buffer::list&& bl) {
return 0;
}
virtual int get_params() = 0;
- virtual int get_data(bufferlist& bl) = 0;
+ virtual int get_data(ceph::bufferlist& bl, bool& again) = 0;
void send_response() override = 0;
- const string name() override { return "post_obj"; }
+ const std::string name() override { return "post_obj"; }
RGWOpType get_type() override { return RGW_OP_POST_OBJ; }
uint32_t op_mask() override { return RGW_OP_TYPE_WRITE; }
};
filename = iter->second;
}
parts[part.name] = part;
- data_pending = true;
break;
}
return 0;
}
-int RGWPostObj_ObjStore_S3::get_data(bufferlist& bl)
+int RGWPostObj_ObjStore_S3::get_data(ceph::bufferlist& bl, bool& again)
{
bool boundary;
bool done;
}
if (boundary) {
- data_pending = false;
-
if (!done) {
/* Reached end of data, let's drain the rest of the params */
r = complete_get_params();
}
}
+ again = !boundary;
return bl.length();
}
int complete_get_params();
void send_response() override;
- int get_data(bufferlist& bl) override;
+ int get_data(ceph::bufferlist& bl, bool& again) override;
int get_encrypt_filter(std::unique_ptr<RGWPutObjDataProcessor>* filter,
RGWPutObjDataProcessor* cb) override;
};
/* First data part ahead. */
current_data_part = std::move(part);
- /* Tell RGWPostObj::execute() that it has some data to put. */
- data_pending = true;
-
/* Stop the iteration. We can assume that all control parts have been
* already parsed. The rest of HTTP body should contain data parts
* only. They will be picked up by ::get_data(). */
if (std::end(params) != params.find("filename")) {
current_data_part = std::move(part);
-
- /* Tell RGWPostObj::execute() that it has some data to put. */
- data_pending = true;
-
return true;
}
}
return false;
}
-int RGWFormPost::get_data(ceph::bufferlist& bl)
+int RGWFormPost::get_data(ceph::bufferlist& bl, bool& again)
{
bool boundary;
return r;
}
- if (boundary) {
- data_pending = false;
- current_data_part = boost::none;
- }
+ /* Tell RGWPostObj::execute() that it has some data to put. */
+ again = !boundary;
return bl.length();
}
RGWHandler* dialect_handler) override;
int get_params() override;
- int get_data(ceph::bufferlist& bl) override;
+ int get_data(ceph::bufferlist& bl, bool& again) override;
void send_response() override;
static bool is_formpost_req(req_state* const s);