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 click
import requests import requests
from requests.packages.urllib3.poolmanager import PoolManager
from .. import exceptions, log from .. import exceptions, log
from .compat import iteritems, urlparse from .compat import iteritems, urlparse
@ -178,8 +179,23 @@ def _password_from_keyring(username, resource):
key = new_key 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, 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 Wrapper method for requests, to ease logging and mocking. Parameters should
be the same as for ``requests.request``, except: 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: if session is None:
func = requests.request session = requests.Session()
else:
func = session.request 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(u'{} {}'.format(method, url))
logger.debug(headers) logger.debug(headers)