Ricevere risposte binarie di libcurl in uno std::string C++
Passate uno std::string come contesto della callback e aggiungete conteggi espliciti dei byte quando ricevete dati binari con libcurl.
Un proxy può recuperare l'HTML correttamente e comunque corrompere un'immagine mentre la copia in un buffer C++. Prima di modificare il protocollo del proxy, controllate la callback di ricezione e l'oggetto passato come suo contesto.
CURLOPT_WRITEDATA fornisce un puntatore alla callback di scrittura. Senza una callback personalizzata, lo scrittore predefinito di libcurl si aspetta un FILE *. Un indirizzo come &response, dove response è uno std::string, ha senso solo quando la vostra callback riconverte quel contesto nel tipo previsto.
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;
}Registrate entrambe le metà sull'handle semplice usato per il trasferimento:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);La chiamata append usa il conteggio dei byte consegnato. I dati della callback non sono terminati da null e un'immagine può contenere byte zero; misurarla con strlen perderebbe parte del corpo. Una risposta può anche arrivare attraverso molte chiamate di dimensioni diverse.
Restituire il conteggio dei byte consumati accetta il blocco. Restituire un conteggio diverso interrompe il trasferimento con un errore di scrittura. La protezione delle eccezioni impedisce a un errore di allocazione di sfuggire oltre il confine della callback C; il chiamante deve comunque controllare il risultato del trasferimento prima di trattare response come un file completo.
Mantenete viva la stringa finché il trasferimento non è terminato. Se una scrittura asincrona sul socket ne inoltra poi il contenuto, mantenete vivi quei byte finché anche quella scrittura non è completata. Per risposte grandi, una disposizione in streaming limitata è preferibile all'accumulo dell'intero corpo.