使用自定义DNS解析的Delphi Indy https请求

时间:2018-05-14 19:12:45

标签: 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);   // !!

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

1 个答案:

答案 0 :(得分:3)

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

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

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