Document ftp: improve exception handling, size may return 404
authorP. Christeas <p_christ@hol.gr>
Tue, 13 Jul 2010 20:54:18 +0000 (23:54 +0300)
committerP. Christeas <p_christ@hol.gr>
Tue, 13 Jul 2010 20:54:18 +0000 (23:54 +0300)
bzr revid: p_christ@hol.gr-20100713205418-8oe6svsdvw2yy4jn

addons/document_ftp/ftpserver/abstracted_fs.py
addons/document_ftp/ftpserver/ftpserver.py

index 5e7c8c1..ddd34e2 100644 (file)
@@ -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
index e267216..528ce05 100644 (file)
@@ -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.")