问题标签 [indy-9]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
841 浏览

delphi - 如何使用 Indy 9 发送 DELETE 请求?

我正在尝试使用 Indy 9 发送 HTTP DELETE 请求。

尝试(像那样):

这不起作用,因为在 TIdHTTPProtocol.BuildAndSendRequest 中跳过了 hmDelete。

有没有机会使用 Indy 9 发送 HTTP DELETE 请求?

Delpphi 7,Indy 9.00.10,IdHTTP 单元的一部分;

0 投票
1 回答
173 浏览

delphi-7 - IdMappedPortTCP 现在需要在 telnet 连接后“刺激”

多年来,我一直在特定程序中使用 IdMappedPortTCP 来允许通用端口转发。我正在测试升级的构建/组件环境,但遇到了问题。首先,这是新旧版本信息:

  • 操作系统:W2kSP4 --> 相同(嘿,为什么大家都在笑?)
  • 德尔福:5 --> 7
  • Indy 项目:9.0.0.14 --> 9.[最新的 SVN]

我通过使用标准 Windows 控制台 telnet 客户端和 Linux 服务器将其插入到 telnet 会话中来对其进行测试,并且我发现行为发生了奇怪的变化。

  • 直接连接:客户端连接,立即看到服务器问候
  • 老印地:与直接相同
  • 新印地:客户连接,什么也看不见。按键,看到服务器问候+击键。

下面是事件链的比较:

老的:

新的:

在第一个中,您在连接后立即看到 OutboundData。在第二个中,连接后什么都没有发生,直到我发送了一个击键(6 分钟后),此时您会看到 Execute,然后是第一个 OutboundData 事件。

这让我不禁疑惑:是真的连接到服务器,只是延迟了输出,还是连接本身被延迟了?

我的第一个结论是连接本身被延迟,这就是原因。服务器在登录提示符处有 1 分钟的超时。如果您连接并收到问候但只是坐在那里,服务器会在一分钟后断开连接。使用新的 Indy 版本,我在连接事件后坐了整整 6 分钟,然后毫无问题地得到了服务器问候。

但是... NETSTAT 显示在记录连接事件后不久建立的与远程服务器的连接!所以,我只能得出结论,确实建立了连接,但也许某些初始字符正在被“吃掉”,或者导致 getty 在击键之前无法参与?

有什么建议么?您是否知道我可能会寻找的任何改变——我应该做但没有做的事情?任何见解都值得赞赏。

(除非有任何好的线索,我想我侦查的下一步可能是用 WireShark 嗅探两台机器,看看连接后发生了什么。)

更新:Wireshark(单腿)

从机器外部捕获的数据包显示 MappedPort 和服务器之间的流量(但不是客户端和 MappedPort 之间的流量)显示 telnet 服务器发送“Do Authenticate”,客户端(通过 MappedPort)回复“Will认证”。接下来是服务器发送验证子选项(并且客户端同意),然后是所有其他 telnet 选项。最后,在看到登录文本后,客户端发送“do echo”,他们都坐在那里直到 1 分钟后,此时服务器发送 TCP FIN 以关闭连接。那是“好旧”的版本。

在新版本中,客户端不响应“Will Authenticate”,并且他们都无限期地坐在那里。(嗯,我想知道这在服务器资源方面有什么关系——可能是很好的 DOS 攻击。不过,它一个旧的 telnet 守护进程,所以它现在可能已经修复了......)当我终于发送第一个按键时,这就是它在那个数据包中发送的全部内容。然后客户端发送“将进行身份验证”(无需来自服务器的额外刺激),协商继续正常进行;来自服务器的最后一个数据包(包含回显参数)也包括输入的回显字符。所以这就像客户端没有看到来自服务器的初始“做身份验证”数据包,但是一旦你开始输入,

6/13 更新:Wireshark(双腿)

我捕获了“中断”对话的两条腿并对其进行了分析。有趣的行为。底线:一旦服务器获得 TCP 连接,它就会发回 Telnet-DoAuth 邀请。 IdMappedPortTCP 保留该数据包,但尚未将其传递给客户端。一旦客户端最终发送第一次击键(几秒钟或几分钟后),Id 将其传递给服务器。THEN Id 将从服务器获得的 DoAuth 数据包传递给客户端。

以下是对数据包的更详细说明:

数据包转储行格式: Pkt# From-To Payload

(不要介意数据包#跳过;客户端和代理都在我运行捕获的机器托管的 VM 上运行,因此 Wireshark 看到了两个数据包副本。我只包含了 pkt#,所以我可以参考如果我愿意,可以稍后进行原始转储。)

从/到机器:

一个有趣的转移:Linux 客户端

尽管我所有的测试都使用了各种 Windows 客户端(因为那是生产中使用的),但我“意外地”使用了 Linux(因为那是我在我的工作站上运行的,我运行 Wireshark),因为它很方便。该客户的行为不同 - 更积极 - 从而避免了问题。这是一个转储的样子:

如您所见,客户端并没有等待 telnet 服务器先说话——只要 TCP 连接建立,它就会发送一个完整的 Do/Will 列表。一旦 Id 打开该连接,这又会传递到服务器。服务器发回与之前最初所做的相同的“DoAuth”;不同之处在于,这一次,已经传递了来自客户端的流量,Id 立即传递它。然后客户端发送身份验证标志,然后事情就开始了。

所以,如果客户端先说话,IdMappedPortTCP 就可以了;只有当服务器首先说话时,它才会保留它的消息,并且在客户端说些什么之前不会将其传递给客户端。

9/27 更新:发现代码更改

降级到 9.0.0.14 解决了这个问题。比较两个版本的IdMappedPortTCP.pas源代码,我发现唯一的区别是新版本在TIdMappedPortThread.OutboundConnect 过程中添加了一段代码:

(第一行和最后一行已经存在,仅显示上下文。)

我确认将该代码添加到 9.0.0.14 会产生问题。

我检查了 SVN 存储库,您在 2008 年 9 月 7 日添加了违规代码。提交评论是:

更新了 TIdMappedPortThread.OutboundConnect() 以在 OnOutboundConnect 事件处理程序退出后检查入站客户端的 InputBuffer 中的待处理数据。

我不完全理解更改的原因或影响——显然你有充分的理由这样做——但它似乎确实产生了我描述的效果(“保持”服务器的初始输出,直到客户端发送某物)。

0 投票
1 回答
438 浏览

java - TIdX509 计算证书指纹 16 字节而不是 20

我在 java 和 delphi 5 中有一个小程序,它们都是为处理证书而设计的。

在delphi中,我使用了一个indy 9组件:TIdX509,在这个对象中有一种方法可以将指纹作为字符串,我没有找到TIdX509如何计算的任何地方。我只能发现它不应该有 16 个字节,例如:

72:7F:8D:DF:8D:5F:61:A3:9E:DF:38:CA:C5:5B:18:0A 16 组 2 个。

所以我在 Java 中进行了测试,看看会计算什么指纹,我根据这个答案做了我的功能如何计算 X.509 证书的 SHA-1 指纹?

我从中得到的结果类似于: 56:ee:54:2b:cb:d3:8a:e2:1d:13:e1:f3:9c:f6:8f:3b:69:18:95:0a - 20组2人

我还找到了这个网站:计算指纹,它还生成了 20 组 2 组而不是 16 组的指纹。

所以,我的问题是:为什么 indy 组件 TIdX509 生成的指纹只有 16 组 2,而应该是 20?

0 投票
2 回答
178 浏览

email - C++ Builder - Indy - 接收认证电子邮件

我正在使用 C++ builder 6 和 Indy 9/10。我正在编写代码以接收带有附件(基本上是 pdf 和 xml 文件)的认证电子邮件。当我收到电子邮件时,它有一个 TidMessageParts,其中包含一个多部分/混合部分,其他部分用于小文本,一个 xml 附件,其中包含有关电子邮件认证的信息和用于数字签名的部分等等。我的问题是:如何打开第一部分(多部分/混合)以提取其中的文本和附件。

请参阅我将发布的答案。

谢谢你。法布里齐奥

0 投票
1 回答
216 浏览

delphi - 德尔福 10.4 和印地 9

我有很多在 BDS2007 中使用 INDY 9 的程序。我将它们移植到 Delphi 10.4,但这里有 INDY 10。

是否可以删除 INDY 10(暂时未使用)并在 Delphi 10.4 中安装/编译 INDY 9?在犯错之前,我会问是否有人已经成功地做到了。

最好的问候西尔弗利奥

0 投票
1 回答
108 浏览

delphi - 如何在 Delphi 10.3.3 Pro 中使用 Indy 获取域名的到期日期?

如何使用 Indy 的TIdWhois组件获取域名的到期日期?

我不想获得完整的 WHOIS 数据,而只想获得到期日期。

我使用了这段代码:

这显示了完整的 WHOIS 数据。