Создав
собственный 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 аналогична.
Смотрите также:
Оставьте свой комментарий
Вы должны быть авторизированны, чтобы оставить комментарий.