in src/caldavtest.py [0:0]
def dofindnew(self, original_request, collection, label="", other=False):
hresult = ""
uri = collection[0]
if other:
uri = self.manager.server_info.extrasubs(uri)
skip = uri
uri = "/".join(uri.split("/")[:-1]) + "/"
else:
skip = None
possible_matches = set()
req = request(self.manager)
req.method = "PROPFIND"
req.host = original_request.host
req.port = original_request.port
req.ruris.append(uri)
req.ruri = uri
req.headers["Depth"] = "1"
if len(collection[1]):
req.user = collection[1]
if len(collection[2]):
req.pswd = collection[2]
req.data = data(self.manager)
req.data.value = """<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:">
<D:prop>
<D:getetag/>
<D:getlastmodified/>
</D:prop>
</D:propfind>
"""
req.data.content_type = "text/xml"
result, _ignore_resulttxt, response, respdata = self.dorequest(req, False, False, label="%s | %s" % (label, "FINDNEW"))
if result and (response is not None) and (response.status == 207) and (respdata is not None):
try:
tree = ElementTree(file=StringIO(respdata))
except Exception:
return hresult
latest = 0
request_uri = req.getURI(self.manager.server_info)
for response in tree.findall("{DAV:}response"):
# Get href for this response
href = response.findall("{DAV:}href")
if len(href) != 1:
return False, " Wrong number of DAV:href elements\n"
href = href[0].text
if href != request_uri and (not other or href != skip):
# Get all property status
propstatus = response.findall("{DAV:}propstat")
for props in propstatus:
# Determine status for this propstat
status = props.findall("{DAV:}status")
if len(status) == 1:
statustxt = status[0].text
status = False
if statustxt.startswith("HTTP/1.1 ") and (len(statustxt) >= 10):
status = (statustxt[9] == "2")
else:
status = False
if status:
# Get properties for this propstat
prop = props.findall("{DAV:}prop")
for el in prop:
# Get properties for this propstat
glm = el.findall("{DAV:}getlastmodified")
if len(glm) != 1:
continue
value = glm[0].text
value = rfc822.parsedate(value)
value = time.mktime(value)
if value > latest:
possible_matches.clear()
possible_matches.add(href)
latest = value
elif value == latest:
possible_matches.add(href)
elif not hresult:
possible_matches.add(href)
if len(possible_matches) == 1:
hresult = possible_matches.pop()
elif len(possible_matches) > 1:
not_seen_before = possible_matches - self.previously_found
if len(not_seen_before) == 1:
hresult = not_seen_before.pop()
if hresult:
self.previously_found.add(hresult)
return hresult