Report item modification to users in various cases.

This commit is contained in:
Guillaume Ayoub 2010-04-13 00:25:01 +02:00
parent f479b4ba67
commit d4bdc36550
2 changed files with 8 additions and 3 deletions

1
NEWS
View File

@ -17,6 +17,7 @@
* Twisted dependency removed
* Python 3 support
* Real URLs for PUT and DELETE
* Concurrent modification reported to users
* Many bugs fixed by Roger Wenham

View File

@ -188,15 +188,19 @@ class CalendarHTTPHandler(server.BaseHTTPRequestHandler):
def do_PUT(self):
"""Manage PUT request."""
item = self._calendar.get_item(xmlutils.name_from_path(self.path))
if not item or self.headers.get("If-Match", item.etag) == item.etag:
# No item, no ETag precondition or precondition verified, put item
if (not item and not self.headers.get("If-Match")) or \
(item and self.headers.get("If-Match", item.etag) == item.etag):
# PUT allowed in 3 cases
# Case 1: No item and no ETag precondition: Add new item
# Case 2: Item and ETag precondition verified: Modify item
# Case 3: Item and no Etag precondition: Force modifying item
ical_request = self._decode(
self.rfile.read(int(self.headers["Content-Length"])))
xmlutils.put(self.path, ical_request, self._calendar)
self.send_response(client.CREATED)
else:
# ETag precondition not verified, do not put item
# PUT rejected in all other cases
self.send_response(client.PRECONDITION_FAILED)
@check_rights