Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с cookie в компоненте TWebBrowser (считывание, учтановка) [D6, WinXP]


Delphi5.01 ©   (2006-05-14 06:00:00) 

Здравствуйте,

Вот возник вопрос касающийся cookie и компонента TWebBrowser.
Мой вопрос состоит из двух частей

1) Первая часть касается получению кукисов
2) Вторая часть - передача/установка кукисов до открытия странички


Первую часть вопроса решил, в интернете было достаточно документации как можно считать кукис воспользовавшись OLE интерфейс, а именно

myCookie := (WebBrowser1.Document as IhtmlDocument2).cookie;

Вот вторая часть намного сложней. Долго искав пришел вот к такому выводу, раз кука передается через header то ее надо добавить туда до запроса в ручную, а именно:

Headers := StringToVarArray('COOKIE: test_cookie=123456789'#13#10);

Функция StringToVarArray нужна для превращения String в Variant тип. Код функции очень простой:

function StringToVarArray(const S: string): Variant;
 var
   i: integer;
begin
 Result := VarArrayCreate([0, Length(S) - 1], varByte);
 for i := 1 to length(S) do
   Result[i-1] := ord(S[i]);
end;


Вы итоге все должно быть как в шоколаде но, нифига не работает :-), ни только с куками но и с PostData.

procedure TForm1.Button2Click(Sender: TObject);
 var
   Headers: OleVariant;
   PostData: OleVariant;
begin
 Headers := StringToVarArray('COOKIE: test_cookie=fuck_you_all'#13#10);
 PostData := StringToVarArray('good=fucking&bad=working'#13#10);
 Edit2.Text := Headers;
 WebBrowser1.Navigate(' http://my-local-domain.com/readcockie.php',
   EmptyParam, EmptyParam, PostData, Headers);
end;


Думаю данная статейка будет интересна, может вы заметите что я делаю не так?

http://www.delphifaq.com/faq/delphi/network/f249.shtml

п.с. Тестирования провожу на локальном компе, установлен апач. Скрипт readcockie.php отображает содержимое COOKIE и POST массивов.

п.п.с. Установку кукисов через компонент IdHTTP можно сделать банально через header и думаю там будет работать, правда я пока лично не тестил, но есть посты в инете что данная конструкция работает Мне же желательно решение с TWebBrowser


Delphi5.01   (2006-05-15 17:12:00) [1]

Ребята помогите уж с последней частью проблемы. После длительных мучений и чтения MSDN пришел к выводу что все таки можно управлять какой через:

(WebBrowser1.Document as IhtmlDocument2).cookie

но при одном условии, кука должна быть передана до того как ее начнем редактировать. А именно, если я отрываю некий урл который устанавливает куку то после этого и только после этого ее можно редактировать (подменять или изменить).

Но если кука храниться и мне ее отредактировать до запроса то возникают проблемы. Попытка отредактировать на событии Beforenavigate закончилось неудачей так как на этом этапе WebBrowser1.Document вообще не существует

Что бы WebBrowser1.Document существовал я попытался сначала открыть документ about:blank и только после этого отредактировать куку но ничего не получилось :-(

Может кто что посоветует


Delphi5.01   (2006-05-15 04:17:00) [2]

ИМХО: Как я понял у компонента TWebBrowser-а как и у самого Delphi куча глюков! Блин как можно было сделать компонент не дав пользователю возможность передавать кукисы? Единственное объяснение то что Борланд как и Бил вообще обнаглел!

Теперь по сути, раз у TWebBrowser-а нет возможности редактировать тег cookie то получается продеться пользоваться сторонним компонентом, например IdHTTP который с этим хорошо справляется. А результат подгружать в TWebBroser. Теперь вопрос, как можно получить содержимое GET, POST, Header запроса. Все надо обрабатывать на BeforeNavigate, но как считывать данные?

Заранее благодарен за любой совет


Тест_рез   (2006-05-14 18:40:00) [3]

Вот с проблемой уже вообще разобрался, типа уже локализирована Ошибка именно с Cookie остальные свойства меняются без проблем. Такие как User-Agent и Referer тестировал лично.
Вопросс, как менять Cookie?


Доп_инф   (2006-05-14 18:18:00) [4]

Данный пример у меня вообше отказываеться работать и генерирует ошибку:
http://www.swissdelphicenter.ch/torry/printcode.php?id=2242


Delphi5.01   (2006-05-14 18:07:00) [5]

Только что проверил снифером содержимое пакетов, и что вы думаете, ни команда:
procedure TForm1.Button2Click ...
...
begin
...
 Headers := StringToVarArray('COOKIE: test_cookie=work'#13#10);
 WebBrowser1.Navigate(' http://my-domeian.com/readcockie.php',
   EmptyParam, EmptyParam, EmptyParam, Headers);
...
end;

а также команда:
procedure TForm1.WebBrowser1BeforeNavigate2 ...
...
begin
...
 Headers := StringToVarArray('COOKIE: test_cookie=work'#13#10);
...
end;

ничего в хидер не добавляют! Получается что баг у самого компонента? Пытался передавать как простую строку (string) так и конвертированную в OleVariant.
Единственная надежда, управлять содержимым header-а через OLE интерфейс, но как это делать у меня даже идей нет. Может кто подскажет? Нужно через Document или Interface?


Наверх

Титульная страница Поиск, карта сайта Написать письмо