Проверка файлов, полученных методом Twisted по FTPClient.retrieveFile, на полноту - PullRequest
3 голосов
/ 18 ноября 2009

Я пишу собственный ftp-клиент, который будет выполнять роль привратника для входящего мультимедийного контента от субподрядчиков, нанятых одним из наших партнеров. Я выбрал Twisted, потому что он позволяет мне анализировать содержимое файла перед локальной записью файлов на диск, и я все равно искал повод для изучения Twisted. Я использую twisted.protocols.ftp.FTPClient.retrieveFile, чтобы получить файл, передавая экранированный путь к файлу и протокол к методу retrieveFile. Я хочу быть абсолютно уверен, что весь файл был получен, потому что обработчик события в обратном вызове собирается записать файл на диск локально, а затем удалить удаленный файл из поведения переключателя '-E' ftp-сервера в lftp клиент. Мой вопрос: действительно ли мне нужно беспокоиться об этом, или я могу предположить, что произойдет ошибка, если файл не будет полностью восстановлен?

1 Ответ

4 голосов
/ 18 ноября 2009

Есть несколько юнит-тестов для поведения в этой области.

twisted.test.test_ftp.FTPClientTestCase.test_failedRETR является наиболее релевантным. Он охватывает случай, когда соединения управления и передачи данных теряются во время передачи файла.

Мне кажется, что тестовое покрытие в этой области могло бы быть значительно улучшено. Нет тестов, охватывающих случай, когда, например, происходит потеря соединения с данными во время передачи. Однако одна сложность заключается в том, что FTP не очень надежный протокол. Окончание передачи файла сигнализируется закрытием соединения для передачи данных. Чтобы быть в безопасности, вы должны проверить, получили ли вы столько байтов, сколько ожидали получить. Единственный способ выполнить эту проверку - заранее узнать размер файла или запросить его у сервера, используя LIST (FTPClient.list).

Учитывая все это, я бы посоветовал, что когда передача файла завершится, вы всегда спрашиваете сервер, сколько байтов вы должны были получить, и убедитесь, что оно соответствует количеству байтов, доставленных в ваш протокол. Иногда вы можете получить ошибку на Deferred, возвращаемом с retrieveFile, но это обеспечит вам безопасность даже в тех случаях, когда вы этого не сделаете.

...