Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > IdHttp.Get возвращает поток пустой


Автор: Akella 11.12.2012, 10:35
Почему-то 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 (та версия, что входит в поставку дельфи) 
Устанавливать и изучать что-то вроде синапс не очень хочется

Автор: Coobick 11.12.2012, 16:45
Добавь КуК... 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;

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

Добавлено через 3 минуты и 11 секунд
Пользователь в браузере ведь никаких куков ручками не указывает.

Автор: Akella 12.12.2012, 11:08
Вот рабочий пример, скомпилированный в DXE3
http://ovrload.ru/t/122_dxe3_test_indy.zip

Автор: Coobick 12.12.2012, 11:45
Цитата(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;) его сама не подставляет при переадресации. 

Автор: Matematik 12.12.2012, 12:16
Это 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


Автор: Coobick 12.12.2012, 12:48
Цитата(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;


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

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

http://radikal.ru/F/s43.radikal.ru/i099/1212/b5/2e0ebb32231f.jpg.html

http://radikal.ru/F/s020.radikal.ru/i707/1212/41/1ad80605d453.jpg.html


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

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;


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

http://radikal.ru/F/s47.radikal.ru/i116/1212/99/2a2bfd318198.jpg.html

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


я так и сделал


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

Добавлено через 21 секунду
и в xe3 без проблем

Автор: Чучмек 20.12.2012, 14:42
RedirectMaximum у TIdHTTP  сколько? 

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

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

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

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


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

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


Автор: Чучмек 22.12.2012, 20:57
Цитата(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;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)