Как (т.е. какой инструмент использовать) контролировать заголовки, отправленные Curl (проблема с cookie) - PullRequest
1 голос
/ 23 февраля 2010

Я использую Curl (libcurl) в приложении C ++ и не могу отправлять куки (я думаю).

У меня установлены заголовки Fiddler, TamperData и LiveHTTP, но они полезны только для просмотра трафика браузера и, как мне кажется, не способны отслеживать общий сетевой трафик на машине, поэтому при запуске компьютера я не вижу отправляемая информация заголовка. Однако при просмотре страницы в браузере при успешном входе в систему я вижу, что информация о файлах cookie отправляется.

Когда я запускаю свое приложение, я успешно захожу на страницу, а затем пытаюсь получить другую страницу, данные (страницы) указывают на то, что я не вошел в систему - то есть "состояние" как-то потеряно.

Мой код на C ++ выглядит нормально, поэтому я не знаю, что происходит, - вот почему мне нужно:

  1. Сначала можно будет просматривать сетевой трафик моих машин (не только трафик браузера) - какой (бесплатный) инструмент?

  2. Если я неправильно использую Curl, что не так с моим кодом? (cookie-файлы извлекаются и хранятся нормально, кажется, что по какой-то причине они просто не отправляются с запросами.

Вот раздел моего класса, который касается файлов cookie запросов Http:

curl_easy_setopt(curl, CURLOPT_TIMEOUT, long(m_timeout));
curl_easy_setopt(curl, CURLOPT_USERAGENT,
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; WOW64; SV1; .NET CLR 2.0.50727)");
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt");
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CurlCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, this);

Что-то не так с приведенным выше кодом?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2010

Вы можете использовать Wireshark (бывший Ethereal) для просмотра всего сетевого трафика, который машина отправляет и получает.

0 голосов
/ 23 февраля 2010
  1. Как сказал Шон Карпентер, Wireshark - это правильный инструмент для просмотра сетевого трафика. Запустите захват и используйте http в качестве фильтра, чтобы видеть только HTTP-трафик. Если вы просто хотите увидеть HTTP-запросы / ответы, отправленные / полученные Curl, установите опцию CURL_VERBOSE и посмотрите на stderr: curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L).
  2. Полагаю, вы правильно используете Curl. Скомпилируйте и запустите следующий (полный) пример; вы увидите, что во второй раз когда вы его запускаете (когда существует cookies.txt), куки отправляются на сервер.

Пример кода:

#include <stdio.h>
#include <curl/curl.h>

int main()
{
    CURL *curl;
    CURLcode success;
    char errbuf[CURL_ERROR_SIZE];
    int m_timeout = 15;

    if ((curl = curl_easy_init()) == NULL) {
        perror("curl_easy_init");
        return 1;
    }

    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

    curl_easy_setopt(curl, CURLOPT_TIMEOUT, long(m_timeout));
    curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com/");
    curl_easy_setopt(curl, CURLOPT_USERAGENT,
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; WOW64; SV1; .NET CLR 2.0.50727)");
    curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt");
    curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt");
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1L);

    if ((success = curl_easy_perform(curl)) != 0) {
        fprintf(stderr, "%s: %s\n", "curl_easy_perform", errbuf);
        return 1;
    }

    curl_easy_cleanup(curl);
    return 0;
}
...