|
35 | 35 | try:
|
36 | 36 | from ssl import SSLContext # Modern SSL?
|
37 | 37 | except ImportError:
|
38 |
| - class FakeSSLContext(object): |
| 38 | + class FakeSSLContext(object): # Platform-specific: Python 2 & 3.1 |
39 | 39 | def __init__(self, protocol_version):
|
40 | 40 | self.protocol_version = protocol_version
|
41 | 41 | # Use default values from a real SSLContext
|
@@ -193,56 +193,11 @@ def create_urllib3_context(ssl_version=None, cert_reqs=ssl.CERT_REQUIRED,
|
193 | 193 | context.set_ciphers(ciphers or _RESTRICTED_SERVER_CIPHERS)
|
194 | 194 |
|
195 | 195 | context.verify_mode = cert_reqs
|
196 |
| - context.check_hostname = (context.verify_mode == ssl.CERT_REQUIRED) |
| 196 | + if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 |
| 197 | + context.check_hostname = (context.verify_mode == ssl.CERT_REQUIRED) |
197 | 198 | return context
|
198 | 199 |
|
199 | 200 |
|
200 |
| -if SSLContext is not None: # Python 3.2+ |
201 |
| - def ssl_wrap_socket_v1(sock, keyfile=None, certfile=None, cert_reqs=None, |
202 |
| - ca_certs=None, server_hostname=None, |
203 |
| - ssl_version=None, ssl_context=None): |
204 |
| - """ |
205 |
| - All arguments except `server_hostname` have the same meaning as for |
206 |
| - :func:`ssl.wrap_socket` |
207 |
| -
|
208 |
| - :param server_hostname: |
209 |
| - Hostname of the expected certificate |
210 |
| - :param ssl_context: |
211 |
| - User-constructed SSLContext object |
212 |
| - """ |
213 |
| - context = ssl_context |
214 |
| - if context is None: |
215 |
| - context = create_urllib3_context(ssl_version, cert_reqs) |
216 |
| - |
217 |
| - if ca_certs: |
218 |
| - try: |
219 |
| - context.load_verify_locations(ca_certs) |
220 |
| - # Py32 raises IOError |
221 |
| - # Py33 raises FileNotFoundError |
222 |
| - except Exception as e: # Reraise as SSLError |
223 |
| - raise SSLError(e) |
224 |
| - if certfile: |
225 |
| - # FIXME: This block needs a test. |
226 |
| - context.load_cert_chain(certfile, keyfile) |
227 |
| - if HAS_SNI: # Platform-specific: OpenSSL with enabled SNI |
228 |
| - return context.wrap_socket(sock, server_hostname=server_hostname) |
229 |
| - return context.wrap_socket(sock) |
230 |
| - |
231 |
| -else: # Python 3.1 and earlier |
232 |
| - def ssl_wrap_socket_v1(sock, keyfile=None, certfile=None, cert_reqs=None, |
233 |
| - ca_certs=None, server_hostname=None, |
234 |
| - ssl_version=None, ssl_context=None): |
235 |
| - if ssl_context and hasattr(ssl_context, 'wrap_socket'): |
236 |
| - wrap = ssl_context.wrap_socket |
237 |
| - try: |
238 |
| - return wrap(sock, server_hostname=server_hostname) |
239 |
| - except TypeError: |
240 |
| - return wrap(sock) |
241 |
| - |
242 |
| - return wrap_socket(sock, keyfile=keyfile, certfile=certfile, |
243 |
| - ca_certs=ca_certs, cert_reqs=cert_reqs, |
244 |
| - ssl_version=ssl_version) |
245 |
| - |
246 | 201 | def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,
|
247 | 202 | ca_certs=None, server_hostname=None,
|
248 | 203 | ssl_version=None, ssl_context=None):
|
|
0 commit comments