如何使用 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 下载文件? 的相关文章

  • Delphi - 相当于C#的三元运算符? [复制]

    这个问题在这里已经有答案了 可能的重复 Delphi 中是否存在或者将来是否存在条件运算符 https stackoverflow com questions 2108609 is there or is there ever going
  • 在 Delphi XE 中将类作为过程的参数传递

    我需要做的是这样的 procedure A type of form var form TForm begin form type of form Create application form showmodal freeandnil f
  • 如何追踪手柄泄漏?

    在我的一个应用程序中 我观察到句柄数量不断增加 在不使用应用程序的情况下 该数字大约每秒增加一次 因此后台处理代码的某些部分一定存在句柄泄漏 我如何追踪此类泄漏 有什么工具可以帮助解决这个问题吗 跟踪句柄泄漏时要寻找哪些模式 导致手柄泄漏的
  • 使用 rbenv 在 MacOS 上安装 Ruby 2.6.0 失败

    我在 Mojave 上有一台 Mac 它无法安装开发所需的一些基本内容 rbenv install 2 6 0 Downloading openssl 1 1 1d tar gz gt https dqw8nmjcqpjn7 cloudfr
  • fsockopen() 和 SSL 出错,“无法启用加密”

    我正在尝试连接到 Nominet EPP 测试台 但收到 无法启用加密 的消息 这似乎是一个罕见的错误 没有记录的解决方案或原因 用行 socket fsockopen ssl testbed epp nominet org uk 700
  • 在 Delphi 2007 中将具有透明度的位图保存为 PNG

    我有一个包含透明度信息的 Delphi 位图 32 位 我需要将其转换并保存为 PNG 文件 同时保留透明度 我目前拥有的工具是graphics32 Library GR32 PNG 由Christian Budde 提供 和PNGImag
  • 用 C++ 解密文件,该文件使用 openssl -aes-128-cbc 加密

    我正在尝试用 C 解密文件 该文件使用以下命令加密 openssl enc nosalt aes 128 cbc pass pass test in test txt out test enc txt p 控制台显示key 098F6BCD
  • DELPHI 和 WANT 或 NANT

    We use 巡航控制 net http confluence public thoughtworks org display CCNET Welcome to CruiseControl NET在 Delphi 2006 应用程序中进行持
  • 当 Delphi 处于覆盖模式时,如何更改它的光标形状?

    当使用 Delphi 的任何版本时 我有时会碰巧按下插入键并打开覆盖模式 这通常是一个很大的麻烦 并且您进入覆盖模式的唯一指示是编辑器底部的小文本 当使用其他程序 首先想到的是 Notepad 时 当您处于插入模式时 文本光标是 当您处于覆
  • TColorProperty德尔福柏林10.1.2?

    我正在尝试将组件从 Delphi 7 转换为 Delphi Berlin 平面组件 https sourceforge net projects flatstyle https sourceforge net projects flatst
  • Delphi应用程序窗口z顺序和MainFormOnTaskBar属性

    我正在维护一个最初用 Delphi 7 编写并移植到 Delphi XE 的应用程序 使用 Windows 7 我们遇到了一些问题 例如模态窗口出现在主窗口下方 以及最终无法与程序交互 因为用户需要与模态窗体交互 而这是不可能的 因为它位于
  • 为arm64或arm7s编译OpenSSL FIPS功能库时出现未知的cpu类型

    我可以成功 至少没有警告并生成 a 文件 针对 arm7 x86 64 和 i386 进行编译 当我编译arm64时 我得到Unknown cpu type 100000c no adjustments made 当我编译arm7s时 我得
  • Delphi 2010 - 从 XML 文档解码 Base64 编码图像

    我正在尝试从应用程序中的 XML 文档解码 base64 编码的 EMF 图像并将其呈现在屏幕上 但是 它似乎从未出现 如果我将 XML 文档中的数据复制 粘贴到 Notepad 中并使用Base64 Decode选项并将文件另存为 emf
  • 防止多个实例 - 但还要处理命令行参数?

    我正在从我的应用程序处理与 Windows 相关的扩展文件 因此 当您在 Windows 中双击文件时 它将执行我的程序 然后我从那里处理该文件 如下所示 procedure TMainForm FormCreate Sender TObj
  • 如何比较枚举类型集

    从某个时刻开始 我厌倦了编写设定条件 and or 因为对于更多的条件或更长的变量名 重新编写会变得笨拙且烦人 所以我开始写助手这样我就可以写ASet ContainsOne ceValue1 ceValue2 代替 ceValue1 in
  • logback的“谨慎模式”是如何实现的?

    The 审慎模式 http logback qos ch manual appenders html prudentlogback 中的序列化所有 JVM 之间的 IO 操作 写入同一文件 可能运行在不同的主机上 在其他日志记录框架中 如果
  • 无法使用 OpenSSL 验证服务器证书

    我已经使用 OpenSSL 编写了一个 SOAP 客户端 在 Ubuntu 12 04 上用 C 编写 但它目前无需检查服务器安全证书即可运行 这是我用来设置连接和检查证书的函数 bool bInitialiseSSL SSL CTX ct
  • CharInSet 不适用于非英文字母?

    我已经将应用程序从 Delphi 2007 更新到 Delphi 2010 一切都很顺利 除了一条编译正常但不起作用的语句 If Edit1 Text 1 in S then ShowMessage Found else ShowMessa
  • 使用 PutBlock 并将字节数组全部设置为零的 EIPHTTPProtocolExceptionPeer 异常

    使用 Delphi XE2 Update 3 我在将零字节块上传到 Azure 时遇到问题 当我说零字节时 我指的是每个元素设置为零的字节数组 不是零长度 例如 var ConInfo TAzureConnectionInfo RespIn
  • 从其可执行文件的路径获取服务名称

    我有一个可执行文件的路径 它是一个正在运行的服务应用程序 例如 C Program Files x86 Someapp somesvc exe 我想停止并启动它 为此我想我需要获取服务的名称 如下所示 this https stackove

随机推荐

  • 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