Я использую Curlpp для отправки запросов различным веб-сервисам для отправки и получения данных. До сих пор это работало нормально, так как я использовал его только для отправки/получения данных JSON.
Теперь у меня есть ситуация, когда веб-сервис возвращает zip-файл в двоичной форме. Здесь я столкнулся с проблемой, когда полученные данные не являются полными.
Сначала я настроил Curl на запись любых данных в поток ostringstream с помощью параметра WriteStream, но это оказалось неправильным подходом, поскольку данные содержали нулевые символы, и, таким образом, данные останавливались на первом нулевом символе.
После этого вместо использования WriteStream я использовал WriteFunction с функцией обратного вызова. Проблема в этом случае в том, что эта функция всегда вызывается 2 или 3 раза, независимо от количества данных. Это приводит к тому, что всегда есть несколько фрагментов данных, которые не кажутся первой частью файла, хотя данные всегда содержат PK в качестве первых двух символов, что указывает на zip-файл.
Я использовал несколько инструментов, чтобы убедиться, что данные полностью отправляются в мое приложение, поэтому это не проблема веб-сервиса.
Вот код. Обратите внимание, что такие параметры, как имя хоста, порт, заголовки и почтовые поля, устанавливаются в другом месте.
string requestData;
size_t WriteStringCallback(char* ptr, size_t size, size_t nmemb)
{
requestData += ptr;
int totalSize= size*nmemb;
return totalSize;
}
const string CurlRequest::Perform()
{
curlpp::options::WriteFunction wf(WriteStringCallback);
this->request.setOpt( wf );
this->request.perform();
return requestData;
}
Я надеюсь, что кто-нибудь может помочь мне с этой проблемой, потому что я исчерпал какие-либо идеи о том, как это исправить, а также потому, что curlpp плохо документирован (и еще хуже, поскольку веб-сайт curlpp исчез).