Проблемы с кодом ответа C ++ libcurl http - PullRequest
1 голос
/ 29 июня 2010

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

Все переменные определены, приведенный ниже код является просто фрагментом метода 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);

Обновление:

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

Ответы [ 2 ]

2 голосов
/ 29 июня 2010

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

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

2 голосов
/ 29 июня 2010

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

Кроме того, убедитесь, что curl_global_init (CURL_GLOBAL_ALL) вызывается до того, как эти потоки easy_perform запускаются.дескриптор, возвращаемый curl_easy_init (), разделяется между потоками, тогда код выглядит правильно.

...