size_t CurlHttpClient::ReadBody(char* ptr, size_t size, size_t nmemb, void* userdata) { CurlReadCallbackContext* context = reinterpret_cast<CurlReadCallbackContext*>(userdata); if(context == nullptr) { return 0; } const CurlHttpClient* client = context->m_client; if(!client->IsRequestProcessingEnabled()) { return 0; } HttpRequest* request = context->m_request; std::shared_ptr<Aws::IOStream> ioStream = request->GetContentBody(); if (ioStream != nullptr && size * nmemb) { size_t amountToRead = size * nmemb; ioStream->read(ptr, amountToRead); size_t amountRead = static_cast<size_t>(ioStream->gcount()); auto& sentHandler = request->GetDataSentEventHandler(); if (sentHandler) { sentHandler(request, static_cast<long long>(amountRead)); } return amountRead; } return 0; }
bool WinSyncHttpClient::StreamPayloadToRequest(const HttpRequest& request, void* hHttpRequest) const { bool success = true; auto payloadStream = request.GetContentBody(); if(payloadStream) { auto startingPos = payloadStream->tellg(); char streamBuffer[ HTTP_REQUEST_WRITE_BUFFER_LENGTH ]; bool done = false; while(success && !done) { payloadStream->read(streamBuffer, HTTP_REQUEST_WRITE_BUFFER_LENGTH); std::streamsize bytesRead = payloadStream->gcount(); success = !payloadStream->bad(); uint64_t bytesWritten = 0; if (bytesRead > 0) { bytesWritten = DoWriteData(hHttpRequest, streamBuffer, bytesRead); if (!bytesWritten) { success = false; } } auto& sentHandler = request.GetDataSentEventHandler(); if (sentHandler) { sentHandler(&request, (long long)bytesWritten); } if(!payloadStream->good()) { done = true; } success = success && IsRequestProcessingEnabled(); } payloadStream->clear(); payloadStream->seekg(startingPos, payloadStream->beg); } if(success) { success = DoReceiveResponse(hHttpRequest); } return success; }