From a47be2ef0d72c5de183b9af1d44f33055c6c2dcc Mon Sep 17 00:00:00 2001 From: "P. Christeas" Date: Tue, 13 Jul 2010 23:54:18 +0300 Subject: [PATCH] Document ftp: improve exception handling, size may return 404 bzr revid: p_christ@hol.gr-20100713205418-8oe6svsdvw2yy4jn --- addons/document_ftp/ftpserver/abstracted_fs.py | 4 +++- addons/document_ftp/ftpserver/ftpserver.py | 16 +++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/addons/document_ftp/ftpserver/abstracted_fs.py b/addons/document_ftp/ftpserver/abstracted_fs.py index 5e7c8c1..ddd34e2 100644 --- a/addons/document_ftp/ftpserver/abstracted_fs.py +++ b/addons/document_ftp/ftpserver/abstracted_fs.py @@ -163,6 +163,8 @@ class abstracted_fs(object): ret = child.open_data(cr, mode) cr.commit() return ret + except EnvironmentError: + raise except Exception,e: self._log.exception('Cannot create item %s at node %s', objname, repr(node)) raise OSError(1, 'Operation not permited.') @@ -432,7 +434,7 @@ class abstracted_fs(object): def getsize(self, datacr): """Return the size of the specified file in bytes.""" if not (datacr and datacr[1]): - return 0L + raise IOError(errno.ENOENT, "No such file or directory") if datacr[1].type in ('file', 'content'): return datacr[1].get_data_len(datacr[0]) or 0L return 0L diff --git a/addons/document_ftp/ftpserver/ftpserver.py b/addons/document_ftp/ftpserver/ftpserver.py index e267216..528ce05 100644 --- a/addons/document_ftp/ftpserver/ftpserver.py +++ b/addons/document_ftp/ftpserver/ftpserver.py @@ -2565,9 +2565,12 @@ class FTPHandler(asynchat.async_chat): # return size = self.run_as_current_user(self.fs.getsize, datacr) except EnvironmentError, err: - why = _strerror(err) + why = err.strerror self.log('FAIL SIZE "%s". %s.' %(line, why)) - self.respond('550 %s.' %why) + if err.errno == errno.ENOENT: + self.respond("404 %s." % why) + else: + self.respond('550 %s.' % why) else: self.respond("213 %s" %size) self.log('OK SIZE "%s".' %line) @@ -2640,10 +2643,13 @@ class FTPHandler(asynchat.async_chat): try: datacr = self.fs.get_crdata(line, mode='delete') self.run_as_current_user(self.fs.remove, datacr) - except OSError, err: - why = _strerror(err) + except EnvironmentError, err: + why = err.strerror self.log('FAIL DELE "%s". %s.' %(line, why)) - self.respond('550 %s.' %why) + if err.errno == errno.ENOENT: + self.respond('404 %s.' % why) + else: + self.respond('550 %s.' %why) else: self.log('OK DELE "%s".' %line) self.respond("250 File removed.") -- 1.7.10.4