2010-06-28 13 views
1

Ce problème/bizarre/effet secondaire me rend fou. Près du bas, le code, le code de réponse de l'interaction HTTP est passé par référence dans responseCode_. Cependant, il apparaît souvent comme 0 même si le site peut être accédé, et revient trop vite pour être un timeout ...Problèmes avec le code de réponse http libcurl C++

Toutes les variables sont définies, le code ci-dessous est juste un extrait d'une méthode C++ dans une classe . Toutes les variables var_ sont basées sur une instance. Il fonctionne sur plusieurs threads, mais cela ne devrait pas poser de problème. Chaque classe qui utilise libcurl a sa propre instance sur les threads respectifs.

Merci à l'avance pour des idées ou des conseils ...

CURL *curl; 
curl = curl_easy_init(); 
//The URL 
curl_easy_setopt(curl, CURLOPT_URL, url.getURLString().c_str()); 
//Timeout 
curl_easy_setopt(curl, CURLOPT_TIMEOUT, &timeout_); 
//disable signals to use with threads 
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); 
//Redirecting 
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 5); 
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); 
//Writing callback 
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, &writerh); 
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &head_); 
//Writing callback 
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writerb); 
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body_); 
//Headers 
struct curl_slist *headers = NULL; 
for (std::map<std::string, std::string>::iterator itr = requestHeaders_.begin(); itr != requestHeaders_.end(); itr++) { 
    std::stringstream header; 
    header << itr->first << ": " << itr->second; 
    headers = curl_slist_append(headers, header.str().c_str()); 
} 
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 
//UA 
curl_easy_setopt(curl, CURLOPT_USERAGENT, "RDFaS-Bot/1.0 (+http://www.rdfas.com/bot)"); 
curl_easy_perform(curl); /* ignores error */ 
//Response code 
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responseCode_); 
//clean headers 
curl_slist_free_all(headers); 
curl_easy_cleanup(curl); 

Mise à jour:

curl_easy_perform ne retournerait pas CURLE_OK lorsque le code de réponse était de 0, comme la réponse marquée explique. Cependant, les hooks de débogage sont très utiles et une excellente suggestion

Répondre

2

Le code de réponse ne sera défini que si curl_easy_perform() retourne CURLE_OK, donc vous devriez vérifier cela en premier pour vous assurer que curl a correctement exécuté la requête. Êtes-vous sûr que les fonctions de rappel pour l'écriture de l'en-tête et du corps sont correctement configurées?

Assurez-vous également que curl_global_init (CURL_GLOBAL_ALL) est appelé avant le démarrage de ces threads easy_perform.

En supposant que rien dans la poignée curl renvoyée par curl_easy_init() n'est partagé entre les threads, le code semble correct.

2

Utilisez les crochets de débogage intégrés à libcurl.

Sérieusement. libcurl est un cauchemar "C" de void* s et des codes d'erreur. Tout peut peut se passer lors de l'utilisation de libcurl. Ecrivez vos hooks de débogage libcurl une fois et ne les retirez pas de votre code. Vous aurez besoin d'eux encore, et encore, ... et encore.