Delphi Indy https запрос с настраиваемым разрешением DNS - PullRequest
0 голосов
/ 14 мая 2018

пример URL: https://api.binance.com/api/v1/time

Используя TIdDNSResolver и cloudflare dns, я могу получить IP хоста. прямой запрос в виде

https://205.251.219.20/api/v1/time

не работает, потому что, как я понимаю, сервер ожидает увидеть «api.binance.com» в URL. (он не работает даже в браузере)

Используя 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 голосов
/ 15 мая 2018

По умолчанию TIdHTTP использует хост: порт, который указывается / выводится по запрашиваемому URL-адресу.Чтобы изменить это поведение, вам придется изменить исходный код TIdHTTP, например, в методе TIdCustomHTTP.SetHostAndPort() или TIdCustomHTTP.CheckAndConnect() (который не является virtual), а затем перекомпилировать Indy.

В качестве альтернативы, вы можете использовать TIdHTTP 'OnSocketAllocated или On(Before|After)Bind событие (которые не повышаются до published в TIdHTTP, поэтому вам придется обращаться к ним вручную во время выполнения), чтобы изменить TIdHTTP.IOHandler.Hostсвойство любого IP-адреса, к которому вы хотите подключиться.Это не повлияет на заголовки HTTP, которые отправляет TIdHTTP, например, Host, которые все равно будут взяты из URL.

В качестве альтернативы, если вы хотите, чтобы все Indy's Host-to-IPDNS-запросы для прохождения через Cloudflare, вы можете получить собственный класс из TIdStack (или любого интересующего вас платформенного потомка, такого как TIdStackWindows), переопределить его виртуальный метод HostByName() для выполнения любого DNS-запроса, который вы хотитеи затем перед тем, как будут созданы какие-либо классы Indy, передайте тип вашего класса функции SetStackClass() в модуле IdStack.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...