diff --git a/requests/api.py b/requests/api.py index b079eedd..3188a2d0 100644 --- a/requests/api.py +++ b/requests/api.py @@ -33,6 +33,7 @@ def request(method, url, **kwargs): :param config: (optional) A configuration dictionary. :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided. :param prefetch: (optional) if ``True``, the response content will be immediately downloaded. + :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. """ s = kwargs.pop('session') if 'session' in kwargs else sessions.session() diff --git a/requests/models.py b/requests/models.py index 753e83ab..717e36fd 100644 --- a/requests/models.py +++ b/requests/models.py @@ -63,7 +63,8 @@ class Request(object): config=None, _poolmanager=None, verify=None, - session=None): + session=None, + cert=None): #: Dictionary of configurations for this request. self.config = dict(config or []) @@ -143,6 +144,9 @@ class Request(object): #: SSL Verification. self.verify = verify + #: SSL Certificate + self.cert = cert + if headers: headers = CaseInsensitiveDict(self.headers) else: @@ -267,7 +271,8 @@ class Request(object): _poolmanager=self._poolmanager, proxies=self.proxies, verify=self.verify, - session=self.session + session=self.session, + cert=self.cert ) request.send() @@ -507,6 +512,13 @@ class Request(object): conn.cert_reqs = 'CERT_NONE' conn.ca_certs = None + if self.cert: + if type(self.cert) is tuple: + conn.cert_file = self.cert[0] + conn.key_file = self.cert[1] + else: + conn.cert_file = self.cert + if not self.sent or anyway: if self.cookies: diff --git a/requests/sessions.py b/requests/sessions.py index 87320d6e..f66529e8 100644 --- a/requests/sessions.py +++ b/requests/sessions.py @@ -52,7 +52,7 @@ class Session(object): __attrs__ = [ 'headers', 'cookies', 'auth', 'timeout', 'proxies', 'hooks', - 'params', 'config', 'verify'] + 'params', 'config', 'verify', 'cert'] def __init__(self, @@ -65,7 +65,8 @@ class Session(object): params=None, config=None, prefetch=False, - verify=True): + verify=True, + cert=None): self.headers = headers or {} self.cookies = cookies or {} @@ -77,6 +78,7 @@ class Session(object): self.config = config or {} self.prefetch = prefetch self.verify = verify + self.cert = cert for (k, v) in list(defaults.items()): self.config.setdefault(k, v) @@ -119,7 +121,8 @@ class Session(object): return_response=True, config=None, prefetch=False, - verify=None): + verify=None, + cert=None): """Constructs and sends a :class:`Request `. Returns :class:`Response ` object. @@ -139,6 +142,7 @@ class Session(object): :param config: (optional) A configuration dictionary. :param prefetch: (optional) if ``True``, the response content will be immediately downloaded. :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided. + :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. """ method = str(method).upper() @@ -176,6 +180,7 @@ class Session(object): proxies=proxies, config=config, verify=verify, + cert=cert, _poolmanager=self.poolmanager )