示例网址: 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 来做同样的事情?
默认情况下,TIdHTTP
使用由所请求的 URL 指定/推断的主机:端口。要更改该行为,您必须更改 的TIdHTTP
源代码,例如在TIdCustomHTTP.SetHostAndPort()
orTIdCustomHTTP.CheckAndConnect()
方法中(两者都不是virtual
),然后重新编译 Indy。
或者,您可以使用TIdHTTP
'sOnSocketAllocated
或On(Before|After)Bind
event (它们不会提升为published
in TIdHTTP
,因此您必须在运行时手动访问它们)将属性更改TIdHTTP.IOHandler.Host
为您想要连接的任何 IP 地址。这不会对TIdHTTP
发送的 HTTP 标头产生任何影响,例如Host
,仍将从 URL 中获取。
或者,如果您希望 Indy 的所有主机到 IP DNS 查询都通过 Cloudflare,您可以从TIdStack
(或您感兴趣的任何特定于平台的后代,例如TIdStackWindows
)派生一个自定义类,覆盖其虚拟HostByName()
方法以执行任何操作您想要的 DNS 查询,然后在实例化任何 Indy 类之前,在程序启动时将您的类类型传递给单元SetStackClass()
中的函数。IdStack
归档时间: |
|
查看次数: |
754 次 |
最近记录: |