in sdk/src/http/CurlHttpClient.cc [255:303]
static size_t recvBody(char *ptr, size_t size, size_t nmemb, void *userdata)
{
TransferState *state = static_cast<TransferState*>(userdata);
const size_t wanted = size * nmemb;
if (state == nullptr ||
state->response == nullptr ||
wanted == 0) {
return -1;
}
if (state->firstRecvData) {
long response_code = 0;
curl_easy_getinfo(state->curl, CURLINFO_RESPONSE_CODE, &response_code);
if (response_code / 100 == 2) {
state->response->addBody(state->request->ResponseStreamFactory()());
if (state->response->Body() != nullptr) {
state->recvBodyPos = state->response->Body()->tellp();
}
PDS_LOG(LogLevel::LogDebug, TAG, "request(%p) setResponseBody, recvBodyPos:%lld",
state->request, state->recvBodyPos);
}
else {
state->response->addBody(std::make_shared<std::stringstream>());
}
state->firstRecvData = false;
}
std::shared_ptr<std::iostream> &content = state->response->Body();
if (content == nullptr || content->fail()) {
return -2;
}
content->write(ptr, static_cast<std::streamsize>(wanted));
if (content->bad()) {
return -3;
}
state->transferred += wanted;
if (state->progress) {
state->progress(wanted, state->transferred, state->total, state->userData);
}
if (state->enableCrc64) {
state->recvCrc64Value = CRC64::CalcCRC(state->recvCrc64Value, (void *)ptr, wanted);
}
return wanted;
}