Delphi: скачать файл с переадресацией URL - PullRequest
1 голос
/ 15 января 2012

У меня есть бесплатное доменное имя с переадресацией URL ( Cloaking ) на другой сайт.

Если я наберу http://my.com/1.zip на веб-адресе браузера, он перейдет к http://his.com/1.zip и загрузит файл.

Как я могу сделать то же самое с Indy TIdHTTP (Delphi XE2). Браузеры и я сначала получаем ошибку 404, но потом они каким-то образом скачивают файл, кроме меня.

Мне нужно использовать первую ссылку, но на самом деле скачать с другого сайта. Например. На первом сайте есть файл xxx.zip. Я хочу перейти на http://my.com/xxx.zip, но на самом деле скачать с http://his.com/xxx.zip (где хранится файл).

Спасибо!

Отредактировано:

Я установил для HandleRedirects значение true, назначил CookieManager (я уже видел этот вопрос Indy - IdHttp, как обрабатывать перенаправления страниц? ).

Попробуйте загрузить this http://liga -updates.ua.tc / GDI + .zip в свой Delphi

Ответы [ 3 ]

2 голосов
/ 19 января 2012

Рассматриваемый веб-сайт возвращает ответ HTTP 404 с HTML-страницей, содержащей <iframe>, которая загружает реальный URL.Ответ 404 приведет к тому, что TIdHTTP вызовет исключение EIdHTTPProtocolException по умолчанию.Доступ к содержанию ответа (HTML) можно получить через свойство EIdHTTPProtocolException.ErrorMessage.

Например:

procedure TForm1.Button1Click(Sender: TObject); 
var 
  Http: TIdHttp; 
  URL, Filename: string; 
  FS: TFileStream; 
  ...
begin 
  Filename := 'C:\path\GDI+.zip';
  URL := 'http://liga-updates.ua.tc/GDI+.zip'; 

  FS := TFileStream.Create(Filename, fmCreate); 
  try
    try
      Http := TIdHttp.Create(nil); 
      try 
        try
          Http.Get(URL, FS); 
        except 
          on E: EIdHTTPProtocolException do begin
            if E.ErrorCode <> 404 then raise;
            URL := ParseIFrameURLFromHTML(E.ErrorMessage);
            if URL = '' then raise;
            Http.Get(URL, FS); 
          end;
        end; 
      finally 
        Http.Free; 
      end; 
    finally 
      FS.Free; 
    end; 
  except
    DeleteFile(Filename);
    ShowMessage('Unable to download file.');
    Exit;
  end;
  ShowMessage('Downloaded OK'); 
end;
1 голос
/ 17 января 2012

Похоже, что http://liga -updates.ua.tc основан на 404 ошибках перенаправления на пользовательские страницы (используются внутренне веб-сервером).

Попробуйте сделать httphead на любом ресурсе: он вернет 404 с ответом HTML.этот ответ содержит элемент iframe с src для реального загружаемого файла.основываясь на этом, я написал небольшой код.

Я использовал THttpCli, поскольку кажется, что TIdHttp не вернет «действительный» ответ со статусом 404 (в любом случае, не в моей версии D5).

uses HttpProt;

procedure TForm1.Button1Click(Sender: TObject);
const
  IFRAME_SRC = '<iframe src="';
var
  HttpCli: THttpCli;
  S, URL, FileName: string;
  I: Integer;
  FS: TFileStream;
begin
  URL := 'http://liga-updates.ua.tc/GDI+.zip';

  HttpCli := THttpCli.Create(nil);
  try
    HttpCli.URL := URL;
    HttpCli.MultiThreaded := True;
    try
      HttpCli.Get;
    except
      // this will always be 404 for this domain (test from outside the IDE)
    end;
    S := HttpCli.LastResponse; // THttpCli returns valid response when status 404
    // extract IFRAME src
    I := Pos(IFRAME_SRC, S);
    if I <> 0 then
    begin
      Delete(S, 1, I + Length(IFRAME_SRC) - 1);
      URL := Copy(S, 1, Pos('"', S) - 1);
      HttpCli.URL := URL;
      FileName := ExtractFileName(StringReplace(URL, '/', '\', [rfReplaceAll]));
      FS := TFileStream.Create(FileName, fmCreate);
      try
        HttpCli.RcvdStream := FS;
        try
          HttpCli.Get;
          ShowMessage('Downaloded OK');
        except
          ShowMessage('Unable to download file.');
        end;
      finally
        FS.Free;
      end;
    end
    else
      ShowMessage('Unable to extract download information.');
  finally
    HttpCli.Free;
  end;
end;
0 голосов
/ 15 января 2012

Попробуйте свойство HandleRedirects компонента TIdHTTP.

...