Binäre libcurl-Antworten in einen C++-std::string empfangen
Übergeben Sie einen std::string als Callback-Kontext und fügen Sie explizite Byteanzahlen hinzu, wenn Sie Binärdaten mit libcurl empfangen.
Ein Proxy kann HTML erfolgreich abrufen und trotzdem ein Bild beschädigen, während er es in einen C++-Puffer kopiert. Bevor Sie das Proxy-Protokoll ändern, prüfen Sie den Empfangs-Callback und das als Kontext übergebene Objekt.
CURLOPT_WRITEDATA liefert einen Zeiger auf den Schreib-Callback. Ohne einen benutzerdefinierten Callback erwartet der Standard-Writer von libcurl einen FILE *. Eine Adresse wie &response, bei der response ein std::string ist, ergibt nur Sinn, wenn Ihr Callback diesen Kontext auf den beabsichtigten Typ zurückcastet.
static size_t receive(char* data, size_t size,
size_t count, void* context) {
const size_t bytes = size * count;
auto* body = static_cast<std::string*>(context);
try {
body->append(data, bytes);
} catch (...) {
return 0;
}
return bytes;
}Registrieren Sie beide Hälften am einfachen Handle, das für die Übertragung verwendet wird:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);Der append-Aufruf verwendet die übergebene Byteanzahl. Callback-Daten sind nicht nullterminiert, und ein Bild kann Nullbytes enthalten; eine Messung mit strlen würde einen Teil des Bodys verlieren. Eine Antwort kann auch über viele Callback-Aufrufe unterschiedlicher Größe eintreffen.
Die Rückgabe der verbrauchten Byteanzahl nimmt den Block an. Die Rückgabe einer anderen Anzahl bricht die Übertragung mit einem Schreibfehler ab. Der Ausnahme-Schutz verhindert, dass ein Allokationsfehler über die C-Callback-Grenze entweicht; der Aufrufer muss das Übertragungsergebnis dennoch prüfen, bevor er response als vollständige Datei behandelt.
Halten Sie den String am Leben, bis die Übertragung abgeschlossen ist. Wenn ein asynchroner Socket-Schreibvorgang anschließend seinen Inhalt weiterleitet, halten Sie diese Bytes am Leben, bis auch dieser Schreibvorgang abgeschlossen ist. Bei großen Antworten ist eine begrenzte Streaming-Anordnung dem Ansammeln des gesamten Bodys vorzuziehen.