add a tls_prefix parameter to utils.request

This assumes that a backend only ever connects to a single domain, because we
set the fingerprint on the whole session
This commit is contained in:
Thomas Weißschuh 2014-08-18 19:16:13 +00:00
parent d5e8be4979
commit 56d566e55a

View file

@ -12,6 +12,7 @@ import os
import click
import requests
from requests.packages.urllib3.poolmanager import PoolManager
from .. import exceptions, log
from .compat import iteritems, urlparse
@ -178,8 +179,23 @@ def _password_from_keyring(username, resource):
key = new_key
class _FingerprintAdapter(requests.adapters.HTTPAdapter):
def __init__(self, fingerprint=None, **kwargs):
self.fingerprint = str(fingerprint)
super(_FingerprintAdapter, self).__init__(**kwargs)
def send(self, *args, **kwargs):
return super(_FingerprintAdapter, self).send(*args, **kwargs)
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = PoolManager(num_pools=connections,
maxsize=maxsize,
block=block,
assert_fingerprint=self.fingerprint)
def request(method, url, data=None, headers=None, auth=None, verify=None,
session=None, latin1_fallback=True):
session=None, latin1_fallback=True, tls_fingerprint=None):
'''
Wrapper method for requests, to ease logging and mocking. Parameters should
be the same as for ``requests.request``, except:
@ -194,9 +210,16 @@ def request(method, url, data=None, headers=None, auth=None, verify=None,
'''
if session is None:
func = requests.request
else:
func = session.request
session = requests.Session()
if tls_fingerprint is not None:
https_prefix = 'https://'
if not isinstance(session.adapters[https_prefix], _FingerprintAdapter):
fingerprint_adapter = _FingerprintAdapter(tls_fingerprint)
session.mount(https_prefix, fingerprint_adapter)
func = session.request
logger.debug(u'{} {}'.format(method, url))
logger.debug(headers)