- ... [Short description of non-trivial change.] (Issue #)
- Rely on
httplibto work around conflicts with other Python 3 shims. (Issue #688)
- Add support for directories of certificate authorities, as supported by OpenSSL. (Issue #701)
'CERT_REQUIRED'. (Issue #650)
pip install urllib3[secure]will install Certifi and PyOpenSSL as dependencies. (Issue #678)
HTTPHeaderDictusable as a
headersinput value (Issues #632, #679)
- Added urllib3.contrib.appengine
which has an
URLFetchin a Google AppEngine environment. (Issue #664)
- Dev: Added test suite for AppEngine. (Issue #631)
- Fix performance regression when using PyOpenSSL. (Issue #626)
- Passing incorrect scheme (e.g.
foo://) will raise
AssertionError(backwards compatible for now, but please migrate). (Issue #640)
- Fix pools not getting replenished when an error occurs during a
release_conn=False. (Issue #644)
- Fix pool-default headers not applying for url-encoded requests like GET. (Issue #657)
- log.warning in Python 3 when headers are skipped due to parsing errors. (Issue #642)
- Close and discard connections if an error occurs during read. (Issue #660)
- Fix host parsing for IPv6 proxies. (Issue #668)
- Separate warning type SubjectAltNameWarning, now issued once per host. (Issue #671)
httplib.IncompleteReadnot getting converted to
- Migrate tests to Tornado 4. (Issue #594)
- Append default warning configuration rather than overwrite. (Issue #603)
- Fix streaming decoding regression. (Issue #595)
- Fix chunked requests losing state across keep-alive connections. (Issue #599)
- Fix hanging when chunked HEAD response has no body. (Issue #605)
InsecurePlatformWarningwhen SSLContext object is missing. (Issue #558)
- Fix regression of duplicate header keys being discarded. (Issue #563)
Response.stream()returns a generator for chunked responses. (Issue #560)
- Set upper-bound timeout when waiting for a socket in PyOpenSSL. (Issue #585)
- Work on platforms without ssl module for plain HTTP requests. (Issue #587)
- Stop relying on the stdlib's default cipher list. (Issue #588)
- Fix file descriptor leakage on retries. (Issue #548)
- Removed RC4 from default cipher list. (Issue #551)
- Header performance improvements. (Issue #544)
- Fix PoolManager not obeying redirect retry settings. (Issue #553)
- Pools can be used as context managers. (Issue #545)
- Don't re-use connections which experienced an SSLError. (Issue #529)
- Don't fail when gzip decoding an empty stream. (Issue #535)
- Add sha256 support for fingerprint verification. (Issue #540)
- Fixed handling of header values containing commas. (Issue #533)
- Disabled SSLv3. (Issue #473)
Url.urlproperty to return the composed url string. (Issue #394)
- Fixed PyOpenSSL + gevent
WantWriteError. (Issue #412)
MaxRetryError.reasonwill always be an exception, not string. (Issue #481)
- Fixed SSL-related timeouts not being detected as timeouts. (Issue #492)
- Py3: Use
ssl.create_default_context()when available. (Issue #473)
InsecureRequestWarningfor every insecure HTTPS request. (Issue #496)
SecurityWarningwhen certificate has no
subjectAltName. (Issue #499)
- Close and discard sockets which experienced SSL-related errors. (Issue #501)
.request(...). (Issue #513)
- Respect timeout with HTTPS proxy. (Issue #505)
- PyOpenSSL: Handle ZeroReturnError exception. (Issue #520)
- Apply socket arguments before binding. (Issue #427)
- More careful checks if fp-like object is closed. (Issue #435)
- Fixed packaging issues of some development-related files not getting included. (Issue #440)
- Allow performing only fingerprint verification. (Issue #444)
SecurityWarningif system clock is waaay off. (Issue #445)
- Fixed PyOpenSSL compatibility with PyPy. (Issue #450)
ConnectionErrorhandling in Py3. (Issue #443)
- Shuffled around development-related files. If you're maintaining a distro package of urllib3, you may need to tweak things. (Issue #415)
- Unverified HTTPS requests will trigger a warning on the first request. See our new security documentation for details. (Issue #426)
- New retry logic and
urllib3.util.retry.Retryconfiguration object. (Issue #326)
- All raised exceptions should now wrapped in a
urllib3.exceptions.HTTPException-extending exception. (Issue #326)
- All errors during a retry-enabled request should be wrapped in
urllib3.exceptions.MaxRetryError, including timeout-related exceptions which were previously exempt. Underlying error is accessible from the
.reasonpropery. (Issue #326)
urllib3.exceptions.ProtocolError. (Issue #326)
- Errors during response read (such as IncompleteRead) are now wrapped in
urllib3.exceptions.ProtocolError. (Issue #418)
- Requesting an empty host will raise
urllib3.exceptions.LocationValueError. (Issue #417)
- Catch read timeouts over SSL connections as
urllib3.exceptions.ReadTimeoutError. (Issue #419)
- Apply socket arguments before connecting. (Issue #427)
- Fix TLS verification when using a proxy in Python 3.4.1. (Issue #385)
urllib3.util.make_headers. (Issue #393)
urllib3.exceptions.ReadTimeoutError. (Issue #399)
- Fixed proxy-related bug where connections were being reused incorrectly. (Issues #366, #369)
socket_optionskeyword parameter which allows to define
setsockoptconfiguration of new sockets. (Issue #397)
HTTPConnection.tcp_nodelayin favor of
HTTPConnection.default_socket_options. (Issue #397)
TypeErrorbug in Python 2.6.4. (Issue #411)
urllib3.utilnot being included in the package.
- Fix AppEngine bug of HTTPS requests going out as HTTP. (Issue #356)
- Don't install
site-packagesas it's only needed for the test suite. (Issue #362)
- Added support for specifying
source_address. (Issue #352)
- Improved url parsing in
urllib3.util.parse_url(properly parse '@' in username, and blank ports like 'hostname:').
urllib3.connectionmodule which contains all the HTTPConnection objects.
urllib3.util.Timeout-related fixes. Also changed constructor signature to a more sensible order. [Backwards incompatible] (Issues #252, #262, #263)
backports.ssl_match_hostnameif it's installed. (Issue #274)
urllib3.response.HTTPResponsewhich returns the number of bytes read so far. (Issue #277)
- Support for platforms without threading. (Issue #289)
- Expand default-port comparison in
HTTPConnectionPool.is_same_hostto allow a pool with no specified port to be considered equal to to an HTTP/HTTPS url with port 80/443 explicitly provided. (Issue #305)
- Improved default SSL/TLS settings to avoid vulnerabilities. (Issue #309)
urllib3.poolmanager.ProxyManagernot retrying on connect errors. (Issue #310)
- Disable Nagle's Algorithm on the socket for non-proxies. A subset of requests will send the entire HTTP request ~200 milliseconds faster; however, some of the resulting TCP packets will be smaller. (Issue #254)
- Increased maximum number of SubjectAltNames in
urllib3.contrib.pyopensslfrom the default 64 to 1024 in a single certificate. (Issue #318)
- Headers are now passed and stored as a custom
urllib3.collections_.HTTPHeaderDictobject rather than a plain
dict. (Issue #329, #333)
- Headers no longer lose their case on Python 3. (Issue #236)
urllib3.contrib.pyopensslnow uses the operating system's default CA certificates on inject. (Issue #332)
- Requests with
retries=Falsewill immediately raise any exceptions without wrapping them in
MaxRetryError. (Issue #348)
- Fixed open socket leak with SSL-related failures. (Issue #344, #348)
- Added granular timeout support with new
urllib3.util.Timeoutclass. (Issue #231)
- Fixed Python 3.4 support. (Issue #238)
- More exceptions are now pickle-able, with tests. (Issue #174)
- Fixed redirecting with relative URLs in Location header. (Issue #178)
- Support for relative urls in
Location: ...header. (Issue #179)
urllib3.response.HTTPResponsenow inherits from
io.IOBasefor bonus file-like functionality. (Issue #187)
assert_hostname=Falsewhen creating a HTTPSConnectionPool will skip hostname verification for SSL connections. (Issue #194)
- New method
urllib3.response.HTTPResponse.stream(...)which acts as a generator wrapped around
.read(...). (Issue #198)
- IPv6 url parsing enforces brackets around the hostname. (Issue #199)
- Fixed thread race condition in
ProxyManagerrequests now include non-default port in
Host: ...header. (Issue #217)
- Added HTTPS proxy support in
ProxyManager. (Issue #170 #139)
RequestFieldobject can be passed to the
fields=...param which can specify headers. (Issue #220)
urllib3.exceptions.ProxyErrorwhen connecting to proxy fails. (Issue #221)
- Use international headers when posting file names. (Issue #119)
- Improved IPv6 support. (Issue #203)
- Contrib: Optional SNI support for Py2 using PyOpenSSL. (Issue #156)
Host: ...header if not given.
- Improved SSL-related code.
cert_reqnow optionally takes a string like "REQUIRED" or "NONE". Same with
ssl_versiontakes strings like "SSLv23" The string values reflect the suffix of the respective constant variable. (Issue #130)
socksipynow based on Anorov's fork which handles unexpectedly closed proxy connections and larger read buffers. (Issue #135)
- Ensure the connection is closed if no data is received, fixes connection leak on some platforms. (Issue #133)
- Added SNI support for SSL/TLS connections on Py32+. (Issue #89)
- Tests fixed to be compatible with Py26 again. (Issue #125)
- Added ability to choose SSL version by passing an
ssl.PROTOCOL_*constant to the
HTTPSConnectionPool. (Issue #109)
- Allow an explicit content type to be specified when encoding file fields. (Issue #126)
- Exceptions are now pickleable, with tests. (Issue #101)
- Fixed default headers not getting passed in some cases. (Issue #99)
- Treat "content-encoding" header value as case-insensitive, per RFC 2616 Section 3.5. (Issue #110)
- "Connection Refused" SocketErrors will get retried rather than raised. (Issue #92)
- Updated vendored
six, no longer overrides the global
sixmodule namespace. (Issue #113)
reasonproperty holding the exception that prompted the final retry. If
reason is Nonethen it was due to a redirect. (Issue #92, #114)
PoolManager.urlopen()from not redirecting more than once. (Issue #149)
- Don't assume
Content-Type: text/plainfor multi-part encoding parameters that are not files. (Issue #111)
- Pass strict param down to
httplib.HTTPConnection. (Issue #122)
- Added mechanism to verify SSL certificates by fingerprint (md5, sha1) or against an arbitrary hostname (when connecting by IP or for misconfigured servers). (Issue #140)
- Streaming decompression support. (Issue #159)
urllib3.add_stderr_logger()for quickly enabling STDERR debug logging in urllib3.
- Native full URL parsing (including auth, path, query, fragment) available in
- Built-in redirect will switch method to 'GET' if status code is 303. (Issue #11)
urllib3.PoolManagerstrips the scheme and host before sending the request uri. (Issue #8)
urllib3.exceptions.DecodeErrorexception for when automatic decoding, based on the Content-Type header, fails.
- Fixed bug with pool depletion and leaking connections (Issue #76). Added
explicit connection closing on pool eviction. Added
- 99% -> 100% unit test coverage.
- Minor AppEngine-related fixes.
- Switched from
- Improved url parsing. (Issue #73)
- IPv6 url support. (Issue #72)
- Removed pre-1.0 deprecated API.
- Refactored helpers into a
- Fixed multipart encoding to support list-of-tuples for keys with multiple values. (Issue #48)
- Fixed multiple Set-Cookie headers in response not getting merged properly in Python 3. (Issue #53)
- AppEngine support with Py27. (Issue #61)
encode_multipart_formdatafixes related to Python 3 strings vs bytes.
- Fixed packaging bug of not shipping
test-requirements.txt. (Issue #47)
- Fixed another bug related to when
sslmodule is not available. (Issue #41)
- Location parsing errors now raise
urllib3.exceptions.LocationParseErrorwhich inherits from
- Added Python 3 support (tested on 3.2.2)
- Dropped Python 2.5 support (tested on 2.6.7, 2.7.2)
select.selectfor platforms that support it.
Queue.Queuefor more aggressive connection reusing. Configurable by overriding
ImportErrorduring install when
sslmodule is not available. (Issue #41)
PoolManagerredirects between schemes (such as HTTP -> HTTPS) not completing properly. (Issue #28, uncovered by Issue #10 in v1.1)
eventlet. Removed extraneous unsupported dummyserver testing backends. Added socket-level tests.
- More tests. Achievement Unlocked: 99% Coverage.
dummyserverto its own root namespace module (used for testing).
- Added hostname verification for
VerifiedHTTPSConnectionby vendoring in Py32's
ssl_match_hostname. (Issue #25)
- Fixed cross-host HTTP redirects when using
PoolManager. (Issue #10)
decode_contentbeing ignored when set through
urlopen. (Issue #27)
- Fixed timeout-related bugs. (Issues #17, #23)
- Fixed typo in
VerifiedHTTPSConnectionwhich would only present as a bug if you're using the object manually. (Thanks pyos)
- Made RecentlyUsedContainer (and consequently PoolManager) more thread-safe by wrapping the access log in a mutex. (Thanks @christer)
- Made RecentlyUsedContainer more dict-like (corrected
__getitem__behaviour), with tests. Shouldn't affect core urllib3 code.
- Fixed a bug where the same connection would get returned into the pool twice, causing extraneous "HttpConnectionPool is full" log warnings.
PoolManagerwith LRU expiration of connections (tested and documented).
ProxyManager(needs tests, docs, and confirmation that it works with HTTPS proxies).
- Added optional partial-read support for responses when
preload_content=False. You can now make requests and just read the headers without loading the content.
- Made response decoding optional (default on, same as before).
- Added optional explicit boundary string for
- Convenience request methods are now inherited from
RequestMethods. Old helpers like
post_urlshould be abandoned in favour of the new
request(method, url, ...).
- Refactored code to be even more decoupled, reusable, and extendable.
- License header added to
- Embiggened the documentation: Lots of Sphinx-friendly docstrings in the code
and docs in
docs/and on urllib3.readthedocs.org.
- Embettered all the things!
- Started writing this file.
- Minor bug fixes, code cleanup.
- Better unicode support.
- Minor improvements.
assert_host_nameoptional parameter. Now compatible with proxies.
- Added HTTPS support.
- Minor bug fixes.
- Refactored, broken backwards compatibility with 0.2.
- API to be treated as stable from this version forward.
- Added unit tests.
- Bug fixes.
- First release.