Simplify error handling

This commit is contained in:
Markus Unterwaditzer 2014-05-26 22:19:35 +02:00
parent c010b90cc3
commit d46795bdb7
4 changed files with 21 additions and 27 deletions

View file

@ -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

View file

@ -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(

View file

@ -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):

View file

@ -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