Est-ce que quelqu'un a réussi à implémenter la commande REST dans le serveur FTP torsadé? Ma tentative actuelle:Implémentation de REST dans twisted.protocols.ftp.FTP?
from twisted.protocols import ftp
from twisted.internet import defer
class MyFTP(ftp.FTP):
def ftp_REST(self, pos):
try:
pos = int(pos)
except ValueError:
return defer.fail(CmdSyntaxError('Bad argument for REST'))
def all_ok(result):
return ftp.REQ_FILE_ACTN_PENDING_FURTHER_INFO # 350
return self.shell.restart(pos).addCallback(all_ok)
class MyShell(ftp.FTPShell):
def __init__(self, host, auth):
self.position = 0
...
def restart(self, pos):
self.position = pos
print "Restarting at %s"%pos
return defer.succeed(pos)
Lorsqu'un client envoie une commande REST, il faut quelques secondes avant que je vois à la sortie du script:
Traceback (most recent call last):
Failure: twisted.protocols.ftp.PortConnectionError: DTPFactory timeout
Restarting at <pos>
Qu'est-ce que je fais mal? Il me semble qu'une réponse devrait suivre immédiatement la commande REST, pourquoi le socket est-il sorti?
Mise à jour:
Après avoir activé l'enregistrement comme suggéré par Jean-Paul Calderone, il ressemble à la commande REST est même pas fait à ma classe FTP avant que les temps de connexion PAO par manque de connexion (horodatages réduit à MM: SS par souci de brièveté):
09:53 [TrafficLoggingProtocol,1,127.0.0.1] cleanupDTP
09:53 [TrafficLoggingProtocol,1,127.0.0.1] <<class 'twisted.internet.tcp.Port'> of twisted.protocols.ftp.DTPFactory on 37298>
09:53 [TrafficLoggingProtocol,1,127.0.0.1] dtpFactory.stopFactory
09:53 [-] (Port 37298 Closed)
09:53 [-] Stopping factory <twisted.protocols.ftp.DTPFactory instance at 0x8a792ec>
09:53 [-] dtpFactory.stopFactory
10:31 [-] timed out waiting for DTP connection
10:31 [-] Unexpected FTP error
10:31 [-] Unhandled Error
Traceback (most recent call last):
Failure: twisted.protocols.ftp.PortConnectionError: DTPFactory timeout
10:31 [TrafficLoggingProtocol,2,127.0.0.1] Restarting at 1024
la commande retourne ftp_PASV
DTPFactory.deferred
, qui est décrit comme un « report [qui] se déclenche lorsque l'instance est connecté ». Les commandes RETR passent bien (ftp.FTP serait sans valeur). Cela me porte à croire qu'il y a une sorte d'opération de blocage ici qui ne laissera rien d'autre se produire jusqu'à ce que la connexion DTP soit établie; alors et seulement alors pouvons-nous accepter d'autres commandes. Malheureusement, il semble que certains (tous?) Clients (en particulier, je teste avec FileZilla) envoient la commande REST avant de se connecter en essayant de reprendre un téléchargement.
Je pense que nous aimerions probablement résoudre ce problème dans Twisted, aussi. Avez-vous envie de décrire le problème dans un nouveau ticket sur http://twistedmatrix.com/? –
@ Jean-Paul Claderone, bien sûr: http://twistedmatrix.com/trac/ticket/4819 – eternicode
Merci beaucoup. :) –