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