Use FingerprintAdapter from req-toolbelt

Fix #187
This commit is contained in:
Markus Unterwaditzer 2015-04-10 18:10:53 +02:00
parent 0a35e27d5d
commit 575d270e06
6 changed files with 31 additions and 17 deletions

View file

@ -9,7 +9,7 @@ env:
# Radicale with filesystem storage (default)
- BUILD=test DAV_SERVER=radicale RADICALE_BACKEND=filesystem REQUIREMENTS=release
PKGS='lxml==3.0 requests==2.4.1 requests_toolbelt==0.3.0 click==3.1'
PKGS='lxml==3.0 requests==2.4.1 requests_toolbelt==0.4.0 click==3.1'
# Minimal requirements
#- BUILD=test DAV_SERVER=radicale RADICALE_BACKEND=filesystem REQUIREMENTS=devel

View file

@ -14,6 +14,8 @@ Version 0.5.0
*yet to be released*
- Raise version of required requests-toolbelt to ``0.4.0``.
Version 0.4.4
=============

View file

@ -37,7 +37,7 @@ setup(
'requests',
'lxml>=3.0',
# https://github.com/sigmavirus24/requests-toolbelt/pull/28
'requests_toolbelt>=0.3.0',
'requests_toolbelt>=0.4.0',
'atomicwrites'
],
extras_require={'keyring': ['keyring']}

View file

@ -100,13 +100,12 @@ def test_prepare_auth():
@pytest.mark.parametrize('auth', (None, 'guess'))
def test_prepare_auth_guess(monkeypatch, auth):
import requests_toolbelt
import requests_toolbelt.auth.guess
assert isinstance(prepare_auth(auth, 'user', 'pwd'),
requests_toolbelt.GuessAuth)
requests_toolbelt.auth.guess.GuessAuth)
if hasattr(requests_toolbelt, 'GuessAuth'):
monkeypatch.delattr(requests_toolbelt, 'GuessAuth')
monkeypatch.delattr(requests_toolbelt.auth.guess, 'GuessAuth')
with pytest.raises(RuntimeError) as excinfo:
prepare_auth(auth, 'user', 'pwd')

View file

@ -17,11 +17,14 @@ def prepare_auth(auth, username, password):
from requests.auth import HTTPDigestAuth
return HTTPDigestAuth(username, password)
elif auth == 'guess' or auth is None:
import requests_toolbelt
if not hasattr(requests_toolbelt, 'GuessAuth'):
try:
from requests_toolbelt.auth.guess import GuessAuth
except ImportError:
raise RuntimeError('Your version of requests_toolbelt is too '
'old.')
return requests_toolbelt.GuessAuth(username, password)
'old for `guess` authentication. At least '
'version 0.4.0 is required.')
else:
return GuessAuth(username, password)
else:
raise ValueError('Unknown authentication method: {}'.format(auth))
elif auth:

View file

@ -201,6 +201,20 @@ VERIFY_FINGERPRINT_WORKS = _verify_fingerprint_works()
del _verify_fingerprint_works
def _install_fingerprint_adapter(session, fingerprint):
prefix = 'https://'
try:
from requests_toolbelt.adapters.fingerprint import \
FingerprintAdapter
except ImportError:
raise RuntimeError('`verify_fingerprint` can only be used with '
'requests-toolbelt versions >= 0.4.0')
if not isinstance(session.adapters[prefix], FingerprintAdapter):
fingerprint_adapter = FingerprintAdapter(fingerprint)
session.mount(prefix, fingerprint_adapter)
def request(method, url, session=None, latin1_fallback=True,
verify_fingerprint=None, **kwargs):
'''
@ -223,14 +237,10 @@ def request(method, url, session=None, latin1_fallback=True,
if verify_fingerprint is not None:
if not VERIFY_FINGERPRINT_WORKS:
raise ValueError('`verify_fingerprint` can only be used with '
'requests versions >= 2.4.1')
raise RuntimeError('`verify_fingerprint` can only be used with '
'requests versions >= 2.4.1')
_install_fingerprint_adapter(session, verify_fingerprint)
kwargs['verify'] = False
https_prefix = 'https://'
if not isinstance(session.adapters[https_prefix], _FingerprintAdapter):
fingerprint_adapter = _FingerprintAdapter(verify_fingerprint)
session.mount(https_prefix, fingerprint_adapter)
func = session.request