static size_t recvBody()

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;
    }