mirror of
https://github.com/samsonjs/vdirsyncer.git
synced 2026-04-27 14:57:41 +00:00
Simplify error handling
This commit is contained in:
parent
c010b90cc3
commit
d46795bdb7
4 changed files with 21 additions and 27 deletions
|
|
@ -197,7 +197,6 @@ class TestCaldavStorage(DavStorageTests):
|
||||||
|
|
||||||
def request(session, method, url, data=None, headers=None, auth=None,
|
def request(session, method, url, data=None, headers=None, auth=None,
|
||||||
verify=None):
|
verify=None):
|
||||||
assert method == 'OPTIONS'
|
|
||||||
assert url == args['url']
|
assert url == args['url']
|
||||||
calls.append(None)
|
calls.append(None)
|
||||||
|
|
||||||
|
|
@ -209,7 +208,8 @@ class TestCaldavStorage(DavStorageTests):
|
||||||
monkeypatch.setattr('requests.sessions.Session.request', request)
|
monkeypatch.setattr('requests.sessions.Session.request', request)
|
||||||
|
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
self.storage_class(**args)
|
s = self.storage_class(**args)
|
||||||
|
list(s.list())
|
||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -76,17 +76,6 @@ class DavStorage(Storage):
|
||||||
self.parsed_url = utils.urlparse.urlparse(self.url)
|
self.parsed_url = utils.urlparse.urlparse(self.url)
|
||||||
self.collection = collection
|
self.collection = collection
|
||||||
|
|
||||||
headers = self._default_headers()
|
|
||||||
headers['Depth'] = 1
|
|
||||||
response = self._request(
|
|
||||||
'OPTIONS',
|
|
||||||
'',
|
|
||||||
headers=headers
|
|
||||||
)
|
|
||||||
response.raise_for_status()
|
|
||||||
if self.dav_header not in response.headers.get('DAV', ''):
|
|
||||||
raise ValueError('URL is not a collection')
|
|
||||||
|
|
||||||
def _default_headers(self):
|
def _default_headers(self):
|
||||||
return {
|
return {
|
||||||
'User-Agent': self.useragent,
|
'User-Agent': self.useragent,
|
||||||
|
|
@ -131,17 +120,21 @@ class DavStorage(Storage):
|
||||||
assert path.startswith(self.parsed_url.path)
|
assert path.startswith(self.parsed_url.path)
|
||||||
if self._session is None:
|
if self._session is None:
|
||||||
self._session = requests.session()
|
self._session = requests.session()
|
||||||
|
self._check_collection()
|
||||||
url = self.parsed_url.scheme + '://' + self.parsed_url.netloc + path
|
url = self.parsed_url.scheme + '://' + self.parsed_url.netloc + path
|
||||||
return utils.request(method, url, data=data, headers=headers,
|
return utils.request(method, url, data=data, headers=headers,
|
||||||
session=self._session, **self._settings)
|
session=self._session, **self._settings)
|
||||||
|
|
||||||
@staticmethod
|
def _check_collection(self):
|
||||||
def _check_response(response):
|
headers = self._default_headers()
|
||||||
if response.status_code == 412:
|
headers['Depth'] = 1
|
||||||
raise exceptions.PreconditionFailed(response.reason)
|
response = self._request(
|
||||||
if response.status_code == 404:
|
'OPTIONS',
|
||||||
raise exceptions.NotFoundError(response.reason)
|
'',
|
||||||
response.raise_for_status()
|
headers=headers
|
||||||
|
)
|
||||||
|
if self.dav_header not in response.headers.get('DAV', ''):
|
||||||
|
raise ValueError('URL is not a collection')
|
||||||
|
|
||||||
def get(self, href):
|
def get(self, href):
|
||||||
((actual_href, item, etag),) = self.get_multi([href])
|
((actual_href, item, etag),) = self.get_multi([href])
|
||||||
|
|
@ -163,7 +156,6 @@ class DavStorage(Storage):
|
||||||
data=data,
|
data=data,
|
||||||
headers=self._default_headers()
|
headers=self._default_headers()
|
||||||
)
|
)
|
||||||
self._check_response(response)
|
|
||||||
root = etree.XML(response.content) # etree only can handle bytes
|
root = etree.XML(response.content) # etree only can handle bytes
|
||||||
rv = []
|
rv = []
|
||||||
hrefs_left = set(hrefs)
|
hrefs_left = set(hrefs)
|
||||||
|
|
@ -207,7 +199,6 @@ class DavStorage(Storage):
|
||||||
data=item.raw.encode('utf-8'),
|
data=item.raw.encode('utf-8'),
|
||||||
headers=headers
|
headers=headers
|
||||||
)
|
)
|
||||||
self._check_response(response)
|
|
||||||
etag = response.headers.get('etag', None)
|
etag = response.headers.get('etag', None)
|
||||||
if not etag:
|
if not etag:
|
||||||
item2, etag = self.get(href)
|
item2, etag = self.get(href)
|
||||||
|
|
@ -233,12 +224,11 @@ class DavStorage(Storage):
|
||||||
'If-Match': etag
|
'If-Match': etag
|
||||||
})
|
})
|
||||||
|
|
||||||
response = self._request(
|
self._request(
|
||||||
'DELETE',
|
'DELETE',
|
||||||
href,
|
href,
|
||||||
headers=headers
|
headers=headers
|
||||||
)
|
)
|
||||||
self._check_response(response)
|
|
||||||
|
|
||||||
def _list(self, xml):
|
def _list(self, xml):
|
||||||
headers = self._default_headers()
|
headers = self._default_headers()
|
||||||
|
|
@ -261,7 +251,6 @@ class DavStorage(Storage):
|
||||||
data=xml,
|
data=xml,
|
||||||
headers=headers
|
headers=headers
|
||||||
)
|
)
|
||||||
response.raise_for_status()
|
|
||||||
root = etree.XML(response.content)
|
root = etree.XML(response.content)
|
||||||
for element in root.iter('{DAV:}response'):
|
for element in root.iter('{DAV:}response'):
|
||||||
etag = element.find('{DAV:}propstat').find(
|
etag = element.find('{DAV:}propstat').find(
|
||||||
|
|
|
||||||
|
|
@ -103,7 +103,6 @@ class HttpStorage(Storage):
|
||||||
|
|
||||||
def list(self):
|
def list(self):
|
||||||
r = request('GET', self.url, **self._settings)
|
r = request('GET', self.url, **self._settings)
|
||||||
r.raise_for_status()
|
|
||||||
self._items = {}
|
self._items = {}
|
||||||
rv = []
|
rv = []
|
||||||
for item in split_collection(r.text):
|
for item in split_collection(r.text):
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ import os
|
||||||
import sys
|
import sys
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
from .. import log
|
from .. import log, exceptions
|
||||||
|
|
||||||
|
|
||||||
logger = log.get(__name__)
|
logger = log.get(__name__)
|
||||||
|
|
@ -218,6 +218,12 @@ def request(method, url, data=None, headers=None, auth=None, verify=None,
|
||||||
logger.debug(r.headers)
|
logger.debug(r.headers)
|
||||||
logger.debug(r.content)
|
logger.debug(r.content)
|
||||||
|
|
||||||
|
if r.status_code == 412:
|
||||||
|
raise exceptions.PreconditionFailed(r.reason)
|
||||||
|
if r.status_code == 404:
|
||||||
|
raise exceptions.NotFoundError(r.reason)
|
||||||
|
|
||||||
|
r.raise_for_status()
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue