Skip to content

Commit d531503

Browse files
committed
Retry PUT 409 errors - delete and re-create event
Attempt to address #963 I would appreciate a code review here - there might be a more elegant way to address this problem, but it works for my (very limited) use case.
1 parent 68c5968 commit d531503

File tree

1 file changed

+20
-2
lines changed

1 file changed

+20
-2
lines changed

vdirsyncer/storage/dav.py

+20-2
Original file line numberDiff line numberDiff line change
@@ -587,12 +587,30 @@ async def _put(self, href, item, etag):
587587
async def update(self, href, item, etag):
588588
if etag is None:
589589
raise ValueError("etag must be given and must not be None.")
590-
href, etag = await self._put(self._normalize_href(href), item, etag)
590+
try:
591+
href, etag = await self._put(self._normalize_href(href), item, etag)
592+
except aiohttp.ClientResponseError as e:
593+
if e.status == 409:
594+
dav_logger.debug("Conflict, will delete old event and recreate it.")
595+
await self.delete(self._normalize_href(href), None)
596+
dav_logger.debug("Now trying again")
597+
href, etag = await self._put(self._normalize_href(href), item, None)
598+
else:
599+
raise e
591600
return etag
592601

593602
async def upload(self, item: Item):
594603
href = self._get_href(item)
595-
rv = await self._put(href, item, None)
604+
try:
605+
rv = await self._put(href, item, None)
606+
except aiohttp.ClientResponseError as e:
607+
if e.status == 409:
608+
dav_logger.debug("Conflict, will delete old event and recreate it.")
609+
await self.delete(href, None)
610+
dav_logger.debug("Now trying again")
611+
rv = await self._put(href, item, None)
612+
else:
613+
raise e
596614
return rv
597615

598616
async def delete(self, href, etag):

0 commit comments

Comments
 (0)