FoxBase!
msgbartop
Блог Oracle разработчика
msgbarbottom
foxbase

13.10.2010 Indy HandleRedirects и Cookie Manager своими руками

Indy HandleRedirects
Создав собственный Cookie Manager для Indy, в котором отсутствуют ошибки при формировании Cookies и который не требует правки исходного кода Indy (и соответственно не зависит от любых изменений в новых грядущих версиях Indy) автор натолкнулся на неприятную проблему, которая сразу не была выявлена.
Суть проблемы состоит в том, сто если выставить в TIdHTTP свойство HandleRedirects в true, то в этом случае Indy выполняет автоматический редирект методом GET на URL, заданный в свойстве Location заголовка ответа HTTP сервера. Свойство HandleRedirects в принципе полезное, но при использовании нашего Cookie Manager не считываются и не записываются Cookies при выполнении этого внутреннего GET на URL редиректа. Попытки автора как-то считывать и записывать Cookies без правки исходного кода успехом не увенчались. Поэтому с прискорбием приходится сообщить, что использовать свойство HandleRedirects с нашим Cookie Manager невозможно, и это свойство необходимо выставить в false. Редирект придется выполнять самостоятельно.
Для выявления необходимости выполнить редирект предлагается следующая функция:

function THTTP1.GetRedirectUrl: string;
begin
  Result:='';
  if (ResponseCode>=300) and (ResponseCode<>304)
  and (ResponseCode<>201) and (Response.Location<>'') then
  Result:=Response.Location;
end;
Эта функция вернет URL редиректа, если таковой обнаружен в заголовке ответа сервера или пустую строку, если редирект не обнаружен. Вызывать эту функцию необходимо после выполнения функций HTTP_Get или HTTP_Post, которые содержат вызов функций WriteCookies и ReadCookies перед и после выполнения методов GET и POST соответственно (примеры таких функций приведены ы статьях: "Indy TIdHTTP.POST и русские символы в HTML" и "Indy TIdHTTP.GET и русские символы в HTML"). Получив непустой URL редиректа необходимо вызвать функцию HTTP_Get, которая выполнит корректный запрос с сохранением и чтением Cookies в нашем Cookie Manager.
Особенностью реализации механизма HandleRedirects в Indy является возбуждение Exception при выполнении POST или GET в том случае, если существует URL редиректа (в поле Location заголовка ответа сервера) и если HandleRedirects отключен. Поэтому теперь вызывать методы POST и GET необходимо в окружении try..except
Пример реализации функции HTTP_Get

function THTTP1.HTTP_Get(URL: string): string;
begin
  WriteCookies(url);
  try
    Result:=http.Get(URL);
  except
  end;  
  // Анализ http.ResponseCode...
  ReadCookies(URL);
  if not http.HandleRedirects and (http.GetRedirectUrl<>'') then
    Result:=HTTP_Get(http.GetRedirectUrl);
end;
Реализация метода HTTP_Post аналогична. 

www.foxbase.ru


Смотрите также:



Оставьте свой комментарий

Вы должны быть авторизированны, чтобы оставить комментарий.