Недавно в процессе рефакторинга наткнулся на один метод работы с FTP, который никак не хотел работать.

Вот эта зараза:

Согласитесь, выглядит жутковато. Как вы понимаете, в этом классе не один такой метод, и во всех создаётся новый объект класса FTPClient и повторяется один и тот же код. Также внимательный читатель скорее всего заметил то, что я углядел не сразу: если контент, который нужно залить на фтп не существует, то создаётся временный файл, который, по идеи, заливается, а потом удаляется. Но что будет, если файл существует? Правильно! Он будет залит, а потом удалён. Это противоречит бизнес-логике, и ни названия метода, ни комментарий нас об этом не предупреждает. После рефакторинга данный метод был разбит на несколько и стал выглядеть вот так:

И всё вроде бы отлично, но! Метод не работал не из-за уродливого кода, а из-за пока непонятной причины.

И вот тут как раз и начинается гейское присовывание между клиентом и сервером.

Дальнейшее исследование дампов wireshark (с фильтром ftp) показало нормальный коннект к фтп, но вот на попытку сменить рабочую директорию и туда что-то залить сервер отвечал, что такой путь не существует. Последующее гугление принесло свои плоды: оказалось, что тестируемый продукт позволяет устанавливать соединение только тогда, когда сервер находится в пассивном режиме, а не клиент (подробнее про это советую прочитать тут). Сказано — сделано, и клиент был поднят из позы раком путём удаления строчки кода:

  • ftpClient.enterLocalPassiveMode();

 и добавления новой повелительной строчки: 

  • ftpClient.enterLocalActiveMode();

, которая и говорит клиенту, что мол сервер стоит раком, пора присовывать с целью установления коннекта.

Итого: Если ничего не помогает, используйте WireShark для анализа отправляемых по протоколу запросов и установления причин проблемы. Пишите код красиво и няшно, и ни в коем случае не допускайте дублирования кода.

Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс