| OLD | NEW |
| 1 # urllib3/connectionpool.py | 1 # urllib3/connectionpool.py |
| 2 # Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) | 2 # Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) |
| 3 # | 3 # |
| 4 # This module is part of urllib3 and is released under | 4 # This module is part of urllib3 and is released under |
| 5 # the MIT License: http://www.opensource.org/licenses/mit-license.php | 5 # the MIT License: http://www.opensource.org/licenses/mit-license.php |
| 6 | 6 |
| 7 import errno |
| 7 import logging | 8 import logging |
| 8 import socket | |
| 9 import errno | |
| 10 | 9 |
| 11 from socket import error as SocketError, timeout as SocketTimeout | 10 from socket import error as SocketError, timeout as SocketTimeout |
| 12 from .util import resolve_cert_reqs, resolve_ssl_version, assert_fingerprint | 11 import socket |
| 13 | 12 |
| 14 try: # Python 3 | 13 try: # Python 3 |
| 15 from http.client import HTTPConnection, HTTPException | 14 from http.client import HTTPConnection, HTTPException |
| 16 from http.client import HTTP_PORT, HTTPS_PORT | 15 from http.client import HTTP_PORT, HTTPS_PORT |
| 17 except ImportError: | 16 except ImportError: |
| 18 from httplib import HTTPConnection, HTTPException | 17 from httplib import HTTPConnection, HTTPException |
| 19 from httplib import HTTP_PORT, HTTPS_PORT | 18 from httplib import HTTP_PORT, HTTPS_PORT |
| 20 | 19 |
| 21 try: # Python 3 | 20 try: # Python 3 |
| 22 from queue import LifoQueue, Empty, Full | 21 from queue import LifoQueue, Empty, Full |
| 23 except ImportError: | 22 except ImportError: |
| 24 from Queue import LifoQueue, Empty, Full | 23 from Queue import LifoQueue, Empty, Full |
| 24 import Queue as _ # Platform-specific: Windows |
| 25 | 25 |
| 26 | 26 |
| 27 try: # Compiled with SSL? | 27 try: # Compiled with SSL? |
| 28 HTTPSConnection = object | 28 HTTPSConnection = object |
| 29 BaseSSLError = None | 29 |
| 30 class BaseSSLError(BaseException): |
| 31 pass |
| 32 |
| 30 ssl = None | 33 ssl = None |
| 31 | 34 |
| 32 try: # Python 3 | 35 try: # Python 3 |
| 33 from http.client import HTTPSConnection | 36 from http.client import HTTPSConnection |
| 34 except ImportError: | 37 except ImportError: |
| 35 from httplib import HTTPSConnection | 38 from httplib import HTTPSConnection |
| 36 | 39 |
| 37 import ssl | 40 import ssl |
| 38 BaseSSLError = ssl.SSLError | 41 BaseSSLError = ssl.SSLError |
| 39 | 42 |
| 40 except (ImportError, AttributeError): # Platform-specific: No SSL. | 43 except (ImportError, AttributeError): # Platform-specific: No SSL. |
| 41 pass | 44 pass |
| 42 | 45 |
| 43 | 46 |
| 44 from .request import RequestMethods | |
| 45 from .response import HTTPResponse | |
| 46 from .util import get_host, is_connection_dropped, ssl_wrap_socket | |
| 47 from .exceptions import ( | 47 from .exceptions import ( |
| 48 ClosedPoolError, | 48 ClosedPoolError, |
| 49 ConnectTimeoutError, |
| 49 EmptyPoolError, | 50 EmptyPoolError, |
| 50 HostChangedError, | 51 HostChangedError, |
| 51 MaxRetryError, | 52 MaxRetryError, |
| 52 SSLError, | 53 SSLError, |
| 53 TimeoutError, | 54 ReadTimeoutError, |
| 55 ProxyError, |
| 54 ) | 56 ) |
| 55 | 57 from .packages.ssl_match_hostname import CertificateError, match_hostname |
| 56 from .packages.ssl_match_hostname import match_hostname, CertificateError | |
| 57 from .packages import six | 58 from .packages import six |
| 58 | 59 from .request import RequestMethods |
| 60 from .response import HTTPResponse |
| 61 from .util import ( |
| 62 assert_fingerprint, |
| 63 get_host, |
| 64 is_connection_dropped, |
| 65 resolve_cert_reqs, |
| 66 resolve_ssl_version, |
| 67 ssl_wrap_socket, |
| 68 Timeout, |
| 69 ) |
| 59 | 70 |
| 60 xrange = six.moves.xrange | 71 xrange = six.moves.xrange |
| 61 | 72 |
| 62 log = logging.getLogger(__name__) | 73 log = logging.getLogger(__name__) |
| 63 | 74 |
| 64 _Default = object() | 75 _Default = object() |
| 65 | 76 |
| 66 port_by_scheme = { | 77 port_by_scheme = { |
| 67 'http': HTTP_PORT, | 78 'http': HTTP_PORT, |
| 68 'https': HTTPS_PORT, | 79 'https': HTTPS_PORT, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 86 | 97 |
| 87 self.key_file = key_file | 98 self.key_file = key_file |
| 88 self.cert_file = cert_file | 99 self.cert_file = cert_file |
| 89 self.cert_reqs = cert_reqs | 100 self.cert_reqs = cert_reqs |
| 90 self.ca_certs = ca_certs | 101 self.ca_certs = ca_certs |
| 91 self.assert_hostname = assert_hostname | 102 self.assert_hostname = assert_hostname |
| 92 self.assert_fingerprint = assert_fingerprint | 103 self.assert_fingerprint = assert_fingerprint |
| 93 | 104 |
| 94 def connect(self): | 105 def connect(self): |
| 95 # Add certificate verification | 106 # Add certificate verification |
| 96 sock = socket.create_connection((self.host, self.port), self.timeout) | 107 try: |
| 108 sock = socket.create_connection( |
| 109 address=(self.host, self.port), |
| 110 timeout=self.timeout) |
| 111 except SocketTimeout: |
| 112 raise ConnectTimeoutError( |
| 113 self, "Connection to %s timed out. (connect timeout=%s)" % |
| 114 (self.host, self.timeout)) |
| 97 | 115 |
| 98 resolved_cert_reqs = resolve_cert_reqs(self.cert_reqs) | 116 resolved_cert_reqs = resolve_cert_reqs(self.cert_reqs) |
| 99 resolved_ssl_version = resolve_ssl_version(self.ssl_version) | 117 resolved_ssl_version = resolve_ssl_version(self.ssl_version) |
| 100 | 118 |
| 119 if self._tunnel_host: |
| 120 self.sock = sock |
| 121 # Calls self._set_hostport(), so self.host is |
| 122 # self._tunnel_host below. |
| 123 self._tunnel() |
| 124 |
| 101 # Wrap socket using verification with the root certs in | 125 # Wrap socket using verification with the root certs in |
| 102 # trusted_root_certs | 126 # trusted_root_certs |
| 103 self.sock = ssl_wrap_socket(sock, self.key_file, self.cert_file, | 127 self.sock = ssl_wrap_socket(sock, self.key_file, self.cert_file, |
| 104 cert_reqs=resolved_cert_reqs, | 128 cert_reqs=resolved_cert_reqs, |
| 105 ca_certs=self.ca_certs, | 129 ca_certs=self.ca_certs, |
| 106 server_hostname=self.host, | 130 server_hostname=self.host, |
| 107 ssl_version=resolved_ssl_version) | 131 ssl_version=resolved_ssl_version) |
| 108 | 132 |
| 109 if resolved_cert_reqs != ssl.CERT_NONE: | 133 if resolved_cert_reqs != ssl.CERT_NONE: |
| 110 if self.assert_fingerprint: | 134 if self.assert_fingerprint: |
| 111 assert_fingerprint(self.sock.getpeercert(binary_form=True), | 135 assert_fingerprint(self.sock.getpeercert(binary_form=True), |
| 112 self.assert_fingerprint) | 136 self.assert_fingerprint) |
| 113 else: | 137 elif self.assert_hostname is not False: |
| 114 match_hostname(self.sock.getpeercert(), | 138 match_hostname(self.sock.getpeercert(), |
| 115 self.assert_hostname or self.host) | 139 self.assert_hostname or self.host) |
| 116 | 140 |
| 141 |
| 117 ## Pool objects | 142 ## Pool objects |
| 118 | 143 |
| 119 class ConnectionPool(object): | 144 class ConnectionPool(object): |
| 120 """ | 145 """ |
| 121 Base class for all connection pools, such as | 146 Base class for all connection pools, such as |
| 122 :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. | 147 :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. |
| 123 """ | 148 """ |
| 124 | 149 |
| 125 scheme = None | 150 scheme = None |
| 126 QueueCls = LifoQueue | 151 QueueCls = LifoQueue |
| 127 | 152 |
| 128 def __init__(self, host, port=None): | 153 def __init__(self, host, port=None): |
| 154 # httplib doesn't like it when we include brackets in ipv6 addresses |
| 155 host = host.strip('[]') |
| 156 |
| 129 self.host = host | 157 self.host = host |
| 130 self.port = port | 158 self.port = port |
| 131 | 159 |
| 132 def __str__(self): | 160 def __str__(self): |
| 133 return '%s(host=%r, port=%r)' % (type(self).__name__, | 161 return '%s(host=%r, port=%r)' % (type(self).__name__, |
| 134 self.host, self.port) | 162 self.host, self.port) |
| 135 | 163 |
| 164 # This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.p
y#l252 |
| 165 _blocking_errnos = set([errno.EAGAIN, errno.EWOULDBLOCK]) |
| 136 | 166 |
| 137 class HTTPConnectionPool(ConnectionPool, RequestMethods): | 167 class HTTPConnectionPool(ConnectionPool, RequestMethods): |
| 138 """ | 168 """ |
| 139 Thread-safe connection pool for one host. | 169 Thread-safe connection pool for one host. |
| 140 | 170 |
| 141 :param host: | 171 :param host: |
| 142 Host used for this HTTP Connection (e.g. "localhost"), passed into | 172 Host used for this HTTP Connection (e.g. "localhost"), passed into |
| 143 :class:`httplib.HTTPConnection`. | 173 :class:`httplib.HTTPConnection`. |
| 144 | 174 |
| 145 :param port: | 175 :param port: |
| 146 Port used for this HTTP Connection (None is equivalent to 80), passed | 176 Port used for this HTTP Connection (None is equivalent to 80), passed |
| 147 into :class:`httplib.HTTPConnection`. | 177 into :class:`httplib.HTTPConnection`. |
| 148 | 178 |
| 149 :param strict: | 179 :param strict: |
| 150 Causes BadStatusLine to be raised if the status line can't be parsed | 180 Causes BadStatusLine to be raised if the status line can't be parsed |
| 151 as a valid HTTP/1.0 or 1.1 status line, passed into | 181 as a valid HTTP/1.0 or 1.1 status line, passed into |
| 152 :class:`httplib.HTTPConnection`. | 182 :class:`httplib.HTTPConnection`. |
| 153 | 183 |
| 184 .. note:: |
| 185 Only works in Python 2. This parameter is ignored in Python 3. |
| 186 |
| 154 :param timeout: | 187 :param timeout: |
| 155 Socket timeout for each individual connection, can be a float. None | 188 Socket timeout in seconds for each individual connection. This can |
| 156 disables timeout. | 189 be a float or integer, which sets the timeout for the HTTP request, |
| 190 or an instance of :class:`urllib3.util.Timeout` which gives you more |
| 191 fine-grained control over request timeouts. After the constructor has |
| 192 been parsed, this is always a `urllib3.util.Timeout` object. |
| 157 | 193 |
| 158 :param maxsize: | 194 :param maxsize: |
| 159 Number of connections to save that can be reused. More than 1 is useful | 195 Number of connections to save that can be reused. More than 1 is useful |
| 160 in multithreaded situations. If ``block`` is set to false, more | 196 in multithreaded situations. If ``block`` is set to false, more |
| 161 connections will be created but they will not be saved once they've | 197 connections will be created but they will not be saved once they've |
| 162 been used. | 198 been used. |
| 163 | 199 |
| 164 :param block: | 200 :param block: |
| 165 If set to True, no more than ``maxsize`` connections will be used at | 201 If set to True, no more than ``maxsize`` connections will be used at |
| 166 a time. When no free connections are available, the call will block | 202 a time. When no free connections are available, the call will block |
| 167 until a connection has been released. This is a useful side effect for | 203 until a connection has been released. This is a useful side effect for |
| 168 particular multithreaded situations where one does not want to use more | 204 particular multithreaded situations where one does not want to use more |
| 169 than maxsize connections per host to prevent flooding. | 205 than maxsize connections per host to prevent flooding. |
| 170 | 206 |
| 171 :param headers: | 207 :param headers: |
| 172 Headers to include with all requests, unless other headers are given | 208 Headers to include with all requests, unless other headers are given |
| 173 explicitly. | 209 explicitly. |
| 210 |
| 211 :param _proxy: |
| 212 Parsed proxy URL, should not be used directly, instead, see |
| 213 :class:`urllib3.connectionpool.ProxyManager`" |
| 214 |
| 215 :param _proxy_headers: |
| 216 A dictionary with proxy headers, should not be used directly, |
| 217 instead, see :class:`urllib3.connectionpool.ProxyManager`" |
| 174 """ | 218 """ |
| 175 | 219 |
| 176 scheme = 'http' | 220 scheme = 'http' |
| 177 | 221 |
| 178 def __init__(self, host, port=None, strict=False, timeout=None, maxsize=1, | 222 def __init__(self, host, port=None, strict=False, |
| 179 block=False, headers=None): | 223 timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, |
| 224 headers=None, _proxy=None, _proxy_headers=None): |
| 180 ConnectionPool.__init__(self, host, port) | 225 ConnectionPool.__init__(self, host, port) |
| 181 RequestMethods.__init__(self, headers) | 226 RequestMethods.__init__(self, headers) |
| 182 | 227 |
| 183 self.strict = strict | 228 self.strict = strict |
| 229 |
| 230 # This is for backwards compatibility and can be removed once a timeout |
| 231 # can only be set to a Timeout object |
| 232 if not isinstance(timeout, Timeout): |
| 233 timeout = Timeout.from_float(timeout) |
| 234 |
| 184 self.timeout = timeout | 235 self.timeout = timeout |
| 236 |
| 185 self.pool = self.QueueCls(maxsize) | 237 self.pool = self.QueueCls(maxsize) |
| 186 self.block = block | 238 self.block = block |
| 187 | 239 |
| 240 self.proxy = _proxy |
| 241 self.proxy_headers = _proxy_headers or {} |
| 242 |
| 188 # Fill the queue up so that doing get() on it will block properly | 243 # Fill the queue up so that doing get() on it will block properly |
| 189 for _ in xrange(maxsize): | 244 for _ in xrange(maxsize): |
| 190 self.pool.put(None) | 245 self.pool.put(None) |
| 191 | 246 |
| 192 # These are mostly for testing and debugging purposes. | 247 # These are mostly for testing and debugging purposes. |
| 193 self.num_connections = 0 | 248 self.num_connections = 0 |
| 194 self.num_requests = 0 | 249 self.num_requests = 0 |
| 195 | 250 |
| 196 def _new_conn(self): | 251 def _new_conn(self): |
| 197 """ | 252 """ |
| 198 Return a fresh :class:`httplib.HTTPConnection`. | 253 Return a fresh :class:`httplib.HTTPConnection`. |
| 199 """ | 254 """ |
| 200 self.num_connections += 1 | 255 self.num_connections += 1 |
| 201 log.info("Starting new HTTP connection (%d): %s" % | 256 log.info("Starting new HTTP connection (%d): %s" % |
| 202 (self.num_connections, self.host)) | 257 (self.num_connections, self.host)) |
| 203 return HTTPConnection(host=self.host, | 258 extra_params = {} |
| 204 port=self.port, | 259 if not six.PY3: # Python 2 |
| 205 strict=self.strict) | 260 extra_params['strict'] = self.strict |
| 261 |
| 262 return HTTPConnection(host=self.host, port=self.port, |
| 263 timeout=self.timeout.connect_timeout, |
| 264 **extra_params) |
| 265 |
| 206 | 266 |
| 207 def _get_conn(self, timeout=None): | 267 def _get_conn(self, timeout=None): |
| 208 """ | 268 """ |
| 209 Get a connection. Will return a pooled connection if one is available. | 269 Get a connection. Will return a pooled connection if one is available. |
| 210 | 270 |
| 211 If no connections are available and :prop:`.block` is ``False``, then a | 271 If no connections are available and :prop:`.block` is ``False``, then a |
| 212 fresh connection is returned. | 272 fresh connection is returned. |
| 213 | 273 |
| 214 :param timeout: | 274 :param timeout: |
| 215 Seconds to wait before giving up and raising | 275 Seconds to wait before giving up and raising |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 return # Everything is dandy, done. | 316 return # Everything is dandy, done. |
| 257 except AttributeError: | 317 except AttributeError: |
| 258 # self.pool is None. | 318 # self.pool is None. |
| 259 pass | 319 pass |
| 260 except Full: | 320 except Full: |
| 261 # This should never happen if self.block == True | 321 # This should never happen if self.block == True |
| 262 log.warning("HttpConnectionPool is full, discarding connection: %s" | 322 log.warning("HttpConnectionPool is full, discarding connection: %s" |
| 263 % self.host) | 323 % self.host) |
| 264 | 324 |
| 265 # Connection never got put back into the pool, close it. | 325 # Connection never got put back into the pool, close it. |
| 266 conn.close() | 326 if conn: |
| 327 conn.close() |
| 328 |
| 329 def _get_timeout(self, timeout): |
| 330 """ Helper that always returns a :class:`urllib3.util.Timeout` """ |
| 331 if timeout is _Default: |
| 332 return self.timeout.clone() |
| 333 |
| 334 if isinstance(timeout, Timeout): |
| 335 return timeout.clone() |
| 336 else: |
| 337 # User passed us an int/float. This is for backwards compatibility, |
| 338 # can be removed later |
| 339 return Timeout.from_float(timeout) |
| 267 | 340 |
| 268 def _make_request(self, conn, method, url, timeout=_Default, | 341 def _make_request(self, conn, method, url, timeout=_Default, |
| 269 **httplib_request_kw): | 342 **httplib_request_kw): |
| 270 """ | 343 """ |
| 271 Perform a request on a given httplib connection object taken from our | 344 Perform a request on a given httplib connection object taken from our |
| 272 pool. | 345 pool. |
| 346 |
| 347 :param conn: |
| 348 a connection from one of our connection pools |
| 349 |
| 350 :param timeout: |
| 351 Socket timeout in seconds for the request. This can be a |
| 352 float or integer, which will set the same timeout value for |
| 353 the socket connect and the socket read, or an instance of |
| 354 :class:`urllib3.util.Timeout`, which gives you more fine-grained |
| 355 control over your timeouts. |
| 273 """ | 356 """ |
| 274 self.num_requests += 1 | 357 self.num_requests += 1 |
| 275 | 358 |
| 276 if timeout is _Default: | 359 timeout_obj = self._get_timeout(timeout) |
| 277 timeout = self.timeout | |
| 278 | 360 |
| 279 conn.timeout = timeout # This only does anything in Py26+ | 361 try: |
| 280 conn.request(method, url, **httplib_request_kw) | 362 timeout_obj.start_connect() |
| 363 conn.timeout = timeout_obj.connect_timeout |
| 364 # conn.request() calls httplib.*.request, not the method in |
| 365 # request.py. It also calls makefile (recv) on the socket |
| 366 conn.request(method, url, **httplib_request_kw) |
| 367 except SocketTimeout: |
| 368 raise ConnectTimeoutError( |
| 369 self, "Connection to %s timed out. (connect timeout=%s)" % |
| 370 (self.host, timeout_obj.connect_timeout)) |
| 281 | 371 |
| 282 # Set timeout | 372 # Reset the timeout for the recv() on the socket |
| 283 sock = getattr(conn, 'sock', False) # AppEngine doesn't have sock attr. | 373 read_timeout = timeout_obj.read_timeout |
| 284 if sock: | 374 log.debug("Setting read timeout to %s" % read_timeout) |
| 285 sock.settimeout(timeout) | 375 # App Engine doesn't have a sock attr |
| 376 if hasattr(conn, 'sock') and \ |
| 377 read_timeout is not None and \ |
| 378 read_timeout is not Timeout.DEFAULT_TIMEOUT: |
| 379 # In Python 3 socket.py will catch EAGAIN and return None when you |
| 380 # try and read into the file pointer created by http.client, which |
| 381 # instead raises a BadStatusLine exception. Instead of catching |
| 382 # the exception and assuming all BadStatusLine exceptions are read |
| 383 # timeouts, check for a zero timeout before making the request. |
| 384 if read_timeout == 0: |
| 385 raise ReadTimeoutError( |
| 386 self, url, |
| 387 "Read timed out. (read timeout=%s)" % read_timeout) |
| 388 conn.sock.settimeout(read_timeout) |
| 286 | 389 |
| 287 try: # Python 2.7+, use buffering of HTTP responses | 390 # Receive the response from the server |
| 288 httplib_response = conn.getresponse(buffering=True) | 391 try: |
| 289 except TypeError: # Python 2.6 and older | 392 try: # Python 2.7+, use buffering of HTTP responses |
| 290 httplib_response = conn.getresponse() | 393 httplib_response = conn.getresponse(buffering=True) |
| 394 except TypeError: # Python 2.6 and older |
| 395 httplib_response = conn.getresponse() |
| 396 except SocketTimeout: |
| 397 raise ReadTimeoutError( |
| 398 self, url, "Read timed out. (read timeout=%s)" % read_timeout) |
| 399 |
| 400 except SocketError as e: # Platform-specific: Python 2 |
| 401 # See the above comment about EAGAIN in Python 3. In Python 2 we |
| 402 # have to specifically catch it and throw the timeout error |
| 403 if e.errno in _blocking_errnos: |
| 404 raise ReadTimeoutError( |
| 405 self, url, |
| 406 "Read timed out. (read timeout=%s)" % read_timeout) |
| 407 raise |
| 408 |
| 291 | 409 |
| 292 # AppEngine doesn't have a version attr. | 410 # AppEngine doesn't have a version attr. |
| 293 http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') | 411 http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') |
| 294 log.debug("\"%s %s %s\" %s %s" % (method, url, http_version, | 412 log.debug("\"%s %s %s\" %s %s" % (method, url, http_version, |
| 295 httplib_response.status, | 413 httplib_response.status, |
| 296 httplib_response.length)) | 414 httplib_response.length)) |
| 297 return httplib_response | 415 return httplib_response |
| 298 | 416 |
| 299 def close(self): | 417 def close(self): |
| 300 """ | 418 """ |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 :param headers: | 478 :param headers: |
| 361 Dictionary of custom headers to send, such as User-Agent, | 479 Dictionary of custom headers to send, such as User-Agent, |
| 362 If-None-Match, etc. If None, pool headers are used. If provided, | 480 If-None-Match, etc. If None, pool headers are used. If provided, |
| 363 these headers completely replace any pool-specific headers. | 481 these headers completely replace any pool-specific headers. |
| 364 | 482 |
| 365 :param retries: | 483 :param retries: |
| 366 Number of retries to allow before raising a MaxRetryError exception. | 484 Number of retries to allow before raising a MaxRetryError exception. |
| 367 | 485 |
| 368 :param redirect: | 486 :param redirect: |
| 369 If True, automatically handle redirects (status codes 301, 302, | 487 If True, automatically handle redirects (status codes 301, 302, |
| 370 303, 307). Each redirect counts as a retry. | 488 303, 307, 308). Each redirect counts as a retry. |
| 371 | 489 |
| 372 :param assert_same_host: | 490 :param assert_same_host: |
| 373 If ``True``, will make sure that the host of the pool requests is | 491 If ``True``, will make sure that the host of the pool requests is |
| 374 consistent else will raise HostChangedError. When False, you can | 492 consistent else will raise HostChangedError. When False, you can |
| 375 use the pool on an HTTP proxy and request foreign hosts. | 493 use the pool on an HTTP proxy and request foreign hosts. |
| 376 | 494 |
| 377 :param timeout: | 495 :param timeout: |
| 378 If specified, overrides the default timeout for this one request. | 496 If specified, overrides the default timeout for this one |
| 497 request. It may be a float (in seconds) or an instance of |
| 498 :class:`urllib3.util.Timeout`. |
| 379 | 499 |
| 380 :param pool_timeout: | 500 :param pool_timeout: |
| 381 If set and the pool is set to block=True, then this method will | 501 If set and the pool is set to block=True, then this method will |
| 382 block for ``pool_timeout`` seconds and raise EmptyPoolError if no | 502 block for ``pool_timeout`` seconds and raise EmptyPoolError if no |
| 383 connection is available within the time period. | 503 connection is available within the time period. |
| 384 | 504 |
| 385 :param release_conn: | 505 :param release_conn: |
| 386 If False, then the urlopen call will not release the connection | 506 If False, then the urlopen call will not release the connection |
| 387 back into the pool once a response is received (but will release if | 507 back into the pool once a response is received (but will release if |
| 388 you read the entire contents of the response such as when | 508 you read the entire contents of the response such as when |
| 389 `preload_content=True`). This is useful if you're not preloading | 509 `preload_content=True`). This is useful if you're not preloading |
| 390 the response's content immediately. You will need to call | 510 the response's content immediately. You will need to call |
| 391 ``r.release_conn()`` on the response ``r`` to return the connection | 511 ``r.release_conn()`` on the response ``r`` to return the connection |
| 392 back into the pool. If None, it takes the value of | 512 back into the pool. If None, it takes the value of |
| 393 ``response_kw.get('preload_content', True)``. | 513 ``response_kw.get('preload_content', True)``. |
| 394 | 514 |
| 395 :param \**response_kw: | 515 :param \**response_kw: |
| 396 Additional parameters are passed to | 516 Additional parameters are passed to |
| 397 :meth:`urllib3.response.HTTPResponse.from_httplib` | 517 :meth:`urllib3.response.HTTPResponse.from_httplib` |
| 398 """ | 518 """ |
| 399 if headers is None: | 519 if headers is None: |
| 400 headers = self.headers | 520 headers = self.headers |
| 401 | 521 |
| 402 if retries < 0: | 522 if retries < 0: |
| 403 raise MaxRetryError(self, url) | 523 raise MaxRetryError(self, url) |
| 404 | 524 |
| 405 if timeout is _Default: | |
| 406 timeout = self.timeout | |
| 407 | |
| 408 if release_conn is None: | 525 if release_conn is None: |
| 409 release_conn = response_kw.get('preload_content', True) | 526 release_conn = response_kw.get('preload_content', True) |
| 410 | 527 |
| 411 # Check host | 528 # Check host |
| 412 if assert_same_host and not self.is_same_host(url): | 529 if assert_same_host and not self.is_same_host(url): |
| 413 host = "%s://%s" % (self.scheme, self.host) | |
| 414 if self.port: | |
| 415 host = "%s:%d" % (host, self.port) | |
| 416 | |
| 417 raise HostChangedError(self, url, retries - 1) | 530 raise HostChangedError(self, url, retries - 1) |
| 418 | 531 |
| 419 conn = None | 532 conn = None |
| 420 | 533 |
| 421 try: | 534 try: |
| 422 # Request a connection from the queue | 535 # Request a connection from the queue |
| 423 conn = self._get_conn(timeout=pool_timeout) | 536 conn = self._get_conn(timeout=pool_timeout) |
| 424 | 537 |
| 425 # Make the request on the httplib connection object | 538 # Make the request on the httplib connection object |
| 426 httplib_response = self._make_request(conn, method, url, | 539 httplib_response = self._make_request(conn, method, url, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 437 response = HTTPResponse.from_httplib(httplib_response, | 550 response = HTTPResponse.from_httplib(httplib_response, |
| 438 pool=self, | 551 pool=self, |
| 439 connection=response_conn, | 552 connection=response_conn, |
| 440 **response_kw) | 553 **response_kw) |
| 441 | 554 |
| 442 # else: | 555 # else: |
| 443 # The connection will be put back into the pool when | 556 # The connection will be put back into the pool when |
| 444 # ``response.release_conn()`` is called (implicitly by | 557 # ``response.release_conn()`` is called (implicitly by |
| 445 # ``response.read()``) | 558 # ``response.read()``) |
| 446 | 559 |
| 447 except Empty as e: | 560 except Empty: |
| 448 # Timed out by queue | 561 # Timed out by queue |
| 449 raise TimeoutError(self, url, | 562 raise ReadTimeoutError( |
| 450 "Request timed out. (pool_timeout=%s)" % | 563 self, url, "Read timed out, no pool connections are available.") |
| 451 pool_timeout) | |
| 452 | 564 |
| 453 except SocketTimeout as e: | 565 except SocketTimeout: |
| 454 # Timed out by socket | 566 # Timed out by socket |
| 455 raise TimeoutError(self, url, | 567 raise ReadTimeoutError(self, url, "Read timed out.") |
| 456 "Request timed out. (timeout=%s)" % | |
| 457 timeout) | |
| 458 | 568 |
| 459 except BaseSSLError as e: | 569 except BaseSSLError as e: |
| 460 # SSL certificate error | 570 # SSL certificate error |
| 571 if 'timed out' in str(e) or \ |
| 572 'did not complete (read)' in str(e): # Platform-specific: Python
2.6 |
| 573 raise ReadTimeoutError(self, url, "Read timed out.") |
| 461 raise SSLError(e) | 574 raise SSLError(e) |
| 462 | 575 |
| 463 except CertificateError as e: | 576 except CertificateError as e: |
| 464 # Name mismatch | 577 # Name mismatch |
| 465 raise SSLError(e) | 578 raise SSLError(e) |
| 466 | 579 |
| 467 except (HTTPException, SocketError) as e: | 580 except (HTTPException, SocketError) as e: |
| 581 if isinstance(e, SocketError) and self.proxy is not None: |
| 582 raise ProxyError('Cannot connect to proxy. ' |
| 583 'Socket error: %s.' % e) |
| 584 |
| 468 # Connection broken, discard. It will be replaced next _get_conn(). | 585 # Connection broken, discard. It will be replaced next _get_conn(). |
| 469 conn = None | 586 conn = None |
| 470 # This is necessary so we can access e below | 587 # This is necessary so we can access e below |
| 471 err = e | 588 err = e |
| 472 | 589 |
| 473 if retries == 0: | 590 if retries == 0: |
| 474 raise MaxRetryError(self, url, e) | 591 raise MaxRetryError(self, url, e) |
| 475 | 592 |
| 476 finally: | 593 finally: |
| 477 if release_conn: | 594 if release_conn: |
| (...skipping 28 matching lines...) Expand all Loading... |
| 506 class HTTPSConnectionPool(HTTPConnectionPool): | 623 class HTTPSConnectionPool(HTTPConnectionPool): |
| 507 """ | 624 """ |
| 508 Same as :class:`.HTTPConnectionPool`, but HTTPS. | 625 Same as :class:`.HTTPConnectionPool`, but HTTPS. |
| 509 | 626 |
| 510 When Python is compiled with the :mod:`ssl` module, then | 627 When Python is compiled with the :mod:`ssl` module, then |
| 511 :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, | 628 :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, |
| 512 instead of :class:`httplib.HTTPSConnection`. | 629 instead of :class:`httplib.HTTPSConnection`. |
| 513 | 630 |
| 514 :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, | 631 :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, |
| 515 ``assert_hostname`` and ``host`` in this order to verify connections. | 632 ``assert_hostname`` and ``host`` in this order to verify connections. |
| 633 If ``assert_hostname`` is False, no verification is done. |
| 516 | 634 |
| 517 The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs`` and | 635 The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs`` and |
| 518 ``ssl_version`` are only used if :mod:`ssl` is available and are fed into | 636 ``ssl_version`` are only used if :mod:`ssl` is available and are fed into |
| 519 :meth:`urllib3.util.ssl_wrap_socket` to upgrade the connection socket | 637 :meth:`urllib3.util.ssl_wrap_socket` to upgrade the connection socket |
| 520 into an SSL socket. | 638 into an SSL socket. |
| 521 """ | 639 """ |
| 522 | 640 |
| 523 scheme = 'https' | 641 scheme = 'https' |
| 524 | 642 |
| 525 def __init__(self, host, port=None, | 643 def __init__(self, host, port=None, |
| 526 strict=False, timeout=None, maxsize=1, | 644 strict=False, timeout=None, maxsize=1, |
| 527 block=False, headers=None, | 645 block=False, headers=None, |
| 646 _proxy=None, _proxy_headers=None, |
| 528 key_file=None, cert_file=None, cert_reqs=None, | 647 key_file=None, cert_file=None, cert_reqs=None, |
| 529 ca_certs=None, ssl_version=None, | 648 ca_certs=None, ssl_version=None, |
| 530 assert_hostname=None, assert_fingerprint=None): | 649 assert_hostname=None, assert_fingerprint=None): |
| 531 | 650 |
| 532 HTTPConnectionPool.__init__(self, host, port, | 651 HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, |
| 533 strict, timeout, maxsize, | 652 block, headers, _proxy, _proxy_headers) |
| 534 block, headers) | |
| 535 self.key_file = key_file | 653 self.key_file = key_file |
| 536 self.cert_file = cert_file | 654 self.cert_file = cert_file |
| 537 self.cert_reqs = cert_reqs | 655 self.cert_reqs = cert_reqs |
| 538 self.ca_certs = ca_certs | 656 self.ca_certs = ca_certs |
| 539 self.ssl_version = ssl_version | 657 self.ssl_version = ssl_version |
| 540 self.assert_hostname = assert_hostname | 658 self.assert_hostname = assert_hostname |
| 541 self.assert_fingerprint = assert_fingerprint | 659 self.assert_fingerprint = assert_fingerprint |
| 542 | 660 |
| 661 def _prepare_conn(self, connection): |
| 662 """ |
| 663 Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` |
| 664 and establish the tunnel if proxy is used. |
| 665 """ |
| 666 |
| 667 if isinstance(connection, VerifiedHTTPSConnection): |
| 668 connection.set_cert(key_file=self.key_file, |
| 669 cert_file=self.cert_file, |
| 670 cert_reqs=self.cert_reqs, |
| 671 ca_certs=self.ca_certs, |
| 672 assert_hostname=self.assert_hostname, |
| 673 assert_fingerprint=self.assert_fingerprint) |
| 674 connection.ssl_version = self.ssl_version |
| 675 |
| 676 if self.proxy is not None: |
| 677 # Python 2.7+ |
| 678 try: |
| 679 set_tunnel = connection.set_tunnel |
| 680 except AttributeError: # Platform-specific: Python 2.6 |
| 681 set_tunnel = connection._set_tunnel |
| 682 set_tunnel(self.host, self.port, self.proxy_headers) |
| 683 # Establish tunnel connection early, because otherwise httplib |
| 684 # would improperly set Host: header to proxy's IP:port. |
| 685 connection.connect() |
| 686 |
| 687 return connection |
| 688 |
| 543 def _new_conn(self): | 689 def _new_conn(self): |
| 544 """ | 690 """ |
| 545 Return a fresh :class:`httplib.HTTPSConnection`. | 691 Return a fresh :class:`httplib.HTTPSConnection`. |
| 546 """ | 692 """ |
| 547 self.num_connections += 1 | 693 self.num_connections += 1 |
| 548 log.info("Starting new HTTPS connection (%d): %s" | 694 log.info("Starting new HTTPS connection (%d): %s" |
| 549 % (self.num_connections, self.host)) | 695 % (self.num_connections, self.host)) |
| 550 | 696 |
| 697 actual_host = self.host |
| 698 actual_port = self.port |
| 699 if self.proxy is not None: |
| 700 actual_host = self.proxy.host |
| 701 actual_port = self.proxy.port |
| 702 |
| 551 if not ssl: # Platform-specific: Python compiled without +ssl | 703 if not ssl: # Platform-specific: Python compiled without +ssl |
| 552 if not HTTPSConnection or HTTPSConnection is object: | 704 if not HTTPSConnection or HTTPSConnection is object: |
| 553 raise SSLError("Can't connect to HTTPS URL because the SSL " | 705 raise SSLError("Can't connect to HTTPS URL because the SSL " |
| 554 "module is not available.") | 706 "module is not available.") |
| 707 connection_class = HTTPSConnection |
| 708 else: |
| 709 connection_class = VerifiedHTTPSConnection |
| 555 | 710 |
| 556 return HTTPSConnection(host=self.host, | 711 extra_params = {} |
| 557 port=self.port, | 712 if not six.PY3: # Python 2 |
| 558 strict=self.strict) | 713 extra_params['strict'] = self.strict |
| 714 connection = connection_class(host=actual_host, port=actual_port, |
| 715 timeout=self.timeout.connect_timeout, |
| 716 **extra_params) |
| 559 | 717 |
| 560 connection = VerifiedHTTPSConnection(host=self.host, | 718 return self._prepare_conn(connection) |
| 561 port=self.port, | |
| 562 strict=self.strict) | |
| 563 connection.set_cert(key_file=self.key_file, cert_file=self.cert_file, | |
| 564 cert_reqs=self.cert_reqs, ca_certs=self.ca_certs, | |
| 565 assert_hostname=self.assert_hostname, | |
| 566 assert_fingerprint=self.assert_fingerprint) | |
| 567 | |
| 568 connection.ssl_version = self.ssl_version | |
| 569 | |
| 570 return connection | |
| 571 | 719 |
| 572 | 720 |
| 573 def connection_from_url(url, **kw): | 721 def connection_from_url(url, **kw): |
| 574 """ | 722 """ |
| 575 Given a url, return an :class:`.ConnectionPool` instance of its host. | 723 Given a url, return an :class:`.ConnectionPool` instance of its host. |
| 576 | 724 |
| 577 This is a shortcut for not having to parse out the scheme, host, and port | 725 This is a shortcut for not having to parse out the scheme, host, and port |
| 578 of the url before creating an :class:`.ConnectionPool` instance. | 726 of the url before creating an :class:`.ConnectionPool` instance. |
| 579 | 727 |
| 580 :param url: | 728 :param url: |
| 581 Absolute URL string that must include the scheme. Port is optional. | 729 Absolute URL string that must include the scheme. Port is optional. |
| 582 | 730 |
| 583 :param \**kw: | 731 :param \**kw: |
| 584 Passes additional parameters to the constructor of the appropriate | 732 Passes additional parameters to the constructor of the appropriate |
| 585 :class:`.ConnectionPool`. Useful for specifying things like | 733 :class:`.ConnectionPool`. Useful for specifying things like |
| 586 timeout, maxsize, headers, etc. | 734 timeout, maxsize, headers, etc. |
| 587 | 735 |
| 588 Example: :: | 736 Example: :: |
| 589 | 737 |
| 590 >>> conn = connection_from_url('http://google.com/') | 738 >>> conn = connection_from_url('http://google.com/') |
| 591 >>> r = conn.request('GET', '/') | 739 >>> r = conn.request('GET', '/') |
| 592 """ | 740 """ |
| 593 scheme, host, port = get_host(url) | 741 scheme, host, port = get_host(url) |
| 594 if scheme == 'https': | 742 if scheme == 'https': |
| 595 return HTTPSConnectionPool(host, port=port, **kw) | 743 return HTTPSConnectionPool(host, port=port, **kw) |
| 596 else: | 744 else: |
| 597 return HTTPConnectionPool(host, port=port, **kw) | 745 return HTTPConnectionPool(host, port=port, **kw) |
| OLD | NEW |