Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> IdHttp.Get возвращает поток пустой 
:(
    Опции темы
Akella
  Дата 11.12.2012, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



Почему-то IdHTTP1.Get возвращает пустоту.
Куки и HandleRedirects включены.
Посмотрел RequestHeaders у FireFox`a и указали эти же параметры у IdHTTP1.

К TIdHTTP прикрепил TIdLogFile.
В лог сохраняется информация. Файл занимает ~134 Kb.
Вторая строка лога:
Цитата
Recv 10.12.2012 23:04:49: HTTP/1.1 302 Moved Temporarily<EOL>Date: Mon, 10 Dec 2012 21:04:47 GMT<EOL>Server: Apache/2.2.17 (Unix) DAV/2 mod_fastcgi/2.4.6 mod_ssl/2.2.17 OpenSSL/0.9.8e<EOL>X-Powered-By: PHP/5.2.17<EOL>Set-Cookie: PHPSESSID=696b102ba4f354ce18d3388a106afcbd; path=/<EOL>Expires: Thu, 19 Nov 1981 08:52:00 GMT<EOL>Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0<EOL>Pragma: no-cache<EOL>Set-Cookie: cityid=3; expires=Tue, 10-Dec-2013 21:04:47 GMT; path=/<EOL>Location: /dnepropetrovsk/list.php?r=101<EOL>Transfer-Encoding: chunked<EOL>Content-Type: text/html<EOL><EOL>

дальше идёт информация вроде нужная, вижу в логе обрывки текста, названия меню и т.д.

Вот что меня волнует: HTTP/1.1 302 Moved Temporarily


Код

procedure TForm11.Button2Click(Sender: TObject);
var
 lData: TMemoryStream;
begin
  lData := TMemoryStream.Create;
  IdHTTP1.Get(Edit1.Text, lData);
  lData.SaveToFile('d:\22.txt');
  lData.Free;
end;



Файл d:\22.txt пустой, разером 0 байт!

Хочу скачать пару страничек отсюда: aviso.ua/dnepropetrovsk/list.php?r=101

DXE2, Indy10.5.8 (та версия, что входит в поставку дельфи) 
Устанавливать и изучать что-то вроде синапс не очень хочется
PM MAIL   Вверх
Coobick
Дата 11.12.2012, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 16.8.2010
Где: Владимир

Репутация: 1
Всего: 1



Добавь КуК... HTTP.Request.CustomHeaders.text := 'Cookie: PHPSESSID=7777; cityid=1';  smile 

Код

begin
 HTTP:= TIdHTTP.Create(Application);
 HTTP.ConnectTimeout:= 31000;
 HTTP.ReadTimeout:= 31000;
 HTTP.Request.CustomHeaders.text := 'Cookie: PHPSESSID=7777; cityid=1';
// -----------------------------------------------------------------------------
 lData := TMemoryStream.Create;
 try
 HTTP.Get('http://www.aviso.ua/kiev/list.php?r=402', lData);
 lData.SaveToFile('22.txt');
 except
 Form1.Button1.Enabled:=True;
 ShowMessage('Error');
  FreeAndNil(HTTP); FreeAndNil(lData);
 end;
 Form1.Button1.Enabled:=True;
 if Assigned(lData) then FreeAndNil(lData);
 if Assigned(HTTP) then FreeAndNil(HTTP);
end;

PM MAIL   Вверх
Akella
Дата 12.12.2012, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



В Delphi XE3 работает без лишних телодвижений.
В Delphi 2007 c Indy 10.5.8 тоже

Добавлено через 3 минуты и 11 секунд
Пользователь в браузере ведь никаких куков ручками не указывает.
PM MAIL   Вверх
Akella
Дата 12.12.2012, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



Вот рабочий пример, скомпилированный в DXE3
http://ovrload.ru/t/122_dxe3_test_indy.zip
PM MAIL   Вверх
Coobick
Дата 12.12.2012, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 16.8.2010
Где: Владимир

Репутация: 1
Всего: 1



Цитата(Akella @ 12.12.2012,  11:43)
В Delphi XE3 работает без лишних телодвижений.
В Delphi 2007 c Indy 10.5.8 тоже

Добавлено @ 10:46
Пользователь в браузере ведь никаких куков ручками не указывает.

ХЕ2 Indy 10.5.8.
Не работает твой пример...   smile 

Кук задаётся при посещении страницы.. в ответе сервера. 
у данной страницы ...........o.ua/dnepropetrovsk/list.php?r=101
Он уже иной..
cityid=3; expires=Thu, 12-Dec-2013 08:36:07 GMT; path=/
А именно, что нам нужно это cityid=3.
Заметь! для той что я казал ранее был нужен cityid=1, с ним открывая эту будет 302.

При первом посещении даётся этот Кук и передресует туда же, но открываем мы её уже с КуКом который получили. 
Пока будет неверно, будет 302... 15-20раз.

Вопрос в другом, от чего Индя (АllowCookies:=True;) его сама не подставляет при переадресации. 

Это сообщение отредактировал(а) Coobick - 12.12.2012, 11:48
PM MAIL   Вверх
Matematik
Дата 12.12.2012, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 24
Всего: 50



Это Firefox  https://gist.github.com/4266006
А это Indy https://gist.github.com/4266093
Сервер постоянно перенаправляет (поле Location:) на адреса начинающиеся на //, Firefox обрабатывает это как положено, а Indy - нет. Оно так и крутится до бесконечности, пока не достигнет RedirectMaximum, и возвращает пустоту.

Можно подставить костыль в OnRedirect
Код

procedure TForm1.IdHTTP1Redirect(Sender: TObject; var dest: string;
  var NumRedirect: Integer; var Handled: Boolean; var VMethod: string);
begin
  if Pos('//', dest)=1 then
    dest := 'http:' + dest
end;

тогда пойдет как положено https://gist.github.com/4266299


PM MAIL WWW ICQ   Вверх
Coobick
Дата 12.12.2012, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 16.8.2010
Где: Владимир

Репутация: 1
Всего: 1



Цитата(Matematik @ 12.12.2012,  13:16)
тогда пойдет как положено https://gist.github.com/4266299

Так?
Код

procedure TForm13.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Text := IdHTTP1.Get('http://www.aviso.ua/dnepropetrovsk/list.php?r=101');
end;

procedure TForm13.IdHTTP1Redirect(Sender: TObject; var dest: string;
  var NumRedirect: Integer; var Handled: Boolean; var VMethod: string);
begin
  if Pos('//', dest)=1 then
    dest := 'http:' + dest
end;


Не пойдёт... во всяком случае у меня подобное не помагает.

Кук не передаётся! Точнее не ТоТ, что надо...Нужно оба или тот что надо.

user posted image

user posted image


Добавляем просто нужный КуК и более НИЧЕГО..
Код

procedure TForm13.Button1Click(Sender: TObject);
begin
  IdHTTP1.Request.CustomHeaders.text := 'Cookie: cityid=3';
  Memo1.Lines.Text := IdHTTP1.Get('http://www.aviso.ua/dnepropetrovsk/list.php?r=101');
end;


И имеем то что требуется..

user posted image

Это сообщение отредактировал(а) Coobick - 12.12.2012, 13:01
PM MAIL   Вверх
Akella
Дата 20.12.2012, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



Цитата(Coobick @  12.12.2012,  12:48 Найти цитируемый пост)
Добавляем просто нужный КуК и более НИЧЕГО..


я так и сделал


но в лису-то я ничего не добавлял

Добавлено через 21 секунду
и в xe3 без проблем
PM MAIL   Вверх
Чучмек
Дата 20.12.2012, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 4
Всего: 41



RedirectMaximum у TIdHTTP  сколько? 

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


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Coobick
Дата 20.12.2012, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 16.8.2010
Где: Владимир

Репутация: 1
Всего: 1



Цитата(Akella @ 20.12.2012,  14:39)
и в xe3 без проблем

Ну видимо косяк в Инди.. хотя вроде версии одинаковые)..
Но суть то проблемы понятна.. от чего было "пусто"?

А вот как "проще" это решить это другой вопрос..
Проще наверно синапс заюзать..
Либо замарачиваться к кук-менеджером..


PM MAIL   Вверх
kami
Дата 21.12.2012, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Злостный оффтопик, но не могу удержаться smile
(с) Винни-Пух:
Цитата
Вот поток пустой, он предмет простой,
От ни-ку-да не денется.
И потому поток пустой, и потому поток пустой
Гораздо выше ценится!

Конец моим страданьям и разочарованьям
И сразу наступает хорошая погода
Когда тебе или ему, когда... ну все равно кому. (Только не мне!)
Придет посредством GET-a поток без данных!



Это сообщение отредактировал(а) kami - 21.12.2012, 10:48
PM MAIL WWW   Вверх
Чучмек
Дата 22.12.2012, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 4
Всего: 41



Цитата(Coobick @  20.12.2012,  23:04 Найти цитируемый пост)
видимо косяк в Инди

Однозначно.
Кукеменеджер не распознает куки, у которых указанно время жизни.
Можно такие куки добавлять самостоятельно 
вот решение для XE2
Код

procedure TForm1.IdHTTP1HeadersAvailable(Sender: TObject;
  AHeaders: TIdHeaderList; var VContinue: Boolean);
var
 i:integer;
 s:string;
 p:pchar;
begin
if not Assigned((Sender as TIdHTTP).CookieManager) then exit;
for i := 0 to AHeaders.Count-1 do
 if 0=StrLIComp(pchar(AHeaders.Strings[i]),'Set-Cookie:',length('Set-Cookie:')) then
  begin
  s:=copy(AHeaders.Strings[i],length('Set-Cookie:')+1);
  p:=pchar(s);
  repeat
   p:=strpos(p,';');
   if p=nil then break;
   repeat p:=p+1 until p^<>' ';
   if 0=StrLIComp(p,'expires',length('expires')) then
    begin
    p^:=#0;
   (Sender as TIdHTTP).CookieManager.AddServerCookie(pchar(s),(sender as tIdHTTP).URL);
    end;
  until p^=#0;
  end;
end;



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0817 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.