gpt4 book ai didi

Delphi Indy https 请求与自定义 DNS 解析

转载 作者:行者123 更新时间:2023-12-03 15:28:15 32 4
gpt4 key购买 nike

示例网址: https://api.binance.com/api/v1/time

使用 TIdDNSResolver 和 cloudflare dns 我可以获得主机 IP。直接请求

的形式

https://205.251.219.20/api/v1/time

不起作用,因为据我了解,服务器希望在网址中看到“api.binance.com”。 (即使在浏览器中也不起作用)

使用 synapce 和以下补丁将请求的主机替换为已解析的 IP,我使其正常工作

function THTTPSend.InternalDoConnect(needssl: Boolean): Boolean;
begin
Result := False;
FSock.CloseSocket;
FSock.Bind(FIPInterface, cAnyPort);
if FSock.LastError <> 0 then
Exit;
If ResolvedIP.IsEmpty
then FSock.Connect(FTargetHost, FTargetPort)
else FSock.Connect(ResolvedIP, FTargetPort); // !!

有没有办法使用 Indy 来做同样的事情?

最佳答案

默认情况下,TIdHTTP使用由正在请求的 URL 指定/推断的主机:端口。要改变这种行为,您必须更改 TIdHTTP的源代码,例如 TIdCustomHTTP.SetHostAndPort()TIdCustomHTTP.CheckAndConnect()方法(都不是 virtual ),然后重新编译 Indy。

或者,您可以使用 TIdHTTPOnSocketAllocatedOn(Before|After)Bind事件(在 published 中不会提升为 TIdHTTP ,因此您必须在运行时手动访问它们)以更改 TIdHTTP.IOHandler.Host属性到您想要连接的任何 IP 地址。这不会对 TIdHTTP 的 HTTP header 产生任何影响。发送,例如 Host ,仍将从 URL 中获取。

或者,如果您希望 Indy 的所有主机到 IP DNS 查询都通过 Cloudflare,您可以从 TIdStack 派生一个自定义类。 (或者您感兴趣的任何特定于平台的后代,例如 TIdStackWindows ),覆盖其虚拟 HostByName()方法来执行您想要的任何 DNS 查询,然后将您的类类型传递给 SetStackClass() IdStack 中的函数在实例化任何 Indy 类之前的程序启动时的单元。

关于Delphi Indy https 请求与自定义 DNS 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50337460/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com