2012-01-27 1 views
6

Мне нужно найти определенный сайт, который хранит идентификатор сеанса с idhttp от indy.Сессия cookie с indy

Я использую следующий код для инициализации компонентов, которые мне нужны.

procedure InitSession; 
begin 
    Initalized := True; 
    try 
    ihttp := TIdHTTP.Create(nil); //the variables are declared globally 
    idCookie := TIdCookieManager.Create(nil); 
    ihttp.ConnectTimeout := 5000; 
    ihttp.AllowCookies := true; 
    ihttp.HandleRedirects := true; 
    ihttp.CookieManager := idCookie; 
    except 
    Initalized := False; 
    end; 
end; 

Проблема в том, что я делаю запрос, чтобы файл cookie не был отправлен. Что мне нужно сделать, чтобы отправить cookie-witch содержит идентификатор сеанса. Спасибо

+1

Необходимо указать, какую версию Indy вы используете, поскольку функциональность изменилась (иногда резко) между версиями. Поэтому, как делать вещи, можно резко изменить. –

+1

Я рекомендую попробовать текущую версию Indy из Subversion или ежедневные снимки – mjn

ответ

6

Если cookie не отправляется в новых запросах, то либо TIdCookieManager отклонил cookie, когда он был получен, либо не соответствует принятому cookie новым запросам. Можете ли вы показать фактические заголовки ответов Set-Cookie, которые отправляют файлы cookie, и URL (ы), на которые, по вашему мнению, не будут отправлены файлы cookie правильно? Вы подтвердили, что после получения файла cookie он фактически заканчивается в TIdCookieManager перед отправкой нового запроса?

Какая версия Indy вы используете? До 2011 года более ранние версии Indy 10 действительно нарушали обработку файлов cookie, которые были в основном непригодными для использования. Но в начале 2011 года IdCookieManager.pas и IdCookie.pas были полностью переписаны с нуля, и с мая 2011 года работали должным образом, и я не видел никаких новых сообщений о неправильном обращении с cookie.

+0

Я использую Delphi XE 2 ... поэтому, когда я использую метод ihttp.Get(), cookie должен быть отправлен автоматически или я должен установить его вручную? Файл cookie получен надлежащим образом в менеджере файлов cookie. как я могу это сделать? – opc0de

+0

Я попробовал этот ihttp.Request.CustomHeaders.Add ('Cookie:' + idcookie.CookieCollection.Cookies [0] .ClientCookie); , но без успеха – opc0de

+0

Куки обрабатываются автоматически. Опять же, как выглядит заголовок 'Set-Cookie' сервера, который получает cookie? Вы можете получить это значение из свойства 'TIdHTTP.Response.RawHeaders'. Какой URL-адрес вы запрашиваете после этого, который не отправляет файл cookie? Мне нужна эта информация, чтобы определить, работает ли Indy правильно или если это ошибка в обновленном коде управления cookie. –

0

Есть ли проблема с файлами cookie, которые не имеют свойства DOMAIN? IdCookie, который поставляется с DXE2, не может анализировать файлы cookie, которые НЕ имеют свойство MAX-AGE, имеют свойство EXPIRES и не имеют свойства DOMAIN. См. IdCookie.pas 675, где S, похоже, имеет неожиданное значение (осталось от разбора свойства expires).