0

在一个空白的 Delphi 11 项目中,我放置了一个按钮和一个 TIdHTTP 组件。

该按钮尝试获取 .txt 文件。

procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TMemoryStream;

begin
  Stream := TMemoryStream.Create;

    try

      IdHTTPGetProgramUpdateFile.Get('https://www.bookup.com/cowupdates/build129.txt', 
                                     Stream);

    except

      on E: Exception do
        begin
          MessageDlg(E.Message,
                     TMsgDlgType.mtInformation,
                     [TMsgDlgBtn.mbOK],
                     E.HelpContext);
        end;
    end;

  Stream.SaveToFile('downloaded.txt');

  Stream.Free;
end;

如果 Windows 项目使用 https 请求 URL,则错误为“无法加载 SSL 库”。

如果 Windows 或 Macintosh 上的项目使用 http 请求 URL,则错误是“301 Moved Permanently”。(该文件在网站上。)

如果项目在带有 https 的 Macintosh 上运行,那么 PAServer 会报告项目“正在以不​​安全的方式加载 libcrypto”。

IdSSLOpenSSL.pas在 Windows 上运行时,该项目会在源代码注释中引发异常:

这里的异常可能意味着您使用了错误版本的 openssl 库。请参阅此文件顶部的注释。

文件顶部的评论对我没有用。

我正在尝试从网站下载文本文件的内容,但我对互联网协议知之甚少。我错过了什么?

4

1 回答 1

3

如果 Windows 项目使用 https 请求 URL,则错误为“无法加载 SSL 库”。

您依赖于TIdHTTP使用 Indy 的默认TIdSSLIOHandlerSocketOpenSSL组件,该组件依赖于 OpenSSL 1.0.2 库文件(即libeay32.dllssleay32.dll等),因此请确保将这些文件部署到您的应用程序中,最好是在应用程序的安装文件夹中。或者,如果需要,Indy 确实有一个IdOpenSSLSetLibPath()函数,您可以在应用程序启动时调用该函数来指定库所在的备用文件夹路径。

如果 Windows 或 Macintosh 上的项目使用 http 请求 URL,则错误是“301 Moved Permanently”。(该文件在网站上。)

301是重定向响应。服务器告诉您,您请求的 URL 是旧的,并且该资源在不同的 URL 上可用(在这种情况下,它可能会将您重定向到 HTTPS url),这将在TIdHTTP.Response.Location属性中提供给您,并在事件TIdHTTP.OnRedirect

如果您已TIdHTTP.HandleRedirects设置为truefalse默认情况下),TIdHTTP则将自动为您重新请求新 URL。否则,它将被301视为错误情况,您必须自己手动请求新 URL。

如果项目在带有 https 的 Macintosh 上运行,那么 PAServer 会报告项目“正在以不​​安全的方式加载 libcrypto”。

默认情况下,在基于 'Nix 的系统上,Indy 尝试使用未版本化的符号链接加载 OpenSSL 库文件,如果失败,则会转而加载特定的版本化库文件。使用符号链接并不安全,因为它们可能会映射到您不期望的库版本。例如,在现代系统上,OpenSSL 未版本化的符号链接可能会映射到TIdSSLIOHandlerSocketOpenSSL不支持的 OpenSSL 1.1.x 或更高版本的库文件(改用此 SSLIOHandler)。Indy 具有您可以在应用程序启动时调用IdOpenSSLSetCanLoadSymLinks()IdOpenSSLSetLoadSymLinksFirst()功能,以防止 Indy 尝试加载符号链接。然后,您可以使用您的应用程序部署特定版本的库文件,或将 Indy 指向它们所在的文件夹。

IdSSLOpenSSL.pas在 Windows 上运行时,该项目会在源代码注释中引发异常:

这里的异常可能意味着您使用了错误版本的 openssl 库。请参阅此文件顶部的注释。

文件顶部的评论对我没有用。

您可以在错误发生后使用 Indy 的WhichFailedToLoad()函数来查看 Indy 是否因为库文件失败或加载失败而无法加载 OpenSSL,或者它们缺少所需的函数导出。

于 2021-12-14T21:36:23.003 回答