Rev 51: Switch DavListDirHandler and DavStatHandler. in http://bazaar.launchpad.net/%7Ebzr/bzr.webdav/webdav
Vincent Ladeuil
v.ladeuil+lp at free.fr
Sun Jun 8 21:32:50 BST 2008
At http://bazaar.launchpad.net/%7Ebzr/bzr.webdav/webdav
------------------------------------------------------------
revno: 51
revision-id: v.ladeuil+lp at free.fr-20080608203248-851u25jpfvhofpwp
parent: v.ladeuil+lp at free.fr-20080608193435-02kt8x2camnawwmz
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: webdav
timestamp: Sun 2008-06-08 22:32:48 +0200
message:
Switch DavListDirHandler and DavStatHandler.
modified:
webdav.py webdav.py-20060816232542-enpjxth2743ttqpq-3
-------------- next part --------------
=== modified file 'webdav.py'
--- a/webdav.py 2008-06-08 19:34:35 +0000
+++ b/webdav.py 2008-06-08 20:32:48 +0000
@@ -150,70 +150,6 @@
return name[where +1:]
-class DavListDirHandler(DavResponseHandler):
- """Handle a PROPPFIND depth 1 DAV response for a directory.
-
- The expected content is a multi-status containing a list of response
- containing at least a href property.
- """
- def __init__(self):
- DavResponseHandler.__init__(self)
- self.dir_content = None
-
- def _validate_handling(self):
- if self.dir_content is not None:
- self.expected_content_handled = True
-
- def startElement(self, name, attrs):
- self.chars_wanted = (self._strip_ns(name) == 'href')
- DavResponseHandler.startElement(self, name, attrs)
-
- def endElement(self, name):
- stack = self.elt_stack
- if (len(stack) == 3
- and stack[0] == 'multistatus'
- and stack[1] == 'response'
- # sax guarantees that name is also href (when ns is stripped)
- and stack[2] == 'href'):
- if self.dir_content is None:
- self.dir_content = []
- self.dir_content.append(self.chars)
- DavResponseHandler.endElement(self, name)
-
-
-def _extract_dir_content(url, infile):
- """Extract the directory content from a DAV PROPFIND response.
-
- :param url: The url used for the PROPFIND request.
- :param infile: A file-like object pointing at the start of the response.
- """
- parser = xml.sax.make_parser()
-
- handler = DavListDirHandler()
- handler.set_url(url)
- parser.setContentHandler(handler)
- try:
- parser.parse(infile)
- except xml.sax.SAXParseException, e:
- raise errors.InvalidHttpResponse(
- url, msg='Malformed xml response: %s' % e)
- # Reformat for bzr needs
- dir_content = handler.dir_content
- dir = dir_content[0]
- dir_len = len(dir)
- elements = []
- for href in dir_content[1:]: # Ignore first element
- if href.startswith(dir):
- name = href[dir_len:]
- if name.endswith('/'):
- # Get rid of final '/'
- name = name[0:-1]
- # We receive already url-encoded strings so down-casting is
- # safe. And bzr insists on getting strings not unicode strings.
- elements.append(str(name))
- return elements
-
-
class DavStatHandler(DavResponseHandler):
"""Handle a PROPPFIND depth 0 DAV response for a file or directory.
@@ -336,6 +272,70 @@
return _DAVStat(size, is_dir, is_exec)
+class DavListDirHandler(DavResponseHandler):
+ """Handle a PROPPFIND depth 1 DAV response for a directory.
+
+ The expected content is a multi-status containing a list of response
+ containing at least a href property.
+ """
+ def __init__(self):
+ DavResponseHandler.__init__(self)
+ self.dir_content = None
+
+ def _validate_handling(self):
+ if self.dir_content is not None:
+ self.expected_content_handled = True
+
+ def startElement(self, name, attrs):
+ self.chars_wanted = (self._strip_ns(name) == 'href')
+ DavResponseHandler.startElement(self, name, attrs)
+
+ def endElement(self, name):
+ stack = self.elt_stack
+ if (len(stack) == 3
+ and stack[0] == 'multistatus'
+ and stack[1] == 'response'
+ # sax guarantees that name is also href (when ns is stripped)
+ and stack[2] == 'href'):
+ if self.dir_content is None:
+ self.dir_content = []
+ self.dir_content.append(self.chars)
+ DavResponseHandler.endElement(self, name)
+
+
+def _extract_dir_content(url, infile):
+ """Extract the directory content from a DAV PROPFIND response.
+
+ :param url: The url used for the PROPFIND request.
+ :param infile: A file-like object pointing at the start of the response.
+ """
+ parser = xml.sax.make_parser()
+
+ handler = DavListDirHandler()
+ handler.set_url(url)
+ parser.setContentHandler(handler)
+ try:
+ parser.parse(infile)
+ except xml.sax.SAXParseException, e:
+ raise errors.InvalidHttpResponse(
+ url, msg='Malformed xml response: %s' % e)
+ # Reformat for bzr needs
+ dir_content = handler.dir_content
+ dir = dir_content[0]
+ dir_len = len(dir)
+ elements = []
+ for href in dir_content[1:]: # Ignore first element
+ if href.startswith(dir):
+ name = href[dir_len:]
+ if name.endswith('/'):
+ # Get rid of final '/'
+ name = name[0:-1]
+ # We receive already url-encoded strings so down-casting is
+ # safe. And bzr insists on getting strings not unicode strings.
+ elements.append(str(name))
+ return elements
+
+
class PUTRequest(_urllib2_wrappers.Request):
def __init__(self, url, data, more_headers={}, accepted_errors=None):
More information about the bazaar-commits
mailing list