Libcurl возвращает поврежденные данные - PullRequest
0 голосов
/ 17 декабря 2018
curl_easy_setopt(m_pCurl,   CURLOPT_URL, szURL);
curl_easy_setopt(m_pCurl,   CURLOPT_UPLOAD,0);
curl_easy_setopt(m_pCurl,   CURLOPT_WRITEFUNCTION, s_Write_Data);
curl_easy_setopt(m_pCurl,   CURLOPT_WRITEDATA, this);
curl_easy_setopt(m_pCurl, CURLOPT_CONNECTTIMEOUT, 10);
curl_easy_setopt(m_pCurl, CURLOPT_NOPROGRESS, 0);
curl_easy_setopt(m_pCurl, CURLOPT_PROGRESSFUNCTION, s_Progress);
curl_easy_setopt(m_pCurl, CURLOPT_PROGRESSDATA, this);
curl_easy_setopt(m_pCurl, CURLOPT_HTTP_CONTENT_DECODING, 0L);

Выше приведены все мои варианты перевода.Загрузка возвращает файл .tar.gz, который с помощью командной строки curl или WGET возвращает абсолютно нормально, при использовании libcurl возвращаемые данные имеют длину около 8 Кб, выполнение команды cmp показывает, что 2 файла изменяются в пределах первых 10 байтов.Просматривал это в течение 2 дней без признаков надежды.Пробовал различные комбинации различных опций.

s_Write_Data реализован как:

size_t CCurlManager::s_Write_Data(void *buffer, size_t size, size_t nmemb, void *userp)
{

    CCurlManager *pThis = reinterpret_cast<CCurlManager *>(userp);
    return pThis->WriteData(buffer, size, nmemb);


}

Заголовок ответа, который я получаю от curl verbose:

HTTP/1.1 200 OK

Date: Mon, 17 Dec 2018 13:56:39 GMT

Server: Apache/2.2.13 (Linux/SUSE)

X-Powered-By: PHP/5.4.20

Content-Length: 393800

Content-Disposition: attachment; filename="test.tar.gz"

Connection: close

Content-Type: application/octet-stream

1 Ответ

0 голосов
/ 04 января 2019

Это была проблема с wxString (wxWidgets), wxString (char *, int) создает строку char * для максимального количества символов int ИЛИ до тех пор, пока не будет достигнут нулевой char, это нестандартно среди большинства других (char*, int) строковые конструкторы, которые просто читают символы int.

В основном моя созданная строка в моей функции WriteData заканчивалась при достижении нулевого символа.

...