在 Linux / Lazarus 上使用 Indy OpenSSL

Using Indy OpenSSL on Linux / Lazarus

我想通过 Lazarus 组件 TIdHTTP(Indy 的一部分)检索 Google 搜索的结果。

我已经看过了。我可以使用 CUrl 检索一些结果。

要对 TIdHTTP 做同样的事情,我有这个:

queries:= TStringList.Create;
engine := 'http://www.google.com/search';
queries[0] := '?q=inurl:"foo"';
for i := 0 to queries.Count-1 do
begin
  Memo1.Lines.Add('Asking for : ' + engine + queries[i]);
  try
     IdHTTP1.Get(engine+queries[i], response);
     response.Position := 0;
     Memo2.Lines.LoadFromStream(response);
  finally
    response.Free;
  end;
end;              

IdHTTP 组件的 UserAgent 属性 设置为 Firefox/12.0 (属性 browser > request > UserAgent > Firefox/12.0 with大写 F)。但是,这给了我这个错误:

"Project project1 raised exception class EIdIOHandlerPropInvalid with the message 'IOHandler value is not valid'"

In file 'xyz ... IdHTTP.pas at line 939
raise EIdIOHandlerPropInvalid.Create(RSIOHandlerPropInvalid)

已从德语翻译成英语。

谷歌搜索错误导致 this question on SO。我意识到它与重定向到 https 服务器的 http 请求有关。但是,另一个 SO 问题的答案是针对 windows 平台的。

问题:

任何人都可以帮我告诉我如何在 Linux 平台上实现同样的功能,其中提到的 DLL(libeay32.dll、ssleay32.dll)不存在吗?

我已经在不关心 DLL 的情况下尝试了该解决方案 - 它导致了一个新错误:

"Project project1 has raised exception class EIdOSSLCouldNotLoadSSLLibrary with the message 'Couldn't load SSL library'"

:

core/openssl 1.0.2.k-1 已安装。 Linux 是 Manjaro(64 位)。

EIdIOHandlerPropInvalid 表示 TIdHTTP 被指示发送一个 HTTPS 请求,但是 TIdHTTP.IOHandler 属性 没有被分配一个SSLIOHandler 组件(例如 TIdSSLIOHandlerSocketOpenSSL)来处理加密。

由于您正在向 HTTP URL 发送请求,这意味着服务器必须将 HTTP 重定向发送回 HTTPS URL,并且您将 TIdHTTP.HandleRedirects 属性 设置为 true。

您必须分配一个 SSLIOHandler 组件,以便 TIdHTTP 发送 HTTPS 请求。如果您将请求直接发送到 HTTPS URL,TIdHTTP 可以为您处理该分配(有关详细信息,请参阅 this blog article),但由于您发送到 HTTP URL首先,您必须事先手动分配 IOHandler。

您阅读的有关 Windows 的解决方案也适用于其他平台,包括 Linux。如果合适的 OpenSSL 二进制文件不存在(Linux 使用 .so 文件,而不是 .dll 文件),您只需分发适当的 OpenSSL 二进制文件,并可选择调用 Indy 的 IdOpenSSLSetLibPath() 函数让 Indy 知道二进制文件所在的运行时。

您不限于特定的 OpenSSL。这恰好是 Indy 的默认选择 SSL/TLS 库。但是你可以使用你想要的任何 SSL/TLS 库,只要你能找到(或编写)一个自定义的 TIdSSLIOHandlerSocketBase-derived class 来包装它。一些第 3 方 SSL/TLS 库确实提供 Indy IOHandler class(例如,Eldos SecureBlackBox)。