2016-05-16 4 views
1

Наше приложение 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-запрос не может подключиться.

Любые идеи относительно того, что я могу сделать, чтобы попытаться решить эту проблему? Я уверен, что это действительно глупо, что я ошибаюсь.

+0

После долгих проб и ошибок выяснилось, что проблема была на стороне клиента. Код под первым заголовком «Обновить» является правильным и хорошо работает при попытке подключения через FTP через HTTP-прокси. Игнорируйте текст в разделе «Обновление 2». Попытка тестирования с использованием Fiddler вообще не работала, я в конечном итоге использовал CCProxy, который был очень полезен. Еще раз спасибо @Remy Lebeau за ответ ниже. – Alex

ответ

1
IdFTP1.ProxySettings.ProxyType:=fpcmNone 

Это говорит TIdFTPне общаться с FTP-прокси в курсе. Если вы хотите использовать свойства TIdFTP.ProxySettings, вам необходимо установить ProxyType, так что TIdFTP.Connect() будет подключаться к ProxySettings.Host, а TIdFTP.Login() будет знать, какие команды ему нужно отправить для входа в прокси-сервер и запросить подключение к следующему хосту.

Обратите внимание, что TIdFTP.ProxySettings работает только с FTP-прокси. Если вам необходимо подключиться к прокси-серверу другого типа, перед вызовом TIdFTP.Connect() вам необходимо будет назначить компонент TIdIOHandler в свойстве TIdFTP.IOHandler, а затем присвоить TIdCustomTransparentProxy -уложенный компонент для свойства TIdIOHandler.TransparentProxy. Чтобы подключиться к HTTP-прокси (который, по-видимому, вам нужен, поскольку это то, с чем работает TIdHTTP.ProxyParams), используйте TIdConnectThroughHttpProxy. Чтобы подключиться к прокси SOCKS, используйте TIdSocksInfo.

+0

Спасибо @Remy Lebeau. Я не слишком уверен, как правильно это сделать, не могли бы вы взглянуть на мой обновленный код выше и сообщить мне, если это правильная идея, а также где я ошибаюсь? – Alex

+0

Да, это основная идея. Компонент 'TIdConnectThroughHttpProxy' находится в модуле IdConnectThroughHttpProxy. Не забудьте установить для свойства 'Enabled' значение true. Кроме того, если вы хотите использовать шифрование с FTP, вам нужно использовать SSLIOHandler, например 'TIdSSLIOHandlerSocketOpenSSL'. –

+0

Еще раз спасибо @Remy Lebeau. Все еще сражаясь с этим, я пробовал предлагаемые варианты, все без успеха до сих пор. Не могли бы вы взглянуть на «Обновление 2», я попытался решить эту проблему под другим углом, может быть, у вас есть идеи? – Alex