2010-06-28 2 views
1

Эта проблема/quirk/побочный эффект сводит меня с ума. В нижней части кода код ответа HTTP-взаимодействия передается по ссылке в responseCode_. Однако он часто появляется как 0, хотя в противном случае сайт может быть обращен к нему и возвращается слишком быстро, чтобы быть таймаутом.C++ libcurl http-код ошибки ответа

Все переменные определены, код ниже - всего лишь фрагмент метода C++ в классе , Любые переменные var_ основаны на экземплярах. Он работает на нескольких потоках, но это не должно быть проблемой. Каждый класс, использующий libcurl, имеет свой собственный экземпляр для соответствующих потоков.

Заранее спасибо за любые идеи или советы ...

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); 

Update:

curl_easy_perform не возвращался CURLE_OK, когда код ответа был 0, как объясняет отмеченный ответ. Однако отладочные крючки очень полезны и отличное предложение

ответ

2

Код ответа будет установлен только в том случае, если curl_easy_perform() возвращает CURLE_OK, поэтому вы должны убедиться, что сначала убедитесь, что завиток действительно выполнил запрос успешно. Вы уверены, что функции обратного вызова для записи заголовка и тела настроены правильно?

Кроме того, убедитесь, что curl_global_init (CURL_GLOBAL_ALL) вызывается до запуска этих потоков easy_perform.

Предполагая, что ничего в ручке curl, возвращаемом curl_easy_init(), не разделяется нитями, тогда код выглядит правильно.

2

Используйте отладочные крючки, встроенные в libcurl.

Серьезно. libcurl - кошмар «C» от ​​void* s и коды ошибок. Все может ошибаться при использовании libcurl. Напиши свои крючки отладки libcurl один раз и не удаляйте их из своего кода. Вы будете нуждаться в них снова, и снова, и снова.

Смежные вопросы