2012-04-23 5 views
1

Я использую Indy TIdHTTP вместе с TIdCookieManager. Я хотел бы проверить текущие файлы cookie для запроса, который я собираюсь отправить, и определить вероятность того, что он будет действительным (я знаю, что не могу быть на 100% уверен, что сервер примет мой запрос). Если нет файлов cookie или срок их действия истек, я хочу сначала войти в систему и приобрести новые файлы cookie. В противном случае просто отправьте запрос.TIdHTTP: Проверьте действительные файлы cookie перед отправкой запроса?

Как я могу сделать такую ​​проверку? Я считаю, что я должен проверить менеджера файлов cookie, прежде чем отправлять запрос, но не знаю, что проверить.

+0

Вы должны запросить фактическую страницу и проверить, соответствует ли контент веб-странице с подтверждением или некоторой ошибке. Это единственный способ увидеть, что сервер принимает ваши файлы cookie;) – opc0de

+0

Вы не можете проверить правильность файла cookie, это задача/ответственность сервера. Печенье может быть зашифровано, поэтому оно бесполезно ... – whosrdaddy

+1

Нет, но вы можете проверить, по крайней мере, истек ли файл cookie. Вы можете запросить «TIdCookieManager» список файлов cookie для URL-адреса, на который вы хотите отправить запрос, и посмотреть, действительно ли он содержит куки-файл в списке. –

ответ

2

попробовать что-то вроде этого:

function CheckCookies(Cookies: TIdCookieManager; const TargetURL: String): Boolean; 
var 
    URL: TIdURI; 
    Headers: TIdHeaderList; 
begin 
    Result := False; 

    URL := TIdURI.Create(TargetURL); 
    try 
    Headers := TIdHeaderList.Create(QuoteHTTP); 
    try 
     Cookies.GenerateClientCookies(URL, False, Headers); 
     Result := Headers.Count > 0; 
    finally 
     Headers.Free; 
    end; 
    finally 
    URL.Free; 
    end; 
end; 

.

if not CheckCookies(IdHTTP1.CookieManager, 'http://www.someurl.com/') then 
begin 
    // login and get new cookies ... 
end; 
+0

Еще не пробовал, но не должно быть 'if CheckCookies()', а не 'if not CheckCookies()'? Или на самом деле это действительно зависит от предполагаемого использования, я, по-видимому, хочу обрабатывать оба события. –

+0

Я исходил из предположения, что '...' будет частью для повторного входа в систему и получения новых файлов cookie. Я соответствующим образом обновил свой ответ. –

1

Как уже указано в комментариях, вы не можете выполнить фактическую акцептную проверку на клиенте, только сервер может это сделать.

Однако вы можете отфильтровать с истекшим сроком годности или недействительное печенье:

function filterInvalidCookies(cookies: TIdCookies; targetURL: TIdURI): Boolean; 
var 
    c: Integer; 
begin 
    Result := False; 

    c := 0; 
    while (cookies.Count > c) do 
    if (not cookies[c].IsExpired and cookies[c].IsAllowed(targetURL, False) and 
     (cookies[c].CookieName <> '')) then 
     begin 
     Result := True; 
     Inc(c); 
     end 
    else 
     cookies.Delete(c); 
end; 

Функция удаляет недействительные печенья и возвращает значение False, если нет действительных из них остались. Назовите это прежде, чем запрос, как это:

if (Assigned(con.CookieManager)) then 
    filterInvalidCookies(con.CookieManager.CookieCollection, 
    TIdURI.Create('http://www.someurl.com/')); 

где con является TIdHTTP объект.

Вы можете сделать дополнительные, возможно, целевые страницы.

+2

Существует более простой способ устранения устаревших файлов cookie - вызов метода 'TIdCookieManager.GenerateClientCookies()'. Он удалит файлы с истекшим сроком действия до того, как заполнит список выходных данных, обновив соответствующие файлы cookie. В будущей версии 'TIdCookieManager' (уже в работе) у него будет несколько новых методов (' RemoveExcessCookies() ',' RemoveExpiredCookies() 'и' RemoveNonPersistentCookies() '), чтобы обеспечить больший контроль над управлением файлами cookie. –

+0

Похож на хорошее решение, но все, что мне нужно, это проверить, существует ли определенный файл cookie, и если он не истек. Мне не обязательно их удалять, хотя я уверен, что это поможет. –

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