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.

Ähnliche Artikel