1

我有一个带有 URL 转发(伪装)到另一个站点的免费域名。

如果我在浏览器的网址中键入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 如何处理页面重定向?)。

尝试在您的 Delphi中下载此http://liga-updates.ua.tc/GDI+.zip

4

3 回答 3

3

有问题的网站正在返回一个 HTTP404响应,其中包含一个<iframe>加载真实 URL 的 HTML 页面。默认情况下,404回复将导致TIdHTTP引发EIdHTTPProtocolException异常。可以通过该EIdHTTPProtocolException.ErrorMessage属性访问回复的内容(HTML)。

例如:

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;
于 2012-01-19T00:10:43.310 回答
1

似乎http://liga-updates.ua.tc是基于 404 错误重定向到自定义页面(由网络服务器内部使用)。

尝试对head那里的任何资源执行 http:它将返回 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;
于 2012-01-17T00:46:03.493 回答
0

试试组件的HandleRedirects属性TIdHTTP

于 2012-01-15T08:14:05.737 回答