Recevoir des réponses binaires libcurl dans un std::string C++
Passez un std::string comme contexte de rappel et ajoutez des comptes d'octets explicites lors de la réception de données binaires avec libcurl.
Un proxy peut récupérer du HTML avec succès et pourtant corrompre une image en la copiant dans un tampon C++. Avant de modifier le protocole du proxy, vérifiez la fonction de rappel de réception et l'objet transmis comme contexte.
CURLOPT_WRITEDATA fournit un pointeur vers la fonction de rappel d'écriture. Sans fonction de rappel personnalisée, l'écrivain par défaut de libcurl attend un FILE *. Une adresse comme &response, où response est un std::string, n'a de sens que si votre fonction de rappel reconvertit ce contexte vers le type prévu.
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;
}Enregistrez les deux moitiés sur le handle simple utilisé pour le transfert :
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);L'appel append utilise le nombre d'octets fourni. Les données de rappel ne se terminent pas par un zéro et une image peut contenir des octets nuls ; la mesurer avec strlen perdrait une partie du corps. Une réponse peut aussi arriver via de nombreux appels de tailles différentes.
Renvoyer le nombre d'octets consommés accepte le fragment. Renvoyer un nombre différent interrompt le transfert avec une erreur d'écriture. La garde d'exception empêche un échec d'allocation de s'échapper au-delà de la frontière de la fonction de rappel C ; l'appelant doit tout de même vérifier le résultat du transfert avant de traiter response comme un fichier complet.
Maintenez la chaîne en vie jusqu'à la fin du transfert. Si une écriture asynchrone sur la socket en transmet ensuite le contenu, maintenez ces octets en vie jusqu'à ce que cette écriture soit également terminée. Pour les réponses volumineuses, une organisation en flux bornée est préférable à l'accumulation de tout le corps.