bool write_paused{false};
bool read_paused{false};
+ optional<int> user_ret;
+
ceph::mutex lock = ceph::make_mutex("rgw_http_req_data::lock");
ceph::condition_variable cond;
int ret = req_data->client->receive_header(ptr, size * nmemb);
if (ret < 0) {
- dout(0) << "WARNING: client->receive_header() returned ret=" << ret << dendl;
+ dout(5) << "WARNING: client->receive_header() returned ret=" << ret << dendl;
+ req_data->user_ret = ret;
+ return CURLE_WRITE_ERROR;
}
return len;
int ret = client->receive_data((char *)ptr + skip_bytes, len - skip_bytes, &pause);
if (ret < 0) {
- dout(0) << "WARNING: client->receive_data() returned ret=" << ret << dendl;
+ dout(5) << "WARNING: client->receive_data() returned ret=" << ret << dendl;
+ req_data->user_ret = ret;
+ return CURLE_WRITE_ERROR;
}
if (pause) {
int ret = client->send_data(ptr, size * nmemb, &pause);
if (ret < 0) {
- dout(0) << "WARNING: client->receive_data() returned ret=" << ret << dendl;
+ dout(5) << "WARNING: client->send_data() returned ret=" << ret << dendl;
+ req_data->user_ret = ret;
+ return CURLE_READ_ERROR;
}
if (ret == 0 &&
curl_multi_remove_handle((CURLM *)multi_handle, e);
long http_status;
- curl_easy_getinfo(e, CURLINFO_RESPONSE_CODE, (void **)&http_status);
-
- int status = rgw_http_error_to_errno(http_status);
- if (result != CURLE_OK && status == 0) {
- dout(0) << "ERROR: curl error: " << curl_easy_strerror((CURLcode)result) << ", maybe network unstable" << dendl;
- status = -EAGAIN;
+ int status;
+ if (!req_data->user_ret) {
+ curl_easy_getinfo(e, CURLINFO_RESPONSE_CODE, (void **)&http_status);
+
+ status = rgw_http_error_to_errno(http_status);
+ if (result != CURLE_OK && status == 0) {
+ dout(0) << "ERROR: curl error: " << curl_easy_strerror((CURLcode)result) << ", maybe network unstable" << dendl;
+ status = -EAGAIN;
+ }
+ } else {
+ status = *req_data->user_ret;
+ rgw_err err;
+ set_req_state_err(err, status, 0);
+ http_status = err.http_ret;
}
int id = req_data->id;
finish_request(req_data, status, http_status);