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

14.12.2010 Indy Cookie Manager своими руками. Работа над ошибками.

Недавно обнаружил одну неприятную ошибку в своем Indy Cookie Manager. Внимательный читатель я думаю уже сам обнаружил эту проблему и исправил, но те, кто использовал код нашего Indy Cookie Manager может исправить эту проблему согласно приведенным ниже инструкциям.
В чем суть проблемы. Процедура WriteCookies использует для сравнения домена Cookie (при помощи GetCookieDomain) и домена URL вспомогательную функцию GetUrlDomain. В последней редакции эта процедура была переделана для получения домена URL второго уровня. Хотя в первой редакции эта процедура получала домен URL любого уровня. Такая переделка была призвана решить одну очень интересную ситуацию, но при этом внесла новую проблему. Что очень плохо, но в этой проблеме мы сейчас разберемся и исправим ее. Итак, функция GetUrlDomain в первой редакции всегда получала домен заданного URL любого уровня, что было в принципе хорошо и вроде как правильно. Однако в ситуации постинга в хитрый Яндекс возникала проблема с Cookies. Например, необходимо авторизоваться на сервисе социальных закладок Яндекса. Это zaklzdki.yandex.ru. Но авторизация идет через passport.yandex.ru. В обоих случаях домен в Cookie yandex.ru. Понятно, что прямое сравнение доменов в Cookie и доменов третьего уровня этих сайтов не проходит, Яндекс в итоге Cookies не видит, авторизация не работает. Для решения этой проблемы автором функция GetUrlDomain была переписана так, чтобы всегда получать из URL домен только второго уровня. Проблема с хитрым Яндексом была решена. Но когда автор начал постить ЖЖ блоги, постинг перестал работать и понятно почему. В ЖЖ все домены третьего уровня. В общем решение одной проблемы породило новую.
В итоге на данный момент автор решил проблему следующим образом. Функцию GetUrlDomain я привел к первому варианту, а прямое сравнение доменов в процедуре WriteCookies было заменено на поиск вхождения домена Cookie в домен URL. Теперь исправно работает и вариант авторизации в хитром Яндексе и регистрация в ЖЖ :)
Исправленные функции приведены ниже:

function THTTP1.GetURLDomain(url: string): string;
  var i,j,l: integer;
begin
  Result:=SysUtils.StringReplace(LowerCase(url),'http://','',[]);
  Result:=SysUtils.StringReplace(Result,'www.','',[]);
  i:=Pos('.',Result);
  if i=0 then Exit;
  j:=PosEx('/',Result,i);
  if j=0 then j:=PosEx('\',Result,i);
  if j>0 then Result:=Copy(Result,1,j-1);
end;

procedure THTTP1.WriteCookies(url: string);
  var i,j: integer;
      Cookies: string;
begin
  for i := 0 to FCookieList.Count - 1 do
  if Pos(GetCookieDomain(FCookieList[i]),GetURLDomain(url))>0 then // Changed
  begin
    j:=Pos(';',FCookieList[i]);
    Cookies:=Cookies+Copy(FCookieList[i],1,j)+' ';
  end;
  if Cookies<>'' then
  begin
    Cookies:='Cookie: '+Copy(Cookies,1,Length(Cookies)-2);
    http.Request.CustomHeaders.Clear;
    http.Request.CustomHeaders.Add(Cookies);
  end;
end;

www.foxbase.ru


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



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

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