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

Mic*_*lev 4 delphi https

示例网址: 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);   // !!
Run Code Online (Sandbox Code Playgroud)

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

Rem*_*eau 5

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

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

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