def ftp_RETR(self, path): if self.dtpInstance is None: raise BadCmdSequenceError('PORT or PASV required before RETR') try: newsegs = toSegments(self.workingDirectory, path) except InvalidPath: return defer.fail(FileNotFoundError(path)) # XXX For now, just disable the timeout. Later we'll want to # leave it active and have the DTP connection reset it # periodically. self.setTimeout(None) # Put it back later # And away she goes if not self.binary: consumer = ASCIIConsumerWrapper(self.dtpInstance) else: consumer = self.dtpInstance pth = '/'.join(newsegs) restore_dir = tmpfile.make_dir('restore', prefix=('_'.join(newsegs) + '_')) ret = api.file_download_start(pth, restore_dir, wait_result=True) d = Deferred() d.addCallback(self._cbReadOpened, consumer) d.addErrback(self._ebReadOpened, newsegs) d.addBoth(self._enableTimeoutLater) if isinstance(ret, dict): # if ret['status'] != 'OK': # return defer.fail(FileNotFoundError(path)) self._cbRestoreDone(ret, newsegs, d) return d ret.addCallback(self._cbRestoreDone, newsegs, d) ret.addErrback(lambda err: lg.exc(err)) return d
def _startConsumer(self, consumer): if not self.binary: consumer = ASCIIConsumerWrapper(consumer) d = self.dtpInstance.registerConsumer(consumer) if self.dtpInstance.isConnected: self.reply(DATA_CNX_ALREADY_OPEN_START_XFR) else: self.reply(FILE_STATUS_OK_OPEN_DATA_CNX) return d
def cbConsumer(cons): if not self.binary: cons = ASCIIConsumerWrapper(cons) print "cons", cons d = self.dtpInstance.registerConsumer(cons) print "dtpinstance", d if self.dtpInstance.isConnected: print "reply : DATA_CNX_ALREADY_OPEN_START_XFR", DATA_CNX_ALREADY_OPEN_START_XFR self.reply(DATA_CNX_ALREADY_OPEN_START_XFR) else: print "DATA_CNX_ALREADY_OPEN_START_XFR", DATA_CNX_ALREADY_OPEN_START_XFR self.reply(FILE_STATUS_OK_OPEN_DATA_CNX) return d