Обрабатывает ли Wininet значение заголовка HTTP «Set-Cookie»? - PullRequest
0 голосов
/ 16 июля 2011

У меня есть пользовательский компонент http, который использует Wininet для обработки HTTP POST и GET. Он работает нормально, но некоторые сайты возвращают параметр Set-Cookie в заголовке ответа, и они ожидают, что этот cookie будет использоваться браузером при следующих вызовах. Насколько я вижу, мой компонент на основе wininet не обрабатывает эти куки. Я вижу это, когда использую некоторые http-снифферы, такие как Http Analyzer. IE работает нормально. В моем заголовке нет ничего особенного, это то же самое, что IE создает.

Должен ли я сам позаботиться об этих куки? Если да, то как?

Ответы [ 2 ]

1 голос
/ 16 июля 2011

WinInet не обрабатывает куки.Вы должны справиться с этим самостоятельно.

В библиотеке WinInet вы найдете InternetGetCookie() и InternetSetCookie().Есть хорошая статья в MSDN Управление файлами cookie .

Особенности будут зависеть от вашего приложения и его архитектуры, но я обычно нахожу реализации, использующие InternetGetCookie() неуклюжие.Вместо этого я извлеку все HTTP-заголовки в линию с вызовами InternetReadFile(), затем вызову InternetSetCookie(), если cookie существует:

// Create a session cookie.
bReturn = InternetSetCookie(TEXT("http://www.adventure_works.com"), NULL,
            TEXT("TestData = Test"));

Можно найти статьи MSDN с примерами для получения HTTP-заголовков здесь .

0 голосов
/ 14 сентября 2017

Ответ выше неправильный.CInternetSession действительно обрабатывает куки.Если ответ http в рамках этого сеанса возвращает заголовок Set-Cookie, файл cookie будет автоматически сохранен объектом сеанса и возвращен на сервер при последующих запросах.Нет необходимости использовать SetCookie ().

Однако есть несколько предостережений и ловушек: Файлы cookie, возвращаемые без даты истечения срока действия, являются файлами cookie сеанса и сохраняются только в MEMORY.Когда объект CInternetSession уничтожен, они исчезают навсегда.

Можно установить флаги в объекте CInternetSession с помощью SetOption и для запросов, которые отключают куки.Смотрите флаги INTERNET_OPTION_SUPPRESS_SERVER_AUTH и INTERNET_FLAG_NO_COOKIES.Береги себя, чтобы ты этого не сделал.

Остерегайтесь кэширования.ПОЛУЧИТЕ сценарий один раз, чтобы получить cookie, затем ПОЛУЧИТЕ его снова, чтобы напечатать возвращенный файл cookie.И это не работает!Печенье не печатается.Зачем?Потому что «файл» кешируется.При втором вызове wininet не связывается с сервером, он снова дает вам старый ответ, который, конечно, не распечатал куки.Чтобы избежать этого, вы должны использовать флаг INTERNET_FLAG_RELOAD.Вот суть:

int flags = INTERNET_FLAG_RELOAD;
int port = INTERNET_DEFAULT_HTTP_PORT;
CHttpConnection *connection = session.GetHttpConnection("www.example.com", flags, port);
CHttpFile *fil = connection->OpenRequest(CHttpConnection::HTTP_VERB_GET, "cgi-bin/test.pl",
                                         0,1,0, "HTTP/1.1", flags);
fil->SendRequest();

Также обратите внимание, что если файл cookie задается сценарием с URL-адресом http: //example.com/cgi-bin/test.pl, он связан с URL-адресом http: //example.com/cgi-bin/, поэтому будет возвращен сценарий http: //example.com/cgi-bin/hello.pl.Заголовок cookie может изменить это поведение.

...