void RGWStreamReadHTTPResourceCRF::get_attrs(std::map<string, string> *attrs)
{
-#warning need to lock in_req->headers
- *attrs = req->get_out_headers();
+ req->get_out_headers(attrs);
}
int RGWStreamReadHTTPResourceCRF::decode_rest_obj(map<string, string>& headers, bufferlist& extra_data, rgw_rest_obj *info) {
continue;
}
extra_data.claim_append(in_cb->get_extra_data());
- map<string, string> attrs = req->get_out_headers();
+ map<string, string> attrs;
+ req->get_out_headers(&attrs);
int ret = decode_rest_obj(attrs, extra_data, &rest_obj);
if (ret < 0) {
ldout(cct, 0) << "ERROR: " << __func__ << " decode_rest_obj() returned ret=" << ret << dendl;
*need_retry = !req->is_done();
}
-#warning need to lock in_req->headers
- handle_headers(req->get_out_headers());
+ map<string, string> headers;
+ req->get_out_headers(&headers);
+ handle_headers(headers);
return req->get_req_retcode();
}
int RGWHTTPSimpleRequest::receive_header(void *ptr, size_t len)
{
+ unique_lock guard(out_headers_lock);
+
char line[len + 1];
char *s = (char *)ptr, *end = (char *)ptr + len;
}
}
+void RGWHTTPSimpleRequest::get_out_headers(map<string, string> *pheaders)
+{
+ unique_lock guard(out_headers_lock);
+ pheaders->swap(out_headers);
+ out_headers.clear();
+}
+
static int sign_request(CephContext *cct, RGWAccessKey& key, RGWEnv& env, req_info& info)
{
/* don't sign if no key is provided */
if (ret < 0) {
return ret;
}
+
+ unique_lock guard(out_headers_lock);
+
set_str_from_headers(out_headers, "ETAG", etag);
if (status >= 0) {
if (mtime) {
int http_status;
int status;
+ using unique_lock = std::unique_lock<std::mutex>;
+
+ std::mutex out_headers_lock;
map<string, string> out_headers;
param_vec_t params;
bufferlist& get_response() { return response; }
- map<string, string>& get_out_headers() { return out_headers; }
+ void get_out_headers(map<string, string> *pheaders); /* modifies out_headers */
int get_http_status() { return http_status; }
int get_status();