in src/caldavtest.py [0:0]
def dorequest(self, req, details=False, doverify=True, forceverify=False, stats=None, etags=None, label="", count=1):
req.count = count
if isinstance(req, pause):
# Useful for pausing at a particular point
print "Paused"
sys.stdin.readline()
return True, "", None, None
if len(req.missingFeatures()) != 0:
return True, "", None, None
if len(req.excludedFeatures()) != 0:
return True, "", None, None
# Special check for DELETEALL
if req.method == "DELETEALL":
for ruri in req.ruris:
collection = (ruri, req.user, req.pswd)
hrefs = self.dofindall(req, collection, label="%s | %s" % (label, "DELETEALL"))
if not self.dodeleteall(req, hrefs, label="%s | %s" % (label, "DELETEALL")):
return False, "DELETEALL failed for: {r}".format(r=ruri), None, None
return True, "", None, None
# Special for delay
elif req.method == "DELAY":
# self.ruri contains a numeric delay in seconds
delay = int(req.ruri)
starttime = time.time()
while (time.time() < starttime + delay):
pass
return True, "", None, None
# Special for GETNEW
elif req.method == "GETNEW":
collection = (req.ruri, req.user, req.pswd)
self.grabbedlocation = self.dofindnew(req, collection, label=label)
if req.graburi:
self.manager.server_info.addextrasubs({req.graburi: self.grabbedlocation})
req.method = "GET"
req.ruri = "$"
# Special for FINDNEW
elif req.method == "FINDNEW":
collection = (req.ruri, req.user, req.pswd)
self.grabbedlocation = self.dofindnew(req, collection, label=label)
if req.graburi:
self.manager.server_info.addextrasubs({req.graburi: self.grabbedlocation})
return True, "", None, None
# Special for GETOTHER
elif req.method == "GETOTHER":
collection = (req.ruri, req.user, req.pswd)
self.grabbedlocation = self.dofindnew(req, collection, label=label, other=True)
if req.graburi:
self.manager.server_info.addextrasubs({req.graburi: self.grabbedlocation})
req.method = "GET"
req.ruri = "$"
# Special for GETCONTAINS
elif req.method.startswith("GETCONTAINS"):
match = req.method[12:]
collection = (req.ruri, req.user, req.pswd)
self.grabbedlocation = self.dofindcontains(req, collection, match, label=label)
if not self.grabbedlocation:
return False, "No matching resource", None, None
if req.graburi:
self.manager.server_info.addextrasubs({req.graburi: self.grabbedlocation})
req.method = "GET"
req.ruri = "$"
# Special check for WAITCOUNT
elif req.method.startswith("WAITCOUNT"):
count = int(req.method[10:])
for ruri in req.ruris:
collection = (ruri, req.user, req.pswd)
waitresult, waitdetails = self.dowaitcount(req, collection, count, label=label)
if not waitresult:
return False, "Count did not change: {w}".format(w=waitdetails), None, None
else:
return True, "", None, None
# Special check for WAITDELETEALL
elif req.method.startswith("WAITDELETEALL"):
count = int(req.method[len("WAITDELETEALL"):])
for ruri in req.ruris:
collection = (ruri, req.user, req.pswd)
waitresult, waitdetails = self.dowaitcount(req, collection, count, label=label)
if waitresult:
hrefs = self.dofindall(req, collection, label="%s | %s" % (label, "DELETEALL"))
self.dodeleteall(req, hrefs, label="%s | %s" % (label, "DELETEALL"))
else:
return False, "Count did not change: {w}".format(w=waitdetails), None, None
else:
return True, "", None, None
result = True
resulttxt = ""
response = None
respdata = None
method = req.method
uri = req.getURI(self.manager.server_info)
if (uri == "$"):
uri = self.grabbedlocation
headers = req.getHeaders(self.manager.server_info)
data = req.getData()
# Cache delayed delete
if req.end_delete:
self.end_deletes.append((uri, req,))
if details:
resulttxt += " %s: %s\n" % (method, uri)
# Special for GETCHANGED
if req.method == "GETCHANGED":
if not self.dowaitchanged(
req,
uri, etags[uri], req.user, req.pswd,
label=label
):
return False, "Resource did not change", None, None
method = "GET"
# Start request timer if required
if stats:
stats.startTimer()
# Do the http request
http = SmartHTTPConnection(
req.host,
req.port,
self.manager.server_info.ssl,
afunix=req.afunix,
cert=os.path.join(self.manager.server_info.certdir, req.cert) if req.cert else None
)
if 'User-Agent' not in headers and label is not None:
headers['User-Agent'] = label.encode("utf-8")
try:
puri = list(urlparse.urlparse(uri))
if req.ruri_quote:
puri[2] = urllib.quote(puri[2])
quri = urlparse.urlunparse(puri)
http.request(method, quri, data, headers)
response = http.getresponse()
respdata = None
respdata = response.read()
finally:
http.close()
# Stop request timer before verification
if stats:
stats.endTimer()
if doverify and (respdata is not None):
result, txt = self.verifyrequest(req, uri, response, respdata)
resulttxt += txt
elif forceverify:
result = (response.status / 100 == 2)
if not result:
resulttxt += "Status Code Error: %d" % response.status
if req.print_request or (self.manager.print_request_response_on_error and not result and not req.wait_for_success):
requesttxt = "\n-------BEGIN:REQUEST-------\n"
requesttxt += http.requestData
requesttxt += "\n--------END:REQUEST--------\n"
self.manager.message("protocol", requesttxt)
if req.print_response or (self.manager.print_request_response_on_error and not result and not req.wait_for_success):
responsetxt = "\n-------BEGIN:RESPONSE-------\n"
responsetxt += "%s %s %s\n" % (getVersionStringFromResponse(response), response.status, response.reason,)
responsetxt += str(response.msg) + "\n" + respdata
responsetxt += "\n--------END:RESPONSE--------\n"
self.manager.message("protocol", responsetxt)
if etags is not None and req.method == "GET":
hdrs = response.msg.getheaders("Etag")
if hdrs:
etags[uri] = hdrs[0].encode("utf-8")
if req.graburi:
self.manager.server_info.addextrasubs({req.graburi: self.grabbedlocation})
if req.grabcount:
ctr = None
if result and (response is not None) and (response.status == 207) and (respdata is not None):
tree = ElementTree(file=StringIO(respdata))
ctr = len(tree.findall("{DAV:}response")) - 1
if ctr is None or ctr == -1:
result = False
resulttxt += "\nCould not count resources in response\n"
else:
self.manager.server_info.addextrasubs({req.grabcount: str(ctr)})
if req.grabheader:
for hdrname, variable in req.grabheader:
hdrs = response.msg.getheaders(hdrname)
if hdrs:
self.manager.server_info.addextrasubs({variable: hdrs[0].encode("utf-8")})
else:
result = False
resulttxt += "\nHeader %s was not extracted from response\n" % (hdrname,)
if req.grabproperty:
if response.status == 207:
for propname, variable in req.grabproperty:
# grab the property here
propvalue = self.extractProperty(propname, respdata)
if propvalue is None:
result = False
resulttxt += "\nProperty %s was not extracted from multistatus response\n" % (propname,)
else:
self.manager.server_info.addextrasubs({variable: propvalue.encode("utf-8")})
if req.grabelement:
for item in req.grabelement:
if len(item) == 2:
elementpath, variables = item
parent = None
else:
elementpath, parent, variables = item
parent = self.manager.server_info.extrasubs(parent)
# grab the property here
elementvalues = self.extractElements(elementpath, parent, respdata)
if elementvalues is None:
result = False
resulttxt += "\nElement %s was not extracted from response\n" % (elementpath,)
elif len(variables) != len(elementvalues):
result = False
resulttxt += "\n%d found but expecting %d for element %s from response\n" % (len(elementvalues), len(variables), elementpath,)
else:
for variable, elementvalue in zip(variables, elementvalues):
self.manager.server_info.addextrasubs({variable: elementvalue.encode("utf-8") if elementvalue else ""})
if req.grabjson:
for pointer, variables in req.grabjson:
# grab the JSON value here
pointervalues = self.extractPointer(pointer, respdata)
if pointervalues is None:
result = False
resulttxt += "\Pointer %s was not extracted from response\n" % (pointer,)
elif len(variables) != len(pointervalues):
result = False
resulttxt += "\n%d found but expecting %d for pointer %s from response\n" % (len(pointervalues), len(variables), pointer,)
else:
for variable, pointervalue in zip(variables, pointervalues):
self.manager.server_info.addextrasubs({variable: pointervalue.encode("utf-8") if pointervalue else ""})
if req.grabcalprop:
for propname, variable in req.grabcalprop:
# grab the property here
propname = self.manager.server_info.subs(propname)
propname = self.manager.server_info.extrasubs(propname)
propvalue = self.extractCalProperty(propname, respdata)
if propvalue is None:
result = False
resulttxt += "\nCalendar property %s was not extracted from response\n" % (propname,)
else:
self.manager.server_info.addextrasubs({variable: propvalue.encode("utf-8")})
if req.grabcalparam:
for paramname, variable in req.grabcalparam:
# grab the property here
paramname = self.manager.server_info.subs(paramname)
paramname = self.manager.server_info.extrasubs(paramname)
paramvalue = self.extractCalParameter(paramname, respdata)
if paramvalue is None:
result = False
resulttxt += "\nCalendar Parameter %s was not extracted from response\n" % (paramname,)
else:
self.manager.server_info.addextrasubs({variable: paramvalue.encode("utf-8")})
return result, resulttxt, response, respdata