如何使用 Indy 10 和 OpenSSL 通过 HTTPS 下载文件?

2023-11-23

我有以下任务:使用 HTTPS 和身份验证下载文件。 Indy 似乎是可行的方法,但由于某种原因它到目前为止还不起作用。我已做好以下准备:

  • 我用于下载的 TIdHTTP 组件
  • 用于创建 URL 的 TIdURI 组件
  • 应提供安全连接的 TIdSSLIOHandlerSocketOpenSSL 组件。所需的 DLL 位于二进制文件夹中。

该站点还需要身份验证,我在 URL 中包含了用户/密码,如下例所示。简而言之,这是代码:

URI := TIdURI.Create('https://test.example.com/');
URI.Username := ParamUserName;
URI.Password := ParamPassword;

HTTP := TIdHTTP.Create(nil);
if URI.Protocol = 'https' then
begin
  IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  IOHandler.SSLOptions.Method := sslvSSLv3;
  HTTP.IOHandler := IOHandler;
end;

HTTP.Get(URI.GetFullURI([ofAuthInfo]), FileStream);

使用此代码,我很快就会得到“读取超时”EIdReadTimeout 异常。在浏览器中测试 URL 没有问题。关于缺少什么或我做错了什么有什么想法吗?


我最终放弃了Indy和OpenSSL而使用WinInet进行下载。这是对我有用的代码:

function Download(URL, User, Pass, FileName: string): Boolean;
const
  BufferSize = 1024;
var
  hSession, hURL: HInternet;
  Buffer: array[1..BufferSize] of Byte;
  BufferLen: DWORD;
  F: File;
begin
   Result := False;
   hSession := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0) ;

   // Establish the secure connection
   InternetConnect (
     hSession,
     PChar(FullURL),
     INTERNET_DEFAULT_HTTPS_PORT,
     PChar(User),
     PChar(Pass),
     INTERNET_SERVICE_HTTP,
     0,
     0
   );

  try
    hURL := InternetOpenURL(hSession, PChar(URL), nil, 0, 0, 0) ;
    try
      AssignFile(f, FileName);
      Rewrite(f,1);
      try
        repeat
          InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen) ;
          BlockWrite(f, Buffer, BufferLen)
        until BufferLen = 0;
      finally
        CloseFile(f) ;
        Result := True;
      end;
    finally
      InternetCloseHandle(hURL)
    end
  finally
    InternetCloseHandle(hSession)
  end;
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Indy 10 和 OpenSSL 通过 HTTPS 下载文件? 的相关文章

  • Indy 的 TIdHTTPProxyServer:如何过滤请求?

    我正在使用 TIdHTTPProxyServer 来实现一个简单的 HTTP 代理 但我现在想阻止一些与某些 URL 匹配的连接 哪个事件和 或组件最适合实现这一目标 Indy 文档并没有太多解释 Thanks 作为基本过滤器 您可以使用
  • 证书中的“-----BEGIN TRUSTED CERTIFICATE-----”是什么意思?

    我获得了一个 CA 证书 如下所示 据我所知 证书应该以 BEGIN CERTIFICATE 开头 那么 BEGIN TRUSTED CERTIFICATE 部分是什么意思 我检查了 OpenSSL 文档 它说 可信 部分是可信设置 但我想
  • Firemonkey 编辑/组合自动完成/打字时自动建议

    实施方式是什么Autocomplete or Autosuggest适用于 Windows Android 平台以及 MacOS 和 iOS 的 Delphi Firemonkey Example 当用户在 Google 搜索框中输入文本时
  • Async InputQuery 不处理“取消”按钮

    我正在使用一个简单的调用TDialogServiceAsync InputQuery 使用单个输入 它只是忽略了Cancel按钮和窗口的X关闭按钮 But the Ok按钮工作正常 这是我的代码 uses FMX DialogService
  • 使用 OLE 和 Delphi 提高 Word 文档中搜索替换的性能

    经过一些实验 我最终得到了以下代码来在 MSWord 中执行搜索和替换 此代码在页眉和页脚中也能完美运行 包括首页或奇数 偶数页的页眉和 或页脚不同的情况 问题是我需要打电话MSWordSearchAndReplaceInAllDocume
  • 带位图的简单组合框

    如何将位图放入组合框中并将样式设置为简单 例如 Google Chrome 的右侧有星号 Firefox 的右侧有箭头 我尝试了这段代码 procedure TForm2 ComboBox1DrawItem Control TWinCont
  • HTTPS 和 SSL3_GET_SERVER_CERTIFICATE:证书验证失败,CA 正常

    我在用XAMPP http www apachefriends org为发展 最近我将 xampp 的安装从旧版本升级到 1 7 3 现在 当我卷曲启用 HTTPS 的网站时 出现以下异常 致命错误 未捕获异常 RequestCore Ex
  • 如何遍历任意给定集合中的枚举?

    我有很多枚举类型 它们与相应的集合相结合 例如 type TMyEnum meOne meTwo meThree TMyEnums set of TMyEnum 我正在尝试提出一组可以运行的函数any枚举集 而不是为每个枚举编写单独的函数
  • 有人用CrossKylix进行真正的跨平台开发吗?

    新版本克罗斯凯利克斯 http crosskylix untergrund net 两周前更新过 即使 Kylix 已经停产很久了 但它似乎仍然被一些 Delphi 开发人员使用 有人在 Windows 和 Linux 的跨平台开发中成功使
  • 如何在Delphi中下载一个非常简单的HTTPS页面?

    我尝试了在这里看到的代码 但它不适用于 HTTPS 我需要将此页面作为字符串下载 并在其上添加一些换行符 以便将信息按顺序放入 TMemo 中 怎么做 我尝试使用 Indy 但由于 SSL 问题而失败 我尝试了此页面的解决方案 如何将网页下
  • 如何在 Delphi DBLookupComboBox 中选择正确的项目

    我有一个数据库查找组合框连接到数据库查询 那部分工作正常 当我运行程序时数据库查找组合框填充有查询的结果 我想看看数据库查找组合框填充第一项 请选择 当 的时候程序第一次运行或者当一个新项目行动已启动 见下图 另外 如果我正在加载以前保存的
  • delphi中如何实现多重继承?

    我正在对一个旧库进行完全重写 我不确定如何处理这种情况 为了便于理解 大家都欢呼自行车类比 我有以下课程 TBike 自行车本身 TBikeWheel 自行车的一个轮子 TBikeWheelFront and TBikeWheelBack
  • Delphi AES 库 (Rijndael) 使用 KAT Vectors 进行测试

    对于这两个库 Delphi 加密概要 v 5 2 http code google com p delphidec TurboPower 密码箱 v 2 07 http lockbox seanbdurkin id au tiki list
  • Delphi IDE导致CPU过热

    我正在使用 Delphi 7 但我已经尝试过 Delphi 2005 2010 版本 在所有这些新版本中 当 Delphi IDE 在屏幕上可见时 我的 CPU 利用率为 50 一个核心为 100 另一个核心为 宽松 当 IDE 最小化时
  • 如何更改 TPageControl 上标签的方向?

    我是 Delphi 的新手 再次强调 我在 1994 年就使用过 Delphi 我现在有 Delphi 2009 Pro 来自Java 我发现对象继承非常晦涩 我的用户想要选项卡位于左侧的选项卡式页面 但是 TPageControl 不允许
  • 如何将纹理传递给 DirectX 9 像素着色器?

    我有像素着色器 fxc exe tiles fs T ps 3 0 Fotiles fsc Fctiles fsl struct PSInput float4 Pos TEXCOORD0 float3 Normal TEXCOORD1 fl
  • 所见即所得与 Unicode

    我在 Delphi 中编写了一个 Windows 程序 该程序使用 GetCharWidth 和 Em Square 将文本非常精确地放置并换行到屏幕和打印机 这对于 ANSI 文本效果很好 您只需要检索和计算 255 个字符的宽度 但当您
  • openssl_pkey_get_details($res) 不返回公共指数

    我在用着这个例子 https stackoverflow com a 12575951 2016196使用 php 生成的密钥进行 javascript 加密openssl图书馆 但是 details openssl pkey get de
  • TStream.Position 与 TStream.Seek 比较

    要移动 TStream 类中的 当前字节 指针 我们可以使用属性 Position 例如 MyStream Position 0 或使用 Seek 方法 例如 MyStream Seek 0 soFromBeginning 问题是 哪一个更
  • delphi THashSHA2 在大文件上返回错误的 SHA256

    Data Cloud CloudAPI pas has class function TCloudSHA256Authentication GetStreamToHashSHA256Hex const Content TStream str

随机推荐

  • PHP 用 POST 数据打开另一个网页

    我是 PHP 新手 我正在尝试做一些可能是不好的做法并且很可能是不可能的事情 我基本上只是将一些东西组合在一起来测试我的知识并看看 PHP 可以做什么 我有一个带有收集数据的表单的网页 它被提交给一个 PHP 脚本 该脚本执行一系列处理 但
  • Android 文本视图中的多个可点击字符串

    我正在创建一个小型 Android 应用程序 我想在文本视图中显示文本 并有多个部分可供单击 每个应该显示一些不同的消息 最后 我设法找出如何在一个文本视图中显示多个跨度 但不幸的是 onClick 方法不起作用 根本没有任何反应 甚至连一
  • 计算数据帧的每一行与另一个数据帧中的所有其他行之间的欧氏距离

    我需要生成一个数据帧 该数据帧的每一行与另一个数据帧的所有其他行之间具有最小欧几里德距离 我的两个数据帧都很大 大约 40 000 行 这是我到目前为止可以解决的问题 x lt matrix c 3 6 3 4 8 nrow 5 ncol
  • 如何复制数组?

    我在Delphi中遇到了这样一个基本问题 我无法解决它 My Code 注意 DataR在下面的方法中是本地的 但通常它是一个类变量 只是为了概念它是本地的 class procedure TCelebrity BeginRead var
  • 参数包扩展顺序

    我有两个函数来读取二进制文件 第一个函数读取sizeof T 文件中的字节 template
  • C 中 EOF 问题

    我正在编写一个程序 该程序应该读取两个可以包含换行符和各种其他字符的字符串 因此 我使用 EOF Ctrl Z 或 Ctrl D 来结束字符串 这对于第一个变量来说效果很好 但是对于第二个变量来说 这似乎是有问题的 因为显然有东西卡在输入缓
  • Git 删除重复提交

    经过一番使用遥控器后 我的所有提交最终都增加了一倍 例如 代替 C3107 C3 C2 C1 I got C3107 C3107 C3 C3 C2 C2 C1 C1 其中双重提交具有相同的名称但不同的哈希值 问题是我注意到它太晚了 而且我没
  • Android Studio(海豚 | 2021.3.1)和(电鳗 | 2022.1.1)不显示布局预览

    我正在使用 Android Studio Dolphin 2021 3 1 电鳗 2022年1月1日 Android studio 更新后花栗鼠 2021 2 1 至 Android Studio Dolphin 2021 3 1 我的所有
  • MPI_Reduce 是阻塞(还是天然屏障)?

    我有下面的 C 代码片段 它基本上使用经典的蒙特卡罗技术计算 pi srand48 unsigned time 0 my rank for int i 0 i lt part points i double x drand48 double
  • 用于单元测试的备用 SLF4J 绑定或配置?

    我希望能够将用于单元测试的 SLF4J 绑定切换到简单版本 但似乎没有简单的方法来配置它 基本上 我构建的项目记录到一个文件 我希望在单元测试时它是控制台 我之前使用过 antrun maven 插件对 persistence xml 文件
  • 用于检查锁定文件的应用程序的 PowerShell 脚本?

    在 PowerShell 中使用 如何检查应用程序是否锁定文件 我喜欢检查哪个进程 应用程序正在使用该文件 以便我可以关闭它 您可以使用SysInternals工具handle exe 尝试这样的事情 PS gt handleOut han
  • 为什么shortValue()方法是具体的,而intValue()方法是抽象到java.lang.Number中的?

    我已经阅读了源代码java lang Number我想知道为什么 intValue longValue floatValue doubleValue 是抽象的但是 shortValue byteValue 混凝土 源代码 public ab
  • OpenCart 中基于路由向页面添加 CSS 样式表

    我正在为客户端商店使用 opencart 版本 1 5 1 3 1 并且想知道对其进行编码的最佳方法是什么 以便我可以为某些路线添加某些样式表 例如 在我的类别页面上 我希望有一个与默认样式不同的样式表 或者一个将使用我的自定义表覆盖默认样
  • 当可观察数组为空时如何显示无数据?

    我是 Knockout js 的新手 我正在尝试将数据从可观察数组显示到table 我遇到的问题是它生成两个tbody标签 但是如果我将空检查逻辑移入foreach 循环 No Data确实出现了 有没有更好的方法来使用表来做到这一点 我不
  • 如何将 Servlet 重定向到给定的 URL

    目前 我正在使用 request getRequestDispatcher thePage html forward request response 在我的 servlet 中向用户显示新页面 但 servlet 的 URL 保留在浏览器
  • 如何将以前版本的 Python 安装到 virtualenv 中? [复制]

    这个问题在这里已经有答案了 我在全局安装了Python3 然后创建了一个virtualenv 现在我想把里面的python版本改成Python2 7 尝试安装Python2 7时我只能选择安装到我的硬盘上 如何指定 virtualenv 中
  • Nhibernate 标准:“选择 max(id)...”

    我可以使用 Criteria 执行 t sql 命令来选择表中列的最大值吗 从客户中选择 cus id max id 1 Ta Ollie Use 投影 session CreateCriteria typeof Customer SetP
  • 实例作为静态类属性

    是否可以在 PHP 中将类的实例声明为属性 基本上我想要实现的是 abstract class ClassA static property new ClassB 好吧 我知道我不能这样做 但是除了总是做这样的事情之外还有什么解决方法吗 i
  • Reactjs 可以以编程方式处理 :before 吗?

    我必须以某种方式以编程方式设置宽度 before for a div div div 我如何定义someStyle这样的宽度 before of something div可以相应改变吗 是的 您可以通过编程方式更改 React 中的 be
  • 如何使用 Indy 10 和 OpenSSL 通过 HTTPS 下载文件?

    我有以下任务 使用 HTTPS 和身份验证下载文件 Indy 似乎是可行的方法 但由于某种原因它到目前为止还不起作用 我已做好以下准备 我用于下载的 TIdHTTP 组件 用于创建 URL 的 TIdURI 组件 应提供安全连接的 TIdS