aboutsummaryrefslogtreecommitdiff
path: root/urllib3/connection.py
diff options
context:
space:
mode:
Diffstat (limited to 'urllib3/connection.py')
-rw-r--r--urllib3/connection.py51
1 files changed, 25 insertions, 26 deletions
diff --git a/urllib3/connection.py b/urllib3/connection.py
index fbb63ed..0d578d7 100644
--- a/urllib3/connection.py
+++ b/urllib3/connection.py
@@ -1,9 +1,3 @@
-# urllib3/connection.py
-# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
-#
-# This module is part of urllib3 and is released under
-# the MIT License: http://www.opensource.org/licenses/mit-license.php
-
import sys
import socket
from socket import timeout as SocketTimeout
@@ -35,13 +29,16 @@ from .exceptions import (
)
from .packages.ssl_match_hostname import match_hostname
from .packages import six
-from .util import (
- assert_fingerprint,
+
+from .util.ssl_ import (
resolve_cert_reqs,
resolve_ssl_version,
ssl_wrap_socket,
+ assert_fingerprint,
)
+from .util import connection
+
port_by_scheme = {
'http': 80,
@@ -82,15 +79,23 @@ class HTTPConnection(_HTTPConnection, object):
#: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]``
default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]
+ #: Whether this connection verifies the host's certificate.
+ is_verified = False
+
def __init__(self, *args, **kw):
if six.PY3: # Python 3
kw.pop('strict', None)
- if sys.version_info < (2, 7): # Python 2.6 and older
- kw.pop('source_address', None)
# Pre-set source_address in case we have an older Python like 2.6.
self.source_address = kw.get('source_address')
+ if sys.version_info < (2, 7): # Python 2.6
+ # _HTTPConnection on Python 2.6 will balk at this keyword arg, but
+ # not newer versions. We can still use it when creating a
+ # connection though, so we pop it *after* we have saved it as
+ # self.source_address.
+ kw.pop('source_address', None)
+
#: The socket options provided by the user. If no options are
#: provided, we use the default options.
self.socket_options = kw.pop('socket_options', self.default_socket_options)
@@ -103,22 +108,22 @@ class HTTPConnection(_HTTPConnection, object):
:return: New socket connection.
"""
- extra_args = []
- if self.source_address: # Python 2.7+
- extra_args.append(self.source_address)
+ extra_kw = {}
+ if self.source_address:
+ extra_kw['source_address'] = self.source_address
+
+ if self.socket_options:
+ extra_kw['socket_options'] = self.socket_options
try:
- conn = socket.create_connection(
- (self.host, self.port), self.timeout, *extra_args)
+ conn = connection.create_connection(
+ (self.host, self.port), self.timeout, **extra_kw)
except SocketTimeout:
raise ConnectTimeoutError(
self, "Connection to %s timed out. (connect timeout=%s)" %
(self.host, self.timeout))
- # Set options on the socket.
- self._set_options_on(conn)
-
return conn
def _prepare_conn(self, conn):
@@ -132,14 +137,6 @@ class HTTPConnection(_HTTPConnection, object):
# Mark this connection as not reusable
self.auto_open = 0
- def _set_options_on(self, conn):
- # Disable all socket options if the user passes ``socket_options=None``
- if self.socket_options is None:
- return
-
- for opt in self.socket_options:
- conn.setsockopt(*opt)
-
def connect(self):
conn = self._new_conn()
self._prepare_conn(conn)
@@ -225,6 +222,8 @@ class VerifiedHTTPSConnection(HTTPSConnection):
match_hostname(self.sock.getpeercert(),
self.assert_hostname or hostname)
+ self.is_verified = resolved_cert_reqs == ssl.CERT_REQUIRED
+
if ssl:
# Make a copy for testing.