Наше приложение Delphi пытается подключиться к нашему сайту через IdFTP на клиентской машине с использованием прокси-сервера, и я всегда получаю сообщение «read timed out». Я не знаю, как это исправить.IdFTP.Connect через прокси-сервер
Мой код:
IdFTP1.Host :=Website_address;
IdFTP1.Username :=Website_user;
IdFTP1.Password :=Website_password;
IdFTP1.TransferType:=ftBinary;
IdFTP1.ProxySettings.ProxyType:=fpcmNone;
IdFTP1.ProxySettings.Host :=Proxy_server;
IdFTP1.ProxySettings.Port :=Proxy_port;
IdFTP1.ProxySettings.Username :=Proxy_username;
IdFTP1.ProxySettings.Password :=Proxy_password;
IdFTP1.Connect;
... который возвращает 'читать истекло' исключение.
Просмотрев веб-сайты для получения возможных решений, я пробовал различные комбинации из следующих без радости (хотя может быть комбинация, которая может работать, я просто не знаю, что я делаю):
IdFTP1.IOHandler :=TIdSSLIOHandlerSocketOpenSSL.Create
(IdFTP1);
IdFTP1.UseTLS :=utUseExplicitTLS;
IdFTP1.NATKeepAlive.UseKeepAlive:=True;
IdFTP1.NATKeepAlive.IdleTimeMS :=100000;
IdFTP1.DataPortProtection :=ftpdpsPrivate;
Неудачная вещь: я не могу ее протестировать на своей машине, мне нужно скомпилировать новую версию приложения, скопировать его на свою машину и посмотреть, работает ли она.
Об установке на стороне клиента ничего сложно сказать, насколько я могу судить. Они дали мне адрес прокси-сервера, а имя пользователя и пароль прокси-сервера пустые.
Другие биты приложения подключаются к одному веб-сайту через HTTP и прокси-сервер, и это работает отлично. Поэтому моя логика заключается в том, что это не могут быть брандмауэры или что-то в этом роде.
IdHTTP1.HandleRedirects :=True;
IdHTTP1.ProxyParams.BasicAuthentication:=True;
IdHTTP1.ProxyParams.ProxyServer :=Proxy_server;
IdHTTP1.ProxyParams.ProxyPort :=Proxy_port;
IdHTTP1.ProxyParams.ProxyUsername :=Proxy_username;
IdHTTP1.ProxyParams.ProxyPassword :=Proxy_password;
Я использую Delphi XE8.
Они создали виртуальный сервер для нашего тестирования, он работает под управлением Windows 7 64 бит.
Update
Remy, это правильная идея? Одна из проблем, с которой я столкнулся, - это компонент TIdConnectThroughHttpProxy, что должно быть в предложении uses для этого? Delphi не узнает об этом.
var
TempIO : TIdIOHandlerStack;
TempProxy : TIdConnectThroughHttpProxy;
......
TempIO :=TIdIOHandlerStack.Create;
TempProxy :=TIdConnectThroughHttpProxy.Create;
TempProxy.Host :=Proxy_host;
TempIO.TransparentProxy:=TempProxy;
IdFTP1.IOHandler :=TempIO;
IdFTP1.Connect;
Update 2
Точка ясности: запрос HTTP, который успешно достигает веб-сервера через прокси-сервер переходит к другой веб-адрес, чем запрос FTP. Другими словами, они оба проходят через один и тот же прокси-сервер, но адреса назначения различны. На всякий случай это полезно.
Я теперь попытался использовать Fiddler, чтобы найти проблему, не уверен, что это отличная идея? Я понимаю, что Fiddler действует как прокси-сервер, поэтому я думал, что увижу, столкнулся ли я с той же проблемой. Конечно, не могу подключиться.
Чтобы иметь четкое представление о моих шагах:
Run Скрипач, и установите флажок, который говорит «Захват FTP запросы».
Update моего компонент IdHTTP:
IdHTTP1.ProxyParams.ProxyServer:='127.0.0.1';
IdHTTP1.ProxyParams.ProxyPort :=Fiddler port;
Update мой компонент IdFTP:
IdFTP1.ProxySettings.Host:='127.0.0.1';
IdFTP1.ProxySettings.Port:=Fiddler port;
Так что теперь я удалил установки клиента полностью, я зеркалирование проблемы с моей локальной машины с помощью Fiddler, как насколько я могу судить. Если я не использую Fiddler, все отлично работает. Если я использую Fiddler, как описано выше, HTTP-запрос работает правильно, но FTP-запрос не может подключиться.
Любые идеи относительно того, что я могу сделать, чтобы попытаться решить эту проблему? Я уверен, что это действительно глупо, что я ошибаюсь.
После долгих проб и ошибок выяснилось, что проблема была на стороне клиента. Код под первым заголовком «Обновить» является правильным и хорошо работает при попытке подключения через FTP через HTTP-прокси. Игнорируйте текст в разделе «Обновление 2». Попытка тестирования с использованием Fiddler вообще не работала, я в конечном итоге использовал CCProxy, который был очень полезен. Еще раз спасибо @Remy Lebeau за ответ ниже. – Alex