[CalendarServer-changes] [9472] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Fri Jul 20 15:46:08 PDT 2012


Revision: 9472
          http://trac.macosforge.org/projects/calendarserver/changeset/9472
Author:   wsanchez at apple.com
Date:     2012-07-20 15:46:08 -0700 (Fri, 20 Jul 2012)
Log Message:
-----------
Use encodeXMLName()

Modified Paths:
--------------
    CalendarServer/trunk/twext/web2/dav/method/report.py
    CalendarServer/trunk/twext/web2/dav/noneprops.py
    CalendarServer/trunk/twext/web2/dav/resource.py
    CalendarServer/trunk/twext/web2/dav/test/test_xattrprops.py
    CalendarServer/trunk/twext/web2/dav/test/util.py
    CalendarServer/trunk/twext/web2/dav/xattrprops.py
    CalendarServer/trunk/twistedcaldav/extensions.py
    CalendarServer/trunk/twistedcaldav/memcacheprops.py
    CalendarServer/trunk/twistedcaldav/method/report.py
    CalendarServer/trunk/twistedcaldav/storebridge.py
    CalendarServer/trunk/twistedcaldav/test/test_memcacheprops.py
    CalendarServer/trunk/twistedcaldav/test/test_validation.py
    CalendarServer/trunk/txdav/base/propertystore/base.py
    CalendarServer/trunk/txdav/base/propertystore/xattr.py

Modified: CalendarServer/trunk/twext/web2/dav/method/report.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/method/report.py	2012-07-20 22:45:01 UTC (rev 9471)
+++ CalendarServer/trunk/twext/web2/dav/method/report.py	2012-07-20 22:46:08 UTC (rev 9472)
@@ -44,6 +44,7 @@
 from twext.web2.dav.util import davXMLFromStream
 from txdav.xml import element as davxml
 from txdav.xml.element import lookupElement
+from txdav.xml.base import encodeXMLName
 
 log = Logger()
 
@@ -115,7 +116,7 @@
         if namespace == davxml.dav_namespace:
             request.submethod = "DAV:" + name
         else:
-            request.submethod = "{%s}%s" % (namespace, name)
+            request.submethod = encodeXMLName(namespace, name)
     else:
         method_name = to_method(name)
 
@@ -136,8 +137,8 @@
         #
         # Requested report is not supported.
         #
-        log.err("Unsupported REPORT {%s}%s for resource %s (no method %s)"
-                % (namespace, name, self, method_name))
+        log.err("Unsupported REPORT %s for resource %s (no method %s)"
+                % (encodeXMLName(namespace, name), self, method_name))
 
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,

Modified: CalendarServer/trunk/twext/web2/dav/noneprops.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/noneprops.py	2012-07-20 22:45:01 UTC (rev 9471)
+++ CalendarServer/trunk/twext/web2/dav/noneprops.py	2012-07-20 22:46:08 UTC (rev 9472)
@@ -33,7 +33,9 @@
 
 from twext.web2 import responsecode
 from twext.web2.http import HTTPError, StatusResponse
+from txdav.xml.base import encodeXMLName
 
+
 class NonePropertyStore (object):
     """
     DAV property store which contains no properties and does not allow
@@ -50,10 +52,16 @@
         pass
 
     def get(self, qname, uid=None):
-        raise HTTPError(StatusResponse(responsecode.NOT_FOUND, "No such property: {%s}%s" % qname))
+        raise HTTPError(StatusResponse(
+            responsecode.NOT_FOUND,
+            "No such property: %s" % (encodeXMLName(*qname),)
+        ))
 
     def set(self, property, uid=None):
-        raise HTTPError(StatusResponse(responsecode.FORBIDDEN, "Permission denied for setting property: %s" % (property,)))
+        raise HTTPError(StatusResponse(
+            responsecode.FORBIDDEN,
+            "Permission denied for setting property: %s" % (property,)
+        ))
 
     def delete(self, qname, uid=None):
         # RFC 2518 Section 12.13.1 says that removal of

Modified: CalendarServer/trunk/twext/web2/dav/resource.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/resource.py	2012-07-20 22:45:01 UTC (rev 9471)
+++ CalendarServer/trunk/twext/web2/dav/resource.py	2012-07-20 22:46:08 UTC (rev 9472)
@@ -57,6 +57,12 @@
 from twisted.internet import reactor
 
 from twext.python.log import Logger
+from txdav.xml import element
+from txdav.xml.base import encodeXMLName
+from txdav.xml.element import WebDAVElement, WebDAVEmptyElement, WebDAVTextElement
+from txdav.xml.element import dav_namespace
+from txdav.xml.element import twisted_dav_namespace, twisted_private_namespace
+from txdav.xml.element import registerElement, lookupElement
 from twext.web2 import responsecode
 from twext.web2.http import HTTPError, RedirectResponse, StatusResponse
 from twext.web2.http_headers import generateContentType
@@ -70,11 +76,6 @@
 from twext.web2.dav.noneprops import NonePropertyStore
 from twext.web2.dav.util import unimplemented, parentForURL, joinURL
 from twext.web2.dav.auth import PrincipalCredentials
-from txdav.xml import element
-from txdav.xml.element import WebDAVElement, WebDAVEmptyElement, WebDAVTextElement
-from txdav.xml.element import dav_namespace
-from txdav.xml.element import twisted_dav_namespace, twisted_private_namespace
-from txdav.xml.element import registerElement, lookupElement
 
 
 log = Logger()
@@ -217,7 +218,7 @@
         def defer():
             if type(property) is tuple:
                 qname = property
-                sname = "{%s}%s" % property
+                sname = encodeXMLName(*property)
             else:
                 qname = property.qname()
                 sname = property.sname()
@@ -416,7 +417,7 @@
         def defer():
             if type(property) is tuple:
                 qname = property
-                sname = "{%s}%s" % property
+                sname = encodeXMLName(*property)
             else:
                 qname = property.qname()
                 sname = property.sname()
@@ -1873,9 +1874,9 @@
                     return None
 
                 if not isinstance(principal, element.Principal):
-                    log.err("Non-principal value in property {%s}%s "
+                    log.err("Non-principal value in property %s "
                             "referenced by property principal."
-                            % (namespace, name))
+                            % (encodeXMLName(namespace, name),))
                     return None
 
                 if len(principal.children) != 1:

Modified: CalendarServer/trunk/twext/web2/dav/test/test_xattrprops.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/test/test_xattrprops.py	2012-07-20 22:45:01 UTC (rev 9471)
+++ CalendarServer/trunk/twext/web2/dav/test/test_xattrprops.py	2012-07-20 22:46:08 UTC (rev 9472)
@@ -132,7 +132,7 @@
         attribute = (
             self.propertyStore.deadPropertyXattrPrefix +
             (uid if uid is not None else "") +
-            "{%s}%s" % element.qname())
+            element.sname())
         self.attrs[attribute] = value
 
 
@@ -141,7 +141,7 @@
         attribute = (
             self.propertyStore.deadPropertyXattrPrefix +
             (uid if uid is not None else "") +
-            "{%s}%s" % element.qname())
+            element.sname())
         return self.attrs[attribute]
 
 

Modified: CalendarServer/trunk/twext/web2/dav/test/util.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/test/util.py	2012-07-20 22:45:01 UTC (rev 9471)
+++ CalendarServer/trunk/twext/web2/dav/test/util.py	2012-07-20 22:46:08 UTC (rev 9472)
@@ -38,6 +38,7 @@
 from twext.web2.dav.static import DAVFile
 from twext.web2.dav.util import joinURL
 from txdav.xml import element
+from txdav.xml.base import encodeXMLName
 
 log = Logger()
 
@@ -57,7 +58,7 @@
         except KeyError:
             raise HTTPError(StatusResponse(
                 responsecode.NOT_FOUND,
-                "No such property: {%s}%s" % qname
+                "No such property: %s" % (encodeXMLName(*qname),)
             ))
 
         doc = element.WebDAVDocument.fromString(property)

Modified: CalendarServer/trunk/twext/web2/dav/xattrprops.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/xattrprops.py	2012-07-20 22:45:01 UTC (rev 9471)
+++ CalendarServer/trunk/twext/web2/dav/xattrprops.py	2012-07-20 22:46:08 UTC (rev 9472)
@@ -50,10 +50,11 @@
 from twisted.python.util import untilConcludes
 from twisted.python.failure import Failure
 from twisted.python.log import err
+from txdav.xml.base import encodeXMLName
+from txdav.xml.parser import WebDAVDocument
 from twext.web2 import responsecode
 from twext.web2.http import HTTPError, StatusResponse
 from twext.web2.dav.http import statusForFailure
-from txdav.xml.parser import WebDAVDocument
 
 # RFC 2518 Section 12.13.1 says that removal of non-existing property
 # is not an error.  python-xattr on Linux fails with ENODATA in this
@@ -86,7 +87,7 @@
         deadPropertyXattrPrefix = "user."
 
     def _encode(clazz, name, uid=None):
-        result = urllib.quote("{%s}%s" % name, safe='{}:')
+        result = urllib.quote(encodeXMLName(*name), safe='{}:')
         if uid:
             result = uid + result
         r = clazz.deadPropertyXattrPrefix + result
@@ -138,17 +139,20 @@
             data = self.attrs.get(self._encode(qname, uid))
         except KeyError:
             raise HTTPError(StatusResponse(
-                    responsecode.NOT_FOUND,
-                    "No such property: {%s}%s" % qname))
+                responsecode.NOT_FOUND,
+                "No such property: %s" % (encodeXMLName(*qname),)
+            ))
         except IOError, e:
             if e.errno in _ATTR_MISSING or e.errno == errno.ENOENT:
                 raise HTTPError(StatusResponse(
-                        responsecode.NOT_FOUND,
-                        "No such property: {%s}%s" % qname))
+                    responsecode.NOT_FOUND,
+                    "No such property: %s" % (encodeXMLName(*qname),)
+                ))
             else:
                 raise HTTPError(StatusResponse(
-                        statusForFailure(Failure()),
-                        "Unable to read property: {%s}%s" % qname))
+                    statusForFailure(Failure()),
+                    "Unable to read property: %s" % (encodeXMLName(*qname),)
+                ))
 
         #
         # Unserialize XML data from an xattr.  The storage format has changed
@@ -175,8 +179,8 @@
             try:
                 doc = unpickle(data)
             except UnpicklingError:
-                format = "Invalid property value stored on server: {%s}%s %s"
-                msg = format % (qname[0], qname[1], data)
+                format = "Invalid property value stored on server: %s %s"
+                msg = format % (encodeXMLName(*qname), data)
                 err(None, msg)
                 raise HTTPError(
                     StatusResponse(responsecode.INTERNAL_SERVER_ERROR, msg))
@@ -225,10 +229,10 @@
                 if e.errno not in _ATTR_MISSING:
                     raise
         except:
-            raise HTTPError(
-                StatusResponse(
-                    statusForFailure(Failure()),
-                    "Unable to delete property: " + key))
+            raise HTTPError(StatusResponse(
+                statusForFailure(Failure()),
+                "Unable to delete property: %s", (key,)
+            ))
 
 
     def contains(self, qname, uid=None):
@@ -252,10 +256,10 @@
         except IOError, e:
             if e.errno in _ATTR_MISSING or e.errno == errno.ENOENT:
                 return False
-            raise HTTPError(
-                StatusResponse(
-                    statusForFailure(Failure()),
-                    "Unable to read property: " + key))
+            raise HTTPError(StatusResponse(
+                statusForFailure(Failure()),
+                "Unable to read property: %s" % (key,)
+            ))
         else:
             return True
 
@@ -277,10 +281,10 @@
         except IOError, e:
             if e.errno == errno.ENOENT:
                 return []
-            raise HTTPError(
-                StatusResponse(
-                    statusForFailure(Failure()),
-                    "Unable to list properties: " + self.resource.fp.path))
+            raise HTTPError(StatusResponse(
+                statusForFailure(Failure()),
+                "Unable to list properties: %s", (self.resource.fp.path,)
+            ))
         else:
             results = [
                 self._decode(name)

Modified: CalendarServer/trunk/twistedcaldav/extensions.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/extensions.py	2012-07-20 22:45:01 UTC (rev 9471)
+++ CalendarServer/trunk/twistedcaldav/extensions.py	2012-07-20 22:46:08 UTC (rev 9472)
@@ -46,6 +46,7 @@
 from twext.web2.stream import FileStream
 from twext.web2.static import MetaDataMixin, StaticRenderMixin
 from txdav.xml import element
+from txdav.xml.base import encodeXMLName
 from txdav.xml.element import dav_namespace
 from twext.web2.dav.http import MultiStatusResponse
 from twext.web2.dav.static import DAVFile as SuperDAVFile
@@ -339,8 +340,8 @@
             whenAllProperties = gatherResults([
                 maybeDeferred(self.resource.readProperty, qn, request)
                 .addCallback(lambda p, iqn=qn: (p.sname(), p.toxml())
-                             if p is not None else ("{%s}%s" % iqn, None) )
-                .addErrback(gotError, "{%s}%s" % qn)
+                             if p is not None else (encodeXMLName(*iqn), None) )
+                .addErrback(gotError, encodeXMLName(*qn))
                 for qn in sorted(qnames)
             ])
 
@@ -771,7 +772,7 @@
         HTTPError.__init__(self,
             StatusResponse(
                 responsecode.NOT_FOUND,
-                "No such property: {%s}%s" % qname
+                "No such property: %s" % encodeXMLName(*qname)
             )
         )
 

Modified: CalendarServer/trunk/twistedcaldav/memcacheprops.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/memcacheprops.py	2012-07-20 22:45:01 UTC (rev 9471)
+++ CalendarServer/trunk/twistedcaldav/memcacheprops.py	2012-07-20 22:46:08 UTC (rev 9472)
@@ -36,6 +36,7 @@
 from twext.python.memcacheclient import ClientFactory
 from twext.python.memcacheclient import MemcacheError, TokenMismatchError
 from twext.python.filepath import CachingFilePath as FilePath
+from txdav.xml.base import encodeXMLName
 from twext.web2 import responsecode
 from twext.web2.http import HTTPError, StatusResponse
 
@@ -293,11 +294,10 @@
             else:
                 log.error("memcacheprops setProperty had too many failures")
                 delattr(self, "_propertyCache")
-                raise MemcacheError("Unable to %s property %s{%s}%s on %s" % (
+                raise MemcacheError("Unable to %s property %s%s on %s" % (
                     "delete" if delete else "set",
                     uid if uid else "",
-                    qname[0],
-                    qname[1],
+                    encodeXMLName(*qname),
                     child
                 ))
 
@@ -345,7 +345,7 @@
                 else:
                     raise HTTPError(StatusResponse(
                         responsecode.NOT_FOUND,
-                        "No such property: %s{%s}%s" % (uid if uid else "", qname[0], qname[1],)
+                        "No such property: %s%s" % (uid if uid else "", encodeXMLName(*qname))
                     ))
 
             self.log_debug("Read for %s%s on %s" % (

Modified: CalendarServer/trunk/twistedcaldav/method/report.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/report.py	2012-07-20 22:45:01 UTC (rev 9471)
+++ CalendarServer/trunk/twistedcaldav/method/report.py	2012-07-20 22:46:08 UTC (rev 9472)
@@ -33,6 +33,7 @@
 from twext.web2.http import HTTPError, StatusResponse
 from twext.web2.dav.util import davXMLFromStream
 from txdav.xml import element as davxml
+from txdav.xml.base import encodeXMLName
 from txdav.xml.element import lookupElement
 
 from twext.python.log import Logger
@@ -78,7 +79,7 @@
         elif namespace == caldavxml.caldav_namespace:
             request.submethod = "CalDAV:" + name
         else:
-            request.submethod = "{%s}%s" % (namespace, name)
+            request.submethod = encodeXMLName(namespace, name)
     else:
         request.submethod = name
 
@@ -114,8 +115,8 @@
         #
         # Requested report is not supported.
         #
-        log.err("Unsupported REPORT {%s}%s for resource %s (no method %s)"
-                % (namespace, name, self, method_name))
+        log.err("Unsupported REPORT %s for resource %s (no method %s)"
+                % (encodeXMLName(namespace, name), self, method_name))
 
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,

Modified: CalendarServer/trunk/twistedcaldav/storebridge.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/storebridge.py	2012-07-20 22:45:01 UTC (rev 9471)
+++ CalendarServer/trunk/twistedcaldav/storebridge.py	2012-07-20 22:46:08 UTC (rev 9472)
@@ -15,27 +15,38 @@
 # limitations under the License.
 ##
 
+import time
+import hashlib
+from urlparse import urlsplit
+
+from twisted.python.hashlib import md5
+from twisted.python.log import err as logDefaultException
+from twisted.python.util import FancyEqMixin
+from twisted.internet.defer import succeed, inlineCallbacks, returnValue, maybeDeferred
+from twisted.internet.protocol import Protocol
+
 from twext.python.log import Logger
+
+from txdav.xml import element as davxml
+from txdav.xml.base import dav_namespace, WebDAVUnknownElement, encodeXMLName
+from txdav.base.propertystore.base import PropertyName
+from txdav.caldav.icalendarstore import QuotaExceeded
+from txdav.common.icommondatastore import NoSuchObjectResourceError
+from txdav.idav import PropertyChangeNotAllowedError
+
 from twext.web2 import responsecode
-from txdav.xml import element as davxml
-from txdav.xml.base import dav_namespace, WebDAVUnknownElement
+from twext.web2.stream import ProducerStream, readStream, MemoryStream
+from twext.web2.http import HTTPError, StatusResponse, Response
+from twext.web2.http_headers import ETag, MimeType
 from twext.web2.dav.http import ErrorResponse, ResponseQueue, MultiStatusResponse
 from twext.web2.dav.noneprops import NonePropertyStore
 from twext.web2.dav.resource import TwistedACLInheritable, AccessDeniedError
 from twext.web2.dav.util import parentForURL, allDataFromStream, joinURL, davXMLFromStream
-from twext.web2.http import HTTPError, StatusResponse, Response
-from twext.web2.http_headers import ETag, MimeType
 from twext.web2.responsecode import (
     FORBIDDEN, NO_CONTENT, NOT_FOUND, CREATED, CONFLICT, PRECONDITION_FAILED,
     BAD_REQUEST, OK, INSUFFICIENT_STORAGE_SPACE
 )
 
-from twext.web2.stream import ProducerStream, readStream, MemoryStream
-from twisted.internet.defer import succeed, inlineCallbacks, returnValue, maybeDeferred
-from twisted.internet.protocol import Protocol
-from twisted.python.hashlib import md5
-from twisted.python.log import err as logDefaultException
-from twisted.python.util import FancyEqMixin
 from twistedcaldav import customxml, carddavxml, caldavxml
 from twistedcaldav.cache import CacheStoreNotifier, ResponseCacheMixin,\
     DisabledCacheNotifier
@@ -56,15 +67,6 @@
 from twistedcaldav.scheduling.implicit import ImplicitScheduler
 from twistedcaldav.vcard import Component as VCard, InvalidVCardDataError
 
-from txdav.base.propertystore.base import PropertyName
-from txdav.caldav.icalendarstore import QuotaExceeded
-from txdav.common.icommondatastore import NoSuchObjectResourceError
-from txdav.idav import PropertyChangeNotAllowedError
-
-import time
-import hashlib
-from urlparse import urlsplit
-
 """
 Wrappers to translate between the APIs in L{txdav.caldav.icalendarstore} and
 L{txdav.carddav.iaddressbookstore} and those in L{twistedcaldav}.
@@ -101,7 +103,7 @@
         except KeyError:
             raise HTTPError(StatusResponse(
                 NOT_FOUND,
-                "No such property: {%s}%s" % qname
+                "No such property: %s" % (encodeXMLName(*qname),)
             ))
 
 
@@ -111,7 +113,7 @@
         except PropertyChangeNotAllowedError:
             raise HTTPError(StatusResponse(
                 FORBIDDEN,
-                "Property cannot be changed: {%s}%s" % property.qname(),
+                "Property cannot be changed: %s" % (property.sname(),)
             ))
             
 

Modified: CalendarServer/trunk/twistedcaldav/test/test_memcacheprops.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_memcacheprops.py	2012-07-20 22:45:01 UTC (rev 9471)
+++ CalendarServer/trunk/twistedcaldav/test/test_memcacheprops.py	2012-07-20 22:46:08 UTC (rev 9472)
@@ -26,6 +26,7 @@
 
 import os
 
+from twext.xml.base import encodeXMLName
 from twext.web2.http import HTTPError
 
 from twistedcaldav.memcacheprops import MemcachePropertyCollection
@@ -33,7 +34,6 @@
 from twistedcaldav.test.util import TestCase
 
 
-
 class StubCollection(object):
 
     def __init__(self, path, childNames):
@@ -91,9 +91,8 @@
     def qname(self):
         return self.ns, self.name
 
-
     def __repr__(self):
-        return "{%s}%s = %s" % (self.ns, self.name, self.value)
+        return "%s = %s" % (encodeXMLName(self.ns, self.name), self.value)
 
 
 class MemcachePropertyCollectionTestCase(TestCase):

Modified: CalendarServer/trunk/twistedcaldav/test/test_validation.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_validation.py	2012-07-20 22:45:01 UTC (rev 9471)
+++ CalendarServer/trunk/twistedcaldav/test/test_validation.py	2012-07-20 22:46:08 UTC (rev 9472)
@@ -118,10 +118,7 @@
             element = XML(err.response.stream.mem)[0]
             self.assertEquals(
                 element.tag,
-                "{%s}%s" % (
-                    MaxAttendeesPerInstance.namespace,
-                    MaxAttendeesPerInstance.name
-                )
+                MaxAttendeesPerInstance.sname()
             )
             self.assertEquals(int(element.text), config.MaxAttendeesPerInstance)
         else:
@@ -165,10 +162,7 @@
             element = XML(err.response.stream.mem)[0]
             self.assertEquals(
                 element.tag,
-                "{%s}%s" % (
-                    MaxAttendeesPerInstance.namespace,
-                    MaxAttendeesPerInstance.name
-                )
+                MaxAttendeesPerInstance.sname()
             )
             self.assertEquals(int(element.text), config.MaxAttendeesPerInstance)
         else:

Modified: CalendarServer/trunk/txdav/base/propertystore/base.py
===================================================================
--- CalendarServer/trunk/txdav/base/propertystore/base.py	2012-07-20 22:45:01 UTC (rev 9471)
+++ CalendarServer/trunk/txdav/base/propertystore/base.py	2012-07-20 22:46:08 UTC (rev 9472)
@@ -25,6 +25,7 @@
 
 from twext.python.log import LoggingMixIn
 from txdav.xml import element as davxml
+from txdav.xml.base import encodeXMLName
 from twext.web2.dav.resource import TwistedGETContentMD5,\
     TwistedQuotaRootProperty
 
@@ -89,7 +90,7 @@
         )
 
     def toString(self):
-        return "{%s}%s" % (self.namespace, self.name)
+        return encodeXMLName(self.namespace, self.name)
 
 
 class AbstractPropertyStore(LoggingMixIn, DictMixin):

Modified: CalendarServer/trunk/txdav/base/propertystore/xattr.py
===================================================================
--- CalendarServer/trunk/txdav/base/propertystore/xattr.py	2012-07-20 22:45:01 UTC (rev 9471)
+++ CalendarServer/trunk/txdav/base/propertystore/xattr.py	2012-07-20 22:46:08 UTC (rev 9472)
@@ -34,6 +34,7 @@
 
 from twisted.python.reflect import namedAny
 
+from txdav.xml.base import encodeXMLName
 from txdav.xml.parser import WebDAVDocument
 from txdav.base.propertystore.base import AbstractPropertyStore, PropertyName,\
         validKey
@@ -116,7 +117,7 @@
                                                     qname.namespace)
         else:
             namespace = qname.namespace
-        result = urllib.quote("{%s}%s" % (namespace, qname.name), safe="{}:")
+        result = urllib.quote(encodeXMLName(namespace, qname.name), safe="{}:")
         if uid and uid != self._defaultUser:
             result = uid + result
         r = self.deadPropertyXattrPrefix + result
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120720/a72f9e55/attachment-0001.html>


More information about the calendarserver-changes mailing list