Browse Source

Upgrade urllib3 to 1.26.12 due to critical CVEs (#3181)

Co-authored-by: Athithyaa Selvam <aselvam@cloudera.com>
Athithyaa Selvam 2 years ago
parent
commit
559106f683
100 changed files with 4355 additions and 3822 deletions
  1. 0 286
      desktop/core/ext-py/urllib3-1.25.8/CONTRIBUTORS.txt
  2. 0 1229
      desktop/core/ext-py/urllib3-1.25.8/PKG-INFO
  3. 0 17
      desktop/core/ext-py/urllib3-1.25.8/dev-requirements.txt
  4. 0 1
      desktop/core/ext-py/urllib3-1.25.8/docs/_templates/fonts.html
  5. 0 291
      desktop/core/ext-py/urllib3-1.25.8/docs/advanced-usage.rst
  6. 0 274
      desktop/core/ext-py/urllib3-1.25.8/docs/conf.py
  7. 0 144
      desktop/core/ext-py/urllib3-1.25.8/docs/contributing.rst
  8. 0 90
      desktop/core/ext-py/urllib3-1.25.8/docs/reference/index.rst
  9. 0 37
      desktop/core/ext-py/urllib3-1.25.8/docs/reference/urllib3.contrib.rst
  10. 0 70
      desktop/core/ext-py/urllib3-1.25.8/docs/reference/urllib3.util.rst
  11. 0 24
      desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/README.rst
  12. 0 15
      desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/cacert.key
  13. 0 23
      desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/cacert.pem
  14. 0 17
      desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/client_bad.pem
  15. 0 33
      desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/client_intermediate.pem
  16. 0 18
      desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/client_password.key
  17. 0 36
      desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/server.combined.pem
  18. 0 21
      desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/server.crt
  19. 0 22
      desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/server.csr
  20. 0 15
      desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/server.key
  21. 0 12
      desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/server.key.org
  22. 0 18
      desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/server_password.key
  23. 0 5
      desktop/core/ext-py/urllib3-1.25.8/src/urllib3/packages/__init__.py
  24. 0 19
      desktop/core/ext-py/urllib3-1.25.8/src/urllib3/packages/ssl_match_hostname/__init__.py
  25. 0 127
      desktop/core/ext-py/urllib3-1.25.8/test/conftest.py
  26. 0 52
      desktop/core/ext-py/urllib3-1.25.8/test/test_connection.py
  27. 0 45
      desktop/core/ext-py/urllib3-1.25.8/test/test_proxymanager.py
  28. 0 367
      desktop/core/ext-py/urllib3-1.25.8/test/with_dummyserver/test_proxy_poolmanager.py
  29. 219 12
      desktop/core/ext-py/urllib3-1.26.12/CHANGES.rst
  30. 1 1
      desktop/core/ext-py/urllib3-1.26.12/LICENSE.txt
  31. 1 1
      desktop/core/ext-py/urllib3-1.26.12/MANIFEST.in
  32. 1438 0
      desktop/core/ext-py/urllib3-1.26.12/PKG-INFO
  33. 41 25
      desktop/core/ext-py/urllib3-1.26.12/README.rst
  34. 20 0
      desktop/core/ext-py/urllib3-1.26.12/dev-requirements.txt
  35. 0 0
      desktop/core/ext-py/urllib3-1.26.12/docs/Makefile
  36. 1 1
      desktop/core/ext-py/urllib3-1.26.12/docs/_static/banner.svg
  37. 1 0
      desktop/core/ext-py/urllib3-1.26.12/docs/_static/dark-logo.svg
  38. 503 0
      desktop/core/ext-py/urllib3-1.26.12/docs/advanced-usage.rst
  39. 90 0
      desktop/core/ext-py/urllib3-1.26.12/docs/conf.py
  40. 177 0
      desktop/core/ext-py/urllib3-1.26.12/docs/contributing.rst
  41. 0 0
      desktop/core/ext-py/urllib3-1.26.12/docs/images/demo-button.png
  42. BIN
      desktop/core/ext-py/urllib3-1.26.12/docs/images/favicon.png
  43. 0 0
      desktop/core/ext-py/urllib3-1.26.12/docs/images/learn-more-button.png
  44. 0 0
      desktop/core/ext-py/urllib3-1.26.12/docs/images/logo.png
  45. 0 0
      desktop/core/ext-py/urllib3-1.26.12/docs/images/logo.svg
  46. 45 17
      desktop/core/ext-py/urllib3-1.26.12/docs/index.rst
  47. 0 0
      desktop/core/ext-py/urllib3-1.26.12/docs/make.bat
  48. 7 0
      desktop/core/ext-py/urllib3-1.26.12/docs/reference/contrib/appengine.rst
  49. 13 0
      desktop/core/ext-py/urllib3-1.26.12/docs/reference/contrib/index.rst
  50. 7 0
      desktop/core/ext-py/urllib3-1.26.12/docs/reference/contrib/ntlmpool.rst
  51. 10 0
      desktop/core/ext-py/urllib3-1.26.12/docs/reference/contrib/pyopenssl.rst
  52. 28 0
      desktop/core/ext-py/urllib3-1.26.12/docs/reference/contrib/securetransport.rst
  53. 7 0
      desktop/core/ext-py/urllib3-1.26.12/docs/reference/contrib/socks.rst
  54. 14 0
      desktop/core/ext-py/urllib3-1.26.12/docs/reference/index.rst
  55. 11 0
      desktop/core/ext-py/urllib3-1.26.12/docs/reference/urllib3.connection.rst
  56. 17 0
      desktop/core/ext-py/urllib3-1.26.12/docs/reference/urllib3.connectionpool.rst
  57. 7 0
      desktop/core/ext-py/urllib3-1.26.12/docs/reference/urllib3.exceptions.rst
  58. 18 0
      desktop/core/ext-py/urllib3-1.26.12/docs/reference/urllib3.fields.rst
  59. 12 0
      desktop/core/ext-py/urllib3-1.26.12/docs/reference/urllib3.poolmanager.rst
  60. 7 0
      desktop/core/ext-py/urllib3-1.26.12/docs/reference/urllib3.request.rst
  61. 22 0
      desktop/core/ext-py/urllib3-1.26.12/docs/reference/urllib3.response.rst
  62. 17 0
      desktop/core/ext-py/urllib3-1.26.12/docs/reference/urllib3.util.rst
  63. 2 2
      desktop/core/ext-py/urllib3-1.26.12/docs/requirements.txt
  64. 78 0
      desktop/core/ext-py/urllib3-1.26.12/docs/sponsors.rst
  65. 177 76
      desktop/core/ext-py/urllib3-1.26.12/docs/user-guide.rst
  66. 177 0
      desktop/core/ext-py/urllib3-1.26.12/docs/v2-roadmap.rst
  67. 0 0
      desktop/core/ext-py/urllib3-1.26.12/dummyserver/__init__.py
  68. 17 0
      desktop/core/ext-py/urllib3-1.26.12/dummyserver/certs/README.rst
  69. 27 0
      desktop/core/ext-py/urllib3-1.26.12/dummyserver/certs/cacert.key
  70. 21 0
      desktop/core/ext-py/urllib3-1.26.12/dummyserver/certs/cacert.pem
  71. 21 0
      desktop/core/ext-py/urllib3-1.26.12/dummyserver/certs/server.crt
  72. 27 0
      desktop/core/ext-py/urllib3-1.26.12/dummyserver/certs/server.key
  73. 18 14
      desktop/core/ext-py/urllib3-1.26.12/dummyserver/handlers.py
  74. 10 2
      desktop/core/ext-py/urllib3-1.26.12/dummyserver/proxy.py
  75. 76 28
      desktop/core/ext-py/urllib3-1.26.12/dummyserver/server.py
  76. 77 6
      desktop/core/ext-py/urllib3-1.26.12/dummyserver/testcase.py
  77. 7 1
      desktop/core/ext-py/urllib3-1.26.12/setup.cfg
  78. 28 17
      desktop/core/ext-py/urllib3-1.26.12/setup.py
  79. 26 10
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/__init__.py
  80. 5 4
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/_collections.py
  81. 2 0
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/_version.py
  82. 216 63
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/connection.py
  83. 151 92
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/connectionpool.py
  84. 0 0
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/__init__.py
  85. 0 0
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/_appengine_environ.py
  86. 0 0
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/_securetransport/__init__.py
  87. 44 18
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/_securetransport/bindings.py
  88. 72 3
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/_securetransport/low_level.py
  89. 6 6
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/appengine.py
  90. 9 0
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/ntlmpool.py
  91. 37 16
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/pyopenssl.py
  92. 75 13
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/securetransport.py
  93. 14 8
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/socks.py
  94. 106 38
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/exceptions.py
  95. 3 2
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/fields.py
  96. 2 2
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/filepost.py
  97. 0 0
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/packages/__init__.py
  98. 0 0
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/packages/backports/__init__.py
  99. 0 1
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/packages/backports/makefile.py
  100. 90 35
      desktop/core/ext-py/urllib3-1.26.12/src/urllib3/packages/six.py

+ 0 - 286
desktop/core/ext-py/urllib3-1.25.8/CONTRIBUTORS.txt

@@ -1,286 +0,0 @@
-# Contributions to the urllib3 project
-
-## Creator & Maintainer
-
-* Andrey Petrov <andrey.petrov@shazow.net>
-
-
-## Contributors
-
-In chronological order:
-
-* victor.vde <http://code.google.com/u/victor.vde/>
-  * HTTPS patch (which inspired HTTPSConnectionPool)
-
-* erikcederstrand <http://code.google.com/u/erikcederstrand/>
-  * NTLM-authenticated HTTPSConnectionPool
-  * Basic-authenticated HTTPSConnectionPool (merged into make_headers)
-
-* niphlod <niphlod@gmail.com>
-  * Client-verified SSL certificates for HTTPSConnectionPool
-  * Response gzip and deflate encoding support
-  * Better unicode support for filepost using StringIO buffers
-
-* btoconnor <brian@btoconnor.net>
-  * Non-multipart encoding for POST requests
-
-* p.dobrogost <http://code.google.com/u/@WBRSRlBZDhBFXQB6/>
-  * Code review, PEP8 compliance, benchmark fix
-
-* kennethreitz <me@kennethreitz.com>
-  * Bugfixes, suggestions, Requests integration
-
-* georgemarshall <https://github.com/georgemarshall>
-  * Bugfixes, Improvements and Test coverage
-
-* Thomas Kluyver <thomas@kluyver.me.uk>
-  * Python 3 support
-
-* brandon-rhodes <http://rhodesmill.org/brandon>
-  * Design review, bugfixes, test coverage.
-
-* studer <theo.studer@gmail.com>
-  * IPv6 url support and test coverage
-
-* Shivaram Lingamneni <slingamn@cs.stanford.edu>
-  * Support for explicitly closing pooled connections
-
-* hartator <hartator@gmail.com>
-  * Corrected multipart behavior for params
-
-* Thomas Weißschuh <thomas@t-8ch.de>
-  * Support for TLS SNI
-  * API unification of ssl_version/cert_reqs
-  * SSL fingerprint and alternative hostname verification
-  * Bugfixes in testsuite
-
-* Sune Kirkeby <mig@ibofobi.dk>
-  * Optional SNI-support for Python 2 via PyOpenSSL.
-
-* Marc Schlaich <marc.schlaich@gmail.com>
-  * Various bugfixes and test improvements.
-
-* Bryce Boe <bbzbryce@gmail.com>
-  * Correct six.moves conflict
-  * Fixed pickle support of some exceptions
-
-* Boris Figovsky <boris.figovsky@ravellosystems.com>
-  * Allowed to skip SSL hostname verification
-
-* Cory Benfield <https://lukasa.co.uk/about/>
-  * Stream method for Response objects.
-  * Return native strings in header values.
-  * Generate 'Host' header when using proxies.
-
-* Jason Robinson <jaywink@basshero.org>
-  * Add missing WrappedSocket.fileno method in PyOpenSSL
-
-* Audrius Butkevicius <audrius.butkevicius@elastichosts.com>
-  * Fixed a race condition
-
-* Stanislav Vitkovskiy <stas.vitkovsky@gmail.com>
-  * Added HTTPS (CONNECT) proxy support
-
-* Stephen Holsapple <sholsapp@gmail.com>
-  * Added abstraction for granular control of request fields
-
-* Martin von Gagern <Martin.vGagern@gmx.net>
-  * Support for non-ASCII header parameters
-
-* Kevin Burke <kev@inburke.com> and Pavel Kirichenko <juanych@yandex-team.ru>
-  * Support for separate connect and request timeouts
-
-* Peter Waller <p@pwaller.net>
-  * HTTPResponse.tell() for determining amount received over the wire
-
-* Nipunn Koorapati <nipunn1313@gmail.com>
-  * Ignore default ports when comparing hosts for equality
-
-* Danilo @dbrgn <https://dbrgn.ch/>
-  * Disabled TLS compression by default on Python 3.2+
-  * Disabled TLS compression in pyopenssl contrib module
-  * Configurable cipher suites in pyopenssl contrib module
-
-* Roman Bogorodskiy <roman.bogorodskiy@ericsson.com>
-  * Account retries on proxy errors
-
-* Nicolas Delaby <nicolas.delaby@ezeep.com>
-  * Use the platform-specific CA certificate locations
-
-* Josh Schneier <https://github.com/jschneier>
-  * HTTPHeaderDict and associated tests and docs
-  * Bugfixes, docs, test coverage
-
-* Tahia Khan <http://tahia.tk/>
-  * Added Timeout examples in docs
-
-* Arthur Grunseid <https://grunseid.com>
-  * source_address support and tests (with https://github.com/bui)
-
-* Ian Cordasco <graffatcolmingov@gmail.com>
-  * PEP8 Compliance and Linting
-  * Add ability to pass socket options to an HTTP Connection
-
-* Erik Tollerud <erik.tollerud@gmail.com>
-  * Support for standard library io module.
-
-* Krishna Prasad <kprasad.iitd@gmail.com>
-  * Google App Engine documentation
-
-* Aaron Meurer <asmeurer@gmail.com>
-  * Added Url.url, which unparses a Url
-
-* Evgeny Kapun <abacabadabacaba@gmail.com>
-  * Bugfixes
-
-* Benjamen Meyer <bm_witness@yahoo.com>
-  * Security Warning Documentation update for proper capture
-
-* Shivan Sornarajah <github@sornars.com>
-  * Support for using ConnectionPool and PoolManager as context managers.
-
-* Alex Gaynor <alex.gaynor@gmail.com>
-  * Updates to the default SSL configuration
-
-* Tomas Tomecek <ttomecek@redhat.com>
-  * Implemented generator for getting chunks from chunked responses.
-
-* tlynn <https://github.com/tlynn>
-  * Respect the warning preferences at import.
-
-* David D. Riddle <ddriddle@illinois.edu>
-  * IPv6 bugfixes in testsuite
-
-* Thea Flowers <magicalgirl@google.com>
-  * App Engine environment tests.
-  * Documentation re-write.
-
-* John Krauss <https://github.com/talos>
-  * Clues to debugging problems with `cryptography` dependency in docs
-
-* Disassem <https://github.com/Disassem>
-  * Fix pool-default headers not applying for url-encoded requests like GET.
-
-* James Atherfold <jlatherfold@hotmail.com>
-  * Bugfixes relating to cleanup of connections during errors.
-
-* Christian Pedersen <https://github.com/chripede>
-  * IPv6 HTTPS proxy bugfix
-
-* Jordan Moldow <https://github.com/jmoldow>
-  * Fix low-level exceptions leaking from ``HTTPResponse.stream()``.
-  * Bugfix for ``ConnectionPool.urlopen(release_conn=False)``.
-  * Creation of ``HTTPConnectionPool.ResponseCls``.
-
-* Predrag Gruevski <https://github.com/obi1kenobi>
-  * Made cert digest comparison use a constant-time algorithm.
-
-* Adam Talsma <https://github.com/a-tal>
-  * Bugfix to ca_cert file paths.
-
-* Evan Meagher <https://evanmeagher.net>
-  * Bugfix related to `memoryview` usage in PyOpenSSL adapter
-
-* John Vandenberg <jayvdb@gmail.com>
-  * Python 2.6 fixes; pyflakes and pep8 compliance
-
-* Andy Caldwell <andy.m.caldwell@googlemail.com>
-  * Bugfix related to reusing connections in indeterminate states.
-
-* Ville Skyttä <ville.skytta@iki.fi>
-  * Logging efficiency improvements, spelling fixes, Travis config.
-
-* Shige Takeda <smtakeda@gmail.com>
-  * Started Recipes documentation and added a recipe about handling concatenated gzip data in HTTP response
-
-* Jess Shapiro <jesse@jesseshapiro.net>
-  * Various character-encoding fixes/tweaks
-  * Disabling IPv6 DNS when IPv6 connections not supported
-
-* David Foster <http://dafoster.net/>
-  * Ensure order of request and response headers are preserved.
-
-* Jeremy Cline <jeremy@jcline.org>
-  * Added connection pool keys by scheme
-
-* Aviv Palivoda <palaviv@gmail.com>
-  * History list to Retry object.
-  * HTTPResponse contains the last Retry object.
-
-* Nate Prewitt <nate.prewitt@gmail.com>
-  * Ensure timeouts are not booleans and greater than zero.
-  * Fixed infinite loop in ``stream`` when amt=None.
-  * Added length_remaining to determine remaining data to be read.
-  * Added enforce_content_length to raise exception when incorrect content-length received.
-
-* Seth Michael Larson <sethmichaellarson@protonmail.com>
-  * Created selectors backport that supports PEP 475.
-
-* Alexandre Dias <alex.dias@smarkets.com>
-  * Don't retry on timeout if method not in whitelist
-
-* Moinuddin Quadri <moin18@gmail.com>
-  * Lazily load idna package
-
-* Tom White <s6yg1ez3@mail2tor.com>
-  * Made SOCKS handler differentiate socks5h from socks5 and socks4a from socks4.
-
-* Tim Burke <tim.burke@gmail.com>
-  * Stop buffering entire deflate-encoded responses.
-
-* Tuukka Mustonen <tuukka.mustonen@gmail.com>
-  * Add counter for status_forcelist retries.
-
-* Erik Rose <erik@mozilla.com>
-  * Bugfix to pyopenssl vendoring
-
-* Wolfgang Richter <wolfgang.richter@gmail.com>
-  * Bugfix related to loading full certificate chains with PyOpenSSL backend.
-
-* Mike Miller <github@mikeage.net>
-  * Logging improvements to include the HTTP(S) port when opening a new connection
-
-* Ioannis Tziakos <mail@itziakos.gr>
-  * Fix ``util.selectors._fileobj_to_fd`` to accept ``long``.
-  * Update appveyor tox setup to use the 64bit python.
-
-* Akamai (through Jess Shapiro) <jshapiro@akamai.com>
-  * Ongoing maintenance; 2017-2018
-
-* Dominique Leuenberger <dimstar@opensuse.org>
-  * Minor fixes in the test suite
-
-* Will Bond <will@wbond.net>
-  * Add Python 2.6 support to ``contrib.securetransport``
-
-* Aleksei Alekseev <alekseev.yeskela@gmail.com>
-  * using auth info for socks proxy
-
-* Chris Wilcox <git@crwilcox.com>
-  * Improve contribution guide
-  * Add ``HTTPResponse.geturl`` method to provide ``urllib2.urlopen().geturl()`` behavior
-
-* Bruce Merry <https://www.brucemerry.org.za>
-  * Fix leaking exceptions when system calls are interrupted with zero timeout
-
-* Hugo van Kemenade <https://github.com/hugovk>
-  * Drop support for EOL Python 2.6
-
-* Tim Bell <https://github.com/timb07>
-  * Bugfix for responses with Content-Type: message/* logging warnings
-
-* Justin Bramley <https://github.com/jbramleycl>
-  * Add ability to handle multiple Content-Encodings
-
-* Katsuhiko YOSHIDA <https://github.com/kyoshidajp>
-  * Remove Authorization header regardless of case when redirecting to cross-site
-
-* James Meickle <https://permadeath.com/>
-  * Improve handling of Retry-After header
-
-* Chris Jerdonek <chris.jerdonek@gmail.com>
-  * Remove a spurious TypeError from the exception chain inside
-    HTTPConnectionPool._make_request(), also for BaseExceptions.
-
-* [Your name or handle] <[email or website]>
-  * [Brief summary of your changes]

+ 0 - 1229
desktop/core/ext-py/urllib3-1.25.8/PKG-INFO

@@ -1,1229 +0,0 @@
-Metadata-Version: 2.1
-Name: urllib3
-Version: 1.25.8
-Summary: HTTP library with thread-safe connection pooling, file post, and more.
-Home-page: https://urllib3.readthedocs.io/
-Author: Andrey Petrov
-Author-email: andrey.petrov@shazow.net
-License: MIT
-Project-URL: Documentation, https://urllib3.readthedocs.io/
-Project-URL: Code, https://github.com/urllib3/urllib3
-Project-URL: Issue tracker, https://github.com/urllib3/urllib3/issues
-Description: urllib3
-        =======
-        
-        urllib3 is a powerful, *sanity-friendly* HTTP client for Python. Much of the
-        Python ecosystem already uses urllib3 and you should too.
-        urllib3 brings many critical features that are missing from the Python
-        standard libraries:
-        
-        - Thread safety.
-        - Connection pooling.
-        - Client-side SSL/TLS verification.
-        - File uploads with multipart encoding.
-        - Helpers for retrying requests and dealing with HTTP redirects.
-        - Support for gzip, deflate, and brotli encoding.
-        - Proxy support for HTTP and SOCKS.
-        - 100% test coverage.
-        
-        urllib3 is powerful and easy to use::
-        
-            >>> import urllib3
-            >>> http = urllib3.PoolManager()
-            >>> r = http.request('GET', 'http://httpbin.org/robots.txt')
-            >>> r.status
-            200
-            >>> r.data
-            'User-agent: *\nDisallow: /deny\n'
-        
-        
-        Installing
-        ----------
-        
-        urllib3 can be installed with `pip <https://pip.pypa.io>`_::
-        
-            $ pip install urllib3
-        
-        Alternatively, you can grab the latest source code from `GitHub <https://github.com/urllib3/urllib3>`_::
-        
-            $ git clone git://github.com/urllib3/urllib3.git
-            $ python setup.py install
-        
-        
-        Documentation
-        -------------
-        
-        urllib3 has usage and reference documentation at `urllib3.readthedocs.io <https://urllib3.readthedocs.io>`_.
-        
-        
-        Contributing
-        ------------
-        
-        urllib3 happily accepts contributions. Please see our
-        `contributing documentation <https://urllib3.readthedocs.io/en/latest/contributing.html>`_
-        for some tips on getting started.
-        
-        
-        Security Disclosures
-        --------------------
-        
-        To report a security vulnerability, please use the
-        `Tidelift security contact <https://tidelift.com/security>`_.
-        Tidelift will coordinate the fix and disclosure with maintainers.
-        
-        Maintainers
-        -----------
-        
-        - `@sethmlarson <https://github.com/sethmlarson>`_ (Seth M. Larson)
-        - `@pquentin <https://github.com/pquentin>`_ (Quentin Pradet)
-        - `@theacodes <https://github.com/theacodes>`_ (Thea Flowers)
-        - `@haikuginger <https://github.com/haikuginger>`_ (Jess Shapiro)
-        - `@lukasa <https://github.com/lukasa>`_ (Cory Benfield)
-        - `@sigmavirus24 <https://github.com/sigmavirus24>`_ (Ian Stapleton Cordasco)
-        - `@shazow <https://github.com/shazow>`_ (Andrey Petrov)
-        
-        👋
-        
-        
-        Sponsorship
-        -----------
-        
-        .. |tideliftlogo| image:: https://nedbatchelder.com/pix/Tidelift_Logos_RGB_Tidelift_Shorthand_On-White_small.png
-           :width: 75
-           :alt: Tidelift
-        
-        .. list-table::
-           :widths: 10 100
-        
-           * - |tideliftlogo|
-             - Professional support for urllib3 is available as part of the `Tidelift
-               Subscription`_.  Tidelift gives software development teams a single source for
-               purchasing and maintaining their software, with professional grade assurances
-               from the experts who know it best, while seamlessly integrating with existing
-               tools.
-        
-        .. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=readme
-        
-        If your company benefits from this library, please consider `sponsoring its
-        development <https://urllib3.readthedocs.io/en/latest/contributing.html#sponsorship-project-grants>`_.
-        
-        Sponsors include:
-        
-        - Abbott (2018-2019), sponsored `@sethmlarson <https://github.com/sethmlarson>`_'s work on urllib3.
-        - Google Cloud Platform (2018-2019), sponsored `@theacodes <https://github.com/theacodes>`_'s work on urllib3.
-        - Akamai (2017-2018), sponsored `@haikuginger <https://github.com/haikuginger>`_'s work on urllib3
-        - Hewlett Packard Enterprise (2016-2017), sponsored `@Lukasa’s <https://github.com/Lukasa>`_ work on urllib3.
-        
-        
-        Changes
-        =======
-        
-        1.25.8 (2020-01-20)
-        -------------------
-        
-        * Drop support for EOL Python 3.4 (Pull #1774)
-        
-        * Optimize _encode_invalid_chars (Pull #1787)
-        
-        
-        1.25.7 (2019-11-11)
-        -------------------
-        
-        * Preserve ``chunked`` parameter on retries (Pull #1715, Pull #1734)
-        
-        * Allow unset ``SERVER_SOFTWARE`` in App Engine (Pull #1704, Issue #1470)
-        
-        * Fix issue where URL fragment was sent within the request target. (Pull #1732)
-        
-        * Fix issue where an empty query section in a URL would fail to parse. (Pull #1732)
-        
-        * Remove TLS 1.3 support in SecureTransport due to Apple removing support (Pull #1703)
-        
-        
-        1.25.6 (2019-09-24)
-        -------------------
-        
-        * Fix issue where tilde (``~``) characters were incorrectly
-          percent-encoded in the path. (Pull #1692)
-        
-        
-        1.25.5 (2019-09-19)
-        -------------------
-        
-        * Add mitigation for BPO-37428 affecting Python <3.7.4 and OpenSSL 1.1.1+ which
-          caused certificate verification to be enabled when using ``cert_reqs=CERT_NONE``.
-          (Issue #1682)
-        
-        
-        1.25.4 (2019-09-19)
-        -------------------
-        
-        * Propagate Retry-After header settings to subsequent retries. (Pull #1607)
-        
-        * Fix edge case where Retry-After header was still respected even when
-          explicitly opted out of. (Pull #1607)
-        
-        * Remove dependency on ``rfc3986`` for URL parsing.
-        
-        * Fix issue where URLs containing invalid characters within ``Url.auth`` would
-          raise an exception instead of percent-encoding those characters.
-        
-        * Add support for ``HTTPResponse.auto_close = False`` which makes HTTP responses
-          work well with BufferedReaders and other ``io`` module features. (Pull #1652)
-        
-        * Percent-encode invalid characters in URL for ``HTTPConnectionPool.request()`` (Pull #1673)
-        
-        
-        1.25.3 (2019-05-23)
-        -------------------
-        
-        * Change ``HTTPSConnection`` to load system CA certificates
-          when ``ca_certs``, ``ca_cert_dir``, and ``ssl_context`` are
-          unspecified. (Pull #1608, Issue #1603)
-        
-        * Upgrade bundled rfc3986 to v1.3.2. (Pull #1609, Issue #1605)
-        
-        
-        1.25.2 (2019-04-28)
-        -------------------
-        
-        * Change ``is_ipaddress`` to not detect IPvFuture addresses. (Pull #1583)
-        
-        * Change ``parse_url`` to percent-encode invalid characters within the
-          path, query, and target components. (Pull #1586)
-        
-        
-        1.25.1 (2019-04-24)
-        -------------------
-        
-        * Add support for Google's ``Brotli`` package. (Pull #1572, Pull #1579)
-        
-        * Upgrade bundled rfc3986 to v1.3.1 (Pull #1578)
-        
-        
-        1.25 (2019-04-22)
-        -----------------
-        
-        * Require and validate certificates by default when using HTTPS (Pull #1507)
-        
-        * Upgraded ``urllib3.utils.parse_url()`` to be RFC 3986 compliant. (Pull #1487)
-        
-        * Added support for ``key_password`` for ``HTTPSConnectionPool`` to use
-          encrypted ``key_file`` without creating your own ``SSLContext`` object. (Pull #1489)
-        
-        * Add TLSv1.3 support to CPython, pyOpenSSL, and SecureTransport ``SSLContext``
-          implementations. (Pull #1496)
-        
-        * Switched the default multipart header encoder from RFC 2231 to HTML 5 working draft. (Issue #303, PR #1492)
-        
-        * Fixed issue where OpenSSL would block if an encrypted client private key was
-          given and no password was given. Instead an ``SSLError`` is raised. (Pull #1489)
-        
-        * Added support for Brotli content encoding. It is enabled automatically if
-          ``brotlipy`` package is installed which can be requested with
-          ``urllib3[brotli]`` extra. (Pull #1532)
-        
-        * Drop ciphers using DSS key exchange from default TLS cipher suites.
-          Improve default ciphers when using SecureTransport. (Pull #1496)
-        
-        * Implemented a more efficient ``HTTPResponse.__iter__()`` method. (Issue #1483)
-        
-        1.24.3 (2019-05-01)
-        -------------------
-        
-        * Apply fix for CVE-2019-9740. (Pull #1591)
-        
-        1.24.2 (2019-04-17)
-        -------------------
-        
-        * Don't load system certificates by default when any other ``ca_certs``, ``ca_certs_dir`` or
-          ``ssl_context`` parameters are specified.
-        
-        * Remove Authorization header regardless of case when redirecting to cross-site. (Issue #1510)
-        
-        * Add support for IPv6 addresses in subjectAltName section of certificates. (Issue #1269)
-        
-        
-        1.24.1 (2018-11-02)
-        -------------------
-        
-        * Remove quadratic behavior within ``GzipDecoder.decompress()`` (Issue #1467)
-        
-        * Restored functionality of ``ciphers`` parameter for ``create_urllib3_context()``. (Issue #1462)
-        
-        
-        1.24 (2018-10-16)
-        -----------------
-        
-        * Allow key_server_hostname to be specified when initializing a PoolManager to allow custom SNI to be overridden. (Pull #1449)
-        
-        * Test against Python 3.7 on AppVeyor. (Pull #1453)
-        
-        * Early-out ipv6 checks when running on App Engine. (Pull #1450)
-        
-        * Change ambiguous description of backoff_factor (Pull #1436)
-        
-        * Add ability to handle multiple Content-Encodings (Issue #1441 and Pull #1442)
-        
-        * Skip DNS names that can't be idna-decoded when using pyOpenSSL (Issue #1405).
-        
-        * Add a server_hostname parameter to HTTPSConnection which allows for
-          overriding the SNI hostname sent in the handshake. (Pull #1397)
-        
-        * Drop support for EOL Python 2.6 (Pull #1429 and Pull #1430)
-        
-        * Fixed bug where responses with header Content-Type: message/* erroneously
-          raised HeaderParsingError, resulting in a warning being logged. (Pull #1439)
-        
-        * Move urllib3 to src/urllib3 (Pull #1409)
-        
-        
-        1.23 (2018-06-04)
-        -----------------
-        
-        * Allow providing a list of headers to strip from requests when redirecting
-          to a different host. Defaults to the ``Authorization`` header. Different
-          headers can be set via ``Retry.remove_headers_on_redirect``. (Issue #1316)
-        
-        * Fix ``util.selectors._fileobj_to_fd`` to accept ``long`` (Issue #1247).
-        
-        * Dropped Python 3.3 support. (Pull #1242)
-        
-        * Put the connection back in the pool when calling stream() or read_chunked() on
-          a chunked HEAD response. (Issue #1234)
-        
-        * Fixed pyOpenSSL-specific ssl client authentication issue when clients
-          attempted to auth via certificate + chain (Issue #1060)
-        
-        * Add the port to the connectionpool connect print (Pull #1251)
-        
-        * Don't use the ``uuid`` module to create multipart data boundaries. (Pull #1380)
-        
-        * ``read_chunked()`` on a closed response returns no chunks. (Issue #1088)
-        
-        * Add Python 2.6 support to ``contrib.securetransport`` (Pull #1359)
-        
-        * Added support for auth info in url for SOCKS proxy (Pull #1363)
-        
-        
-        1.22 (2017-07-20)
-        -----------------
-        
-        * Fixed missing brackets in ``HTTP CONNECT`` when connecting to IPv6 address via
-          IPv6 proxy. (Issue #1222)
-        
-        * Made the connection pool retry on ``SSLError``.  The original ``SSLError``
-          is available on ``MaxRetryError.reason``. (Issue #1112)
-        
-        * Drain and release connection before recursing on retry/redirect.  Fixes
-          deadlocks with a blocking connectionpool. (Issue #1167)
-        
-        * Fixed compatibility for cookiejar. (Issue #1229)
-        
-        * pyopenssl: Use vendored version of ``six``. (Issue #1231)
-        
-        
-        1.21.1 (2017-05-02)
-        -------------------
-        
-        * Fixed SecureTransport issue that would cause long delays in response body
-          delivery. (Pull #1154)
-        
-        * Fixed regression in 1.21 that threw exceptions when users passed the
-          ``socket_options`` flag to the ``PoolManager``.  (Issue #1165)
-        
-        * Fixed regression in 1.21 that threw exceptions when users passed the
-          ``assert_hostname`` or ``assert_fingerprint`` flag to the ``PoolManager``.
-          (Pull #1157)
-        
-        
-        1.21 (2017-04-25)
-        -----------------
-        
-        * Improved performance of certain selector system calls on Python 3.5 and
-          later. (Pull #1095)
-        
-        * Resolved issue where the PyOpenSSL backend would not wrap SysCallError
-          exceptions appropriately when sending data. (Pull #1125)
-        
-        * Selectors now detects a monkey-patched select module after import for modules
-          that patch the select module like eventlet, greenlet. (Pull #1128)
-        
-        * Reduced memory consumption when streaming zlib-compressed responses
-          (as opposed to raw deflate streams). (Pull #1129)
-        
-        * Connection pools now use the entire request context when constructing the
-          pool key. (Pull #1016)
-        
-        * ``PoolManager.connection_from_*`` methods now accept a new keyword argument,
-          ``pool_kwargs``, which are merged with the existing ``connection_pool_kw``.
-          (Pull #1016)
-        
-        * Add retry counter for ``status_forcelist``. (Issue #1147)
-        
-        * Added ``contrib`` module for using SecureTransport on macOS:
-          ``urllib3.contrib.securetransport``.  (Pull #1122)
-        
-        * urllib3 now only normalizes the case of ``http://`` and ``https://`` schemes:
-          for schemes it does not recognise, it assumes they are case-sensitive and
-          leaves them unchanged.
-          (Issue #1080)
-        
-        
-        1.20 (2017-01-19)
-        -----------------
-        
-        * Added support for waiting for I/O using selectors other than select,
-          improving urllib3's behaviour with large numbers of concurrent connections.
-          (Pull #1001)
-        
-        * Updated the date for the system clock check. (Issue #1005)
-        
-        * ConnectionPools now correctly consider hostnames to be case-insensitive.
-          (Issue #1032)
-        
-        * Outdated versions of PyOpenSSL now cause the PyOpenSSL contrib module
-          to fail when it is injected, rather than at first use. (Pull #1063)
-        
-        * Outdated versions of cryptography now cause the PyOpenSSL contrib module
-          to fail when it is injected, rather than at first use. (Issue #1044)
-        
-        * Automatically attempt to rewind a file-like body object when a request is
-          retried or redirected. (Pull #1039)
-        
-        * Fix some bugs that occur when modules incautiously patch the queue module.
-          (Pull #1061)
-        
-        * Prevent retries from occurring on read timeouts for which the request method
-          was not in the method whitelist. (Issue #1059)
-        
-        * Changed the PyOpenSSL contrib module to lazily load idna to avoid
-          unnecessarily bloating the memory of programs that don't need it. (Pull
-          #1076)
-        
-        * Add support for IPv6 literals with zone identifiers. (Pull #1013)
-        
-        * Added support for socks5h:// and socks4a:// schemes when working with SOCKS
-          proxies, and controlled remote DNS appropriately. (Issue #1035)
-        
-        
-        1.19.1 (2016-11-16)
-        -------------------
-        
-        * Fixed AppEngine import that didn't function on Python 3.5. (Pull #1025)
-        
-        
-        1.19 (2016-11-03)
-        -----------------
-        
-        * urllib3 now respects Retry-After headers on 413, 429, and 503 responses when
-          using the default retry logic. (Pull #955)
-        
-        * Remove markers from setup.py to assist ancient setuptools versions. (Issue
-          #986)
-        
-        * Disallow superscripts and other integerish things in URL ports. (Issue #989)
-        
-        * Allow urllib3's HTTPResponse.stream() method to continue to work with
-          non-httplib underlying FPs. (Pull #990)
-        
-        * Empty filenames in multipart headers are now emitted as such, rather than
-          being suppressed. (Issue #1015)
-        
-        * Prefer user-supplied Host headers on chunked uploads. (Issue #1009)
-        
-        
-        1.18.1 (2016-10-27)
-        -------------------
-        
-        * CVE-2016-9015. Users who are using urllib3 version 1.17 or 1.18 along with
-          PyOpenSSL injection and OpenSSL 1.1.0 *must* upgrade to this version. This
-          release fixes a vulnerability whereby urllib3 in the above configuration
-          would silently fail to validate TLS certificates due to erroneously setting
-          invalid flags in OpenSSL's ``SSL_CTX_set_verify`` function. These erroneous
-          flags do not cause a problem in OpenSSL versions before 1.1.0, which
-          interprets the presence of any flag as requesting certificate validation.
-        
-          There is no PR for this patch, as it was prepared for simultaneous disclosure
-          and release. The master branch received the same fix in PR #1010.
-        
-        
-        1.18 (2016-09-26)
-        -----------------
-        
-        * Fixed incorrect message for IncompleteRead exception. (PR #973)
-        
-        * Accept ``iPAddress`` subject alternative name fields in TLS certificates.
-          (Issue #258)
-        
-        * Fixed consistency of ``HTTPResponse.closed`` between Python 2 and 3.
-          (Issue #977)
-        
-        * Fixed handling of wildcard certificates when using PyOpenSSL. (Issue #979)
-        
-        
-        1.17 (2016-09-06)
-        -----------------
-        
-        * Accept ``SSLContext`` objects for use in SSL/TLS negotiation. (Issue #835)
-        
-        * ConnectionPool debug log now includes scheme, host, and port. (Issue #897)
-        
-        * Substantially refactored documentation. (Issue #887)
-        
-        * Used URLFetch default timeout on AppEngine, rather than hardcoding our own.
-          (Issue #858)
-        
-        * Normalize the scheme and host in the URL parser (Issue #833)
-        
-        * ``HTTPResponse`` contains the last ``Retry`` object, which now also
-          contains retries history. (Issue #848)
-        
-        * Timeout can no longer be set as boolean, and must be greater than zero.
-          (PR #924)
-        
-        * Removed pyasn1 and ndg-httpsclient from dependencies used for PyOpenSSL. We
-          now use cryptography and idna, both of which are already dependencies of
-          PyOpenSSL. (PR #930)
-        
-        * Fixed infinite loop in ``stream`` when amt=None. (Issue #928)
-        
-        * Try to use the operating system's certificates when we are using an
-          ``SSLContext``. (PR #941)
-        
-        * Updated cipher suite list to allow ChaCha20+Poly1305. AES-GCM is preferred to
-          ChaCha20, but ChaCha20 is then preferred to everything else. (PR #947)
-        
-        * Updated cipher suite list to remove 3DES-based cipher suites. (PR #958)
-        
-        * Removed the cipher suite fallback to allow HIGH ciphers. (PR #958)
-        
-        * Implemented ``length_remaining`` to determine remaining content
-          to be read. (PR #949)
-        
-        * Implemented ``enforce_content_length`` to enable exceptions when
-          incomplete data chunks are received. (PR #949)
-        
-        * Dropped connection start, dropped connection reset, redirect, forced retry,
-          and new HTTPS connection log levels to DEBUG, from INFO. (PR #967)
-        
-        
-        1.16 (2016-06-11)
-        -----------------
-        
-        * Disable IPv6 DNS when IPv6 connections are not possible. (Issue #840)
-        
-        * Provide ``key_fn_by_scheme`` pool keying mechanism that can be
-          overridden. (Issue #830)
-        
-        * Normalize scheme and host to lowercase for pool keys, and include
-          ``source_address``. (Issue #830)
-        
-        * Cleaner exception chain in Python 3 for ``_make_request``.
-          (Issue #861)
-        
-        * Fixed installing ``urllib3[socks]`` extra. (Issue #864)
-        
-        * Fixed signature of ``ConnectionPool.close`` so it can actually safely be
-          called by subclasses. (Issue #873)
-        
-        * Retain ``release_conn`` state across retries. (Issues #651, #866)
-        
-        * Add customizable ``HTTPConnectionPool.ResponseCls``, which defaults to
-          ``HTTPResponse`` but can be replaced with a subclass. (Issue #879)
-        
-        
-        1.15.1 (2016-04-11)
-        -------------------
-        
-        * Fix packaging to include backports module. (Issue #841)
-        
-        
-        1.15 (2016-04-06)
-        -----------------
-        
-        * Added Retry(raise_on_status=False). (Issue #720)
-        
-        * Always use setuptools, no more distutils fallback. (Issue #785)
-        
-        * Dropped support for Python 3.2. (Issue #786)
-        
-        * Chunked transfer encoding when requesting with ``chunked=True``.
-          (Issue #790)
-        
-        * Fixed regression with IPv6 port parsing. (Issue #801)
-        
-        * Append SNIMissingWarning messages to allow users to specify it in
-          the PYTHONWARNINGS environment variable. (Issue #816)
-        
-        * Handle unicode headers in Py2. (Issue #818)
-        
-        * Log certificate when there is a hostname mismatch. (Issue #820)
-        
-        * Preserve order of request/response headers. (Issue #821)
-        
-        
-        1.14 (2015-12-29)
-        -----------------
-        
-        * contrib: SOCKS proxy support! (Issue #762)
-        
-        * Fixed AppEngine handling of transfer-encoding header and bug
-          in Timeout defaults checking. (Issue #763)
-        
-        
-        1.13.1 (2015-12-18)
-        -------------------
-        
-        * Fixed regression in IPv6 + SSL for match_hostname. (Issue #761)
-        
-        
-        1.13 (2015-12-14)
-        -----------------
-        
-        * Fixed ``pip install urllib3[secure]`` on modern pip. (Issue #706)
-        
-        * pyopenssl: Fixed SSL3_WRITE_PENDING error. (Issue #717)
-        
-        * pyopenssl: Support for TLSv1.1 and TLSv1.2. (Issue #696)
-        
-        * Close connections more defensively on exception. (Issue #734)
-        
-        * Adjusted ``read_chunked`` to handle gzipped, chunk-encoded bodies without
-          repeatedly flushing the decoder, to function better on Jython. (Issue #743)
-        
-        * Accept ``ca_cert_dir`` for SSL-related PoolManager configuration. (Issue #758)
-        
-        
-        1.12 (2015-09-03)
-        -----------------
-        
-        * Rely on ``six`` for importing ``httplib`` to work around
-          conflicts with other Python 3 shims. (Issue #688)
-        
-        * Add support for directories of certificate authorities, as supported by
-          OpenSSL. (Issue #701)
-        
-        * New exception: ``NewConnectionError``, raised when we fail to establish
-          a new connection, usually ``ECONNREFUSED`` socket error.
-        
-        
-        1.11 (2015-07-21)
-        -----------------
-        
-        * When ``ca_certs`` is given, ``cert_reqs`` defaults to
-          ``'CERT_REQUIRED'``. (Issue #650)
-        
-        * ``pip install urllib3[secure]`` will install Certifi and
-          PyOpenSSL as dependencies. (Issue #678)
-        
-        * Made ``HTTPHeaderDict`` usable as a ``headers`` input value
-          (Issues #632, #679)
-        
-        * Added `urllib3.contrib.appengine <https://urllib3.readthedocs.io/en/latest/contrib.html#google-app-engine>`_
-          which has an ``AppEngineManager`` for using ``URLFetch`` in 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
-          ``ValueError`` instead of ``AssertionError`` (backwards
-          compatible for now, but please migrate). (Issue #640)
-        
-        * Fix pools not getting replenished when an error occurs during a
-          request using ``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)
-        
-        * Fix ``httplib.IncompleteRead`` not getting converted to
-          ``ProtocolError`` when using ``HTTPResponse.stream()``
-          (Issue #674)
-        
-        1.10.4 (2015-05-03)
-        -------------------
-        
-        * 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)
-        
-        
-        1.10.3 (2015-04-21)
-        -------------------
-        
-        * Emit ``InsecurePlatformWarning`` when 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)
-        
-        
-        1.10.2 (2015-02-25)
-        -------------------
-        
-        * 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)
-        
-        
-        1.10.1 (2015-02-10)
-        -------------------
-        
-        * 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)
-        
-        
-        1.10 (2014-12-14)
-        -----------------
-        
-        * Disabled SSLv3. (Issue #473)
-        
-        * Add ``Url.url`` property to return the composed url string. (Issue #394)
-        
-        * Fixed PyOpenSSL + gevent ``WantWriteError``. (Issue #412)
-        
-        * ``MaxRetryError.reason`` will 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)
-        
-        * Emit ``InsecureRequestWarning`` for *every* insecure HTTPS request.
-          (Issue #496)
-        
-        * Emit ``SecurityWarning`` when certificate has no ``subjectAltName``.
-          (Issue #499)
-        
-        * Close and discard sockets which experienced SSL-related errors.
-          (Issue #501)
-        
-        * Handle ``body`` param in ``.request(...)``. (Issue #513)
-        
-        * Respect timeout with HTTPS proxy. (Issue #505)
-        
-        * PyOpenSSL: Handle ZeroReturnError exception. (Issue #520)
-        
-        
-        1.9.1 (2014-09-13)
-        ------------------
-        
-        * 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)
-        
-        * Emit ``SecurityWarning`` if system clock is waaay off. (Issue #445)
-        
-        * Fixed PyOpenSSL compatibility with PyPy. (Issue #450)
-        
-        * Fixed ``BrokenPipeError`` and ``ConnectionError`` handling in Py3.
-          (Issue #443)
-        
-        
-        
-        1.9 (2014-07-04)
-        ----------------
-        
-        * 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
-          <https://urllib3.readthedocs.io/en/latest/security.html>`_ for details.
-          (Issue #426)
-        
-        * New retry logic and ``urllib3.util.retry.Retry`` configuration 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
-          ``.reason`` property. (Issue #326)
-        
-        * ``urllib3.exceptions.ConnectionError`` renamed to
-          ``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)
-        
-        
-        1.8.3 (2014-06-23)
-        ------------------
-        
-        * Fix TLS verification when using a proxy in Python 3.4.1. (Issue #385)
-        
-        * Add ``disable_cache`` option to ``urllib3.util.make_headers``. (Issue #393)
-        
-        * Wrap ``socket.timeout`` exception with
-          ``urllib3.exceptions.ReadTimeoutError``. (Issue #399)
-        
-        * Fixed proxy-related bug where connections were being reused incorrectly.
-          (Issues #366, #369)
-        
-        * Added ``socket_options`` keyword parameter which allows to define
-          ``setsockopt`` configuration of new sockets. (Issue #397)
-        
-        * Removed ``HTTPConnection.tcp_nodelay`` in favor of
-          ``HTTPConnection.default_socket_options``. (Issue #397)
-        
-        * Fixed ``TypeError`` bug in Python 2.6.4. (Issue #411)
-        
-        
-        1.8.2 (2014-04-17)
-        ------------------
-        
-        * Fix ``urllib3.util`` not being included in the package.
-        
-        
-        1.8.1 (2014-04-17)
-        ------------------
-        
-        * Fix AppEngine bug of HTTPS requests going out as HTTP. (Issue #356)
-        
-        * Don't install ``dummyserver`` into ``site-packages`` as it's only needed
-          for the test suite. (Issue #362)
-        
-        * Added support for specifying ``source_address``. (Issue #352)
-        
-        
-        1.8 (2014-03-04)
-        ----------------
-        
-        * Improved url parsing in ``urllib3.util.parse_url`` (properly parse '@' in
-          username, and blank ports like 'hostname:').
-        
-        * New ``urllib3.connection`` module which contains all the HTTPConnection
-          objects.
-        
-        * Several ``urllib3.util.Timeout``-related fixes. Also changed constructor
-          signature to a more sensible order. [Backwards incompatible]
-          (Issues #252, #262, #263)
-        
-        * Use ``backports.ssl_match_hostname`` if it's installed. (Issue #274)
-        
-        * Added ``.tell()`` method to ``urllib3.response.HTTPResponse`` which
-          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_host``
-          to 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)
-        
-        * Fixed ``urllib3.poolmanager.ProxyManager`` not 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.pyopenssl``
-          from the default 64 to 1024 in a single certificate. (Issue #318)
-        
-        * Headers are now passed and stored as a custom
-          ``urllib3.collections_.HTTPHeaderDict`` object rather than a plain ``dict``.
-          (Issue #329, #333)
-        
-        * Headers no longer lose their case on Python 3. (Issue #236)
-        
-        * ``urllib3.contrib.pyopenssl`` now uses the operating system's default CA
-          certificates on inject. (Issue #332)
-        
-        * Requests with ``retries=False`` will immediately raise any exceptions without
-          wrapping them in ``MaxRetryError``. (Issue #348)
-        
-        * Fixed open socket leak with SSL-related failures. (Issue #344, #348)
-        
-        
-        1.7.1 (2013-09-25)
-        ------------------
-        
-        * Added granular timeout support with new ``urllib3.util.Timeout`` class.
-          (Issue #231)
-        
-        * Fixed Python 3.4 support. (Issue #238)
-        
-        
-        1.7 (2013-08-14)
-        ----------------
-        
-        * 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.HTTPResponse`` now inherits from ``io.IOBase`` for bonus
-          file-like functionality. (Issue #187)
-        
-        * Passing ``assert_hostname=False`` when 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
-          ``urllib3.poolmanager.PoolManager.connection_from_host(...)`` (Issue #204)
-        
-        * ``ProxyManager`` requests now include non-default port in ``Host: ...``
-          header. (Issue #217)
-        
-        * Added HTTPS proxy support in ``ProxyManager``. (Issue #170 #139)
-        
-        * New ``RequestField`` object can be passed to the ``fields=...`` param which
-          can specify headers. (Issue #220)
-        
-        * Raise ``urllib3.exceptions.ProxyError`` when connecting to proxy fails.
-          (Issue #221)
-        
-        * Use international headers when posting file names. (Issue #119)
-        
-        * Improved IPv6 support. (Issue #203)
-        
-        
-        1.6 (2013-04-25)
-        ----------------
-        
-        * Contrib: Optional SNI support for Py2 using PyOpenSSL. (Issue #156)
-        
-        * ``ProxyManager`` automatically adds ``Host: ...`` header if not given.
-        
-        * Improved SSL-related code. ``cert_req`` now optionally takes a string like
-          "REQUIRED" or "NONE". Same with ``ssl_version`` takes strings like "SSLv23"
-          The string values reflect the suffix of the respective constant variable.
-          (Issue #130)
-        
-        * Vendored ``socksipy`` now 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 ``ssl_version`` parameter of ``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 ``six`` module
-          namespace. (Issue #113)
-        
-        * ``urllib3.exceptions.MaxRetryError`` contains a ``reason`` property holding
-          the exception that prompted the final retry. If ``reason is None`` then it
-          was due to a redirect. (Issue #92, #114)
-        
-        * Fixed ``PoolManager.urlopen()`` from not redirecting more than once.
-          (Issue #149)
-        
-        * Don't assume ``Content-Type: text/plain`` for 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)
-        
-        
-        1.5 (2012-08-02)
-        ----------------
-        
-        * Added ``urllib3.add_stderr_logger()`` for quickly enabling STDERR debug
-          logging in urllib3.
-        
-        * Native full URL parsing (including auth, path, query, fragment) available in
-          ``urllib3.util.parse_url(url)``.
-        
-        * Built-in redirect will switch method to 'GET' if status code is 303.
-          (Issue #11)
-        
-        * ``urllib3.PoolManager`` strips the scheme and host before sending the request
-          uri. (Issue #8)
-        
-        * New ``urllib3.exceptions.DecodeError`` exception 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
-          ``urllib3.PoolManager.clear()``.
-        
-        * 99% -> 100% unit test coverage.
-        
-        
-        1.4 (2012-06-16)
-        ----------------
-        
-        * Minor AppEngine-related fixes.
-        
-        * Switched from ``mimetools.choose_boundary`` to ``uuid.uuid4()``.
-        
-        * Improved url parsing. (Issue #73)
-        
-        * IPv6 url support. (Issue #72)
-        
-        
-        1.3 (2012-03-25)
-        ----------------
-        
-        * Removed pre-1.0 deprecated API.
-        
-        * Refactored helpers into a ``urllib3.util`` submodule.
-        
-        * 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)
-        
-        * Minor ``encode_multipart_formdata`` fixes related to Python 3 strings vs
-          bytes.
-        
-        
-        1.2.2 (2012-02-06)
-        ------------------
-        
-        * Fixed packaging bug of not shipping ``test-requirements.txt``. (Issue #47)
-        
-        
-        1.2.1 (2012-02-05)
-        ------------------
-        
-        * Fixed another bug related to when ``ssl`` module is not available. (Issue #41)
-        
-        * Location parsing errors now raise ``urllib3.exceptions.LocationParseError``
-          which inherits from ``ValueError``.
-        
-        
-        1.2 (2012-01-29)
-        ----------------
-        
-        * Added Python 3 support (tested on 3.2.2)
-        
-        * Dropped Python 2.5 support (tested on 2.6.7, 2.7.2)
-        
-        * Use ``select.poll`` instead of ``select.select`` for platforms that support
-          it.
-        
-        * Use ``Queue.LifoQueue`` instead of ``Queue.Queue`` for more aggressive
-          connection reusing. Configurable by overriding ``ConnectionPool.QueueCls``.
-        
-        * Fixed ``ImportError`` during install when ``ssl`` module is not available.
-          (Issue #41)
-        
-        * Fixed ``PoolManager`` redirects between schemes (such as HTTP -> HTTPS) not
-          completing properly. (Issue #28, uncovered by Issue #10 in v1.1)
-        
-        * Ported ``dummyserver`` to use ``tornado`` instead of ``webob`` +
-          ``eventlet``. Removed extraneous unsupported dummyserver testing backends.
-          Added socket-level tests.
-        
-        * More tests. Achievement Unlocked: 99% Coverage.
-        
-        
-        1.1 (2012-01-07)
-        ----------------
-        
-        * Refactored ``dummyserver`` to its own root namespace module (used for
-          testing).
-        
-        * Added hostname verification for ``VerifiedHTTPSConnection`` by vendoring in
-          Py32's ``ssl_match_hostname``. (Issue #25)
-        
-        * Fixed cross-host HTTP redirects when using ``PoolManager``. (Issue #10)
-        
-        * Fixed ``decode_content`` being ignored when set through ``urlopen``. (Issue
-          #27)
-        
-        * Fixed timeout-related bugs. (Issues #17, #23)
-        
-        
-        1.0.2 (2011-11-04)
-        ------------------
-        
-        * Fixed typo in ``VerifiedHTTPSConnection`` which 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 ``__delitem__`` and
-          ``__getitem__`` behaviour), with tests. Shouldn't affect core urllib3 code.
-        
-        
-        1.0.1 (2011-10-10)
-        ------------------
-        
-        * Fixed a bug where the same connection would get returned into the pool twice,
-          causing extraneous "HttpConnectionPool is full" log warnings.
-        
-        
-        1.0 (2011-10-08)
-        ----------------
-        
-        * Added ``PoolManager`` with LRU expiration of connections (tested and
-          documented).
-        * Added ``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 ``encode_multipart_formdata``.
-        * Convenience request methods are now inherited from ``RequestMethods``. Old
-          helpers like ``get_url`` and ``post_url`` should be abandoned in favour of
-          the new ``request(method, url, ...)``.
-        * Refactored code to be even more decoupled, reusable, and extendable.
-        * License header added to ``.py`` files.
-        * Embiggened the documentation: Lots of Sphinx-friendly docstrings in the code
-          and docs in ``docs/`` and on https://urllib3.readthedocs.io/.
-        * Embettered all the things!
-        * Started writing this file.
-        
-        
-        0.4.1 (2011-07-17)
-        ------------------
-        
-        * Minor bug fixes, code cleanup.
-        
-        
-        0.4 (2011-03-01)
-        ----------------
-        
-        * Better unicode support.
-        * Added ``VerifiedHTTPSConnection``.
-        * Added ``NTLMConnectionPool`` in contrib.
-        * Minor improvements.
-        
-        
-        0.3.1 (2010-07-13)
-        ------------------
-        
-        * Added ``assert_host_name`` optional parameter. Now compatible with proxies.
-        
-        
-        0.3 (2009-12-10)
-        ----------------
-        
-        * Added HTTPS support.
-        * Minor bug fixes.
-        * Refactored, broken backwards compatibility with 0.2.
-        * API to be treated as stable from this version forward.
-        
-        
-        0.2 (2008-11-17)
-        ----------------
-        
-        * Added unit tests.
-        * Bug fixes.
-        
-        
-        0.1 (2008-11-16)
-        ----------------
-        
-        * First release.
-        
-Keywords: urllib httplib threadsafe filepost http https ssl pooling
-Platform: UNKNOWN
-Classifier: Environment :: Web Environment
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: Topic :: Internet :: WWW/HTTP
-Classifier: Topic :: Software Development :: Libraries
-Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4
-Provides-Extra: secure
-Provides-Extra: brotli
-Provides-Extra: socks

+ 0 - 17
desktop/core/ext-py/urllib3-1.25.8/dev-requirements.txt

@@ -1,17 +0,0 @@
-mock==3.0.5
-coverage~=4.5
-tornado==5.1.1;python_version<="2.7"
-tornado==6.0.3;python_version>="3.5"
-PySocks==1.7.1
-# https://github.com/Anorov/PySocks/issues/131
-win-inet-pton==1.1.0
-pytest==4.6.6
-pytest-timeout==1.3.3
-flaky==3.6.1
-trustme==0.5.3
-
-# https://github.com/GoogleCloudPlatform/python-repo-tools/issues/23
-pylint<2.0;python_version<="2.7"
-
-# Because typed-ast doesn't provide Python 3.4+Windows wheels
-gcp-devrel-py-tools;python_version>='3.5' or sys_platform != 'win32'

+ 0 - 1
desktop/core/ext-py/urllib3-1.25.8/docs/_templates/fonts.html

@@ -1 +0,0 @@
-<link href='https://fonts.googleapis.com/css?family=Roboto|Roboto+Mono' rel='stylesheet' type='text/css'>

+ 0 - 291
desktop/core/ext-py/urllib3-1.25.8/docs/advanced-usage.rst

@@ -1,291 +0,0 @@
-Advanced Usage
-==============
-
-.. currentmodule:: urllib3
-
-
-Customizing pool behavior
--------------------------
-
-The :class:`~poolmanager.PoolManager` class automatically handles creating
-:class:`~connectionpool.ConnectionPool` instances for each host as needed. By
-default, it will keep a maximum of 10 :class:`~connectionpool.ConnectionPool`
-instances. If you're making requests to many different hosts it might improve
-performance to increase this number::
-
-    >>> import urllib3
-    >>> http = urllib3.PoolManager(num_pools=50)
-
-However, keep in mind that this does increase memory and socket consumption.
-
-Similarly, the :class:`~connectionpool.ConnectionPool` class keeps a pool
-of individual :class:`~connection.HTTPConnection` instances. These connections
-are used during an individual request and returned to the pool when the request
-is complete. By default only one connection will be saved for re-use. If you
-are making many requests to the same host simultaneously it might improve
-performance to increase this number::
-
-    >>> import urllib3
-    >>> http = urllib3.PoolManager(maxsize=10)
-    # Alternatively
-    >>> http = urllib3.HTTPConnectionPool('google.com', maxsize=10)
-
-The behavior of the pooling for :class:`~connectionpool.ConnectionPool` is
-different from :class:`~poolmanager.PoolManager`. By default, if a new
-request is made and there is no free connection in the pool then a new
-connection will be created. However, this connection will not be saved if more
-than ``maxsize`` connections exist. This means that ``maxsize`` does not
-determine the maximum number of connections that can be open to a particular
-host, just the maximum number of connections to keep in the pool. However, if you specify ``block=True`` then there can be at most ``maxsize`` connections
-open to a particular host::
-
-    >>> http = urllib3.PoolManager(maxsize=10, block=True)
-    # Alternatively
-    >>> http = urllib3.HTTPConnectionPool('google.com', maxsize=10, block=True)
-
-Any new requests will block until a connection is available from the pool.
-This is a great way to prevent flooding a host with too many connections in
-multi-threaded applications.
-
-.. _stream:
-
-Streaming and IO
-----------------
-
-When dealing with large responses it's often better to stream the response
-content::
-
-    >>> import urllib3
-    >>> http = urllib3.PoolManager()
-    >>> r = http.request(
-    ...     'GET',
-    ...     'http://httpbin.org/bytes/1024',
-    ...     preload_content=False)
-    >>> for chunk in r.stream(32):
-    ...     print(chunk)
-    b'...'
-    b'...'
-    ...
-    >>> r.release_conn()
-
-Setting ``preload_content`` to ``False`` means that urllib3 will stream the
-response content. :meth:`~response.HTTPResponse.stream` lets you iterate over
-chunks of the response content.
-
-.. note:: When using ``preload_content=False``, you should call 
-    :meth:`~response.HTTPResponse.release_conn` to release the http connection
-    back to the connection pool so that it can be re-used.
-
-However, you can also treat the :class:`~response.HTTPResponse` instance as
-a file-like object. This allows you to do buffering::
-
-    >>> r = http.request(
-    ...     'GET',
-    ...     'http://httpbin.org/bytes/1024',
-    ...     preload_content=False)
-    >>> r.read(4)
-    b'\x88\x1f\x8b\xe5'
-
-Calls to :meth:`~response.HTTPResponse.read()` will block until more response
-data is available. 
-
-    >>> import io
-    >>> reader = io.BufferedReader(r, 8)
-    >>> reader.read(4)
-    >>> r.release_conn()
-
-You can use this file-like object to do things like decode the content using
-:mod:`codecs`::
-
-    >>> import codecs
-    >>> reader = codecs.getreader('utf-8')
-    >>> r = http.request(
-    ...     'GET',
-    ...     'http://httpbin.org/ip',
-    ...     preload_content=False)
-    >>> json.load(reader(r))
-    {'origin': '127.0.0.1'}
-    >>> r.release_conn()
-
-.. _proxies:
-
-Proxies
--------
-
-You can use :class:`~poolmanager.ProxyManager` to tunnel requests through an
-HTTP proxy::
-
-    >>> import urllib3
-    >>> proxy = urllib3.ProxyManager('http://localhost:3128/')
-    >>> proxy.request('GET', 'http://google.com/')
-
-The usage of :class:`~poolmanager.ProxyManager` is the same as
-:class:`~poolmanager.PoolManager`.
-
-You can use :class:`~contrib.socks.SOCKSProxyManager` to connect to SOCKS4 or
-SOCKS5 proxies. In order to use SOCKS proxies you will need to install
-`PySocks <https://pypi.org/project/PySocks/>`_ or install urllib3 with the
-``socks`` extra::
-
-    pip install urllib3[socks]
-
-Once PySocks is installed, you can use
-:class:`~contrib.socks.SOCKSProxyManager`::
-
-    >>> from urllib3.contrib.socks import SOCKSProxyManager
-    >>> proxy = SOCKSProxyManager('socks5://localhost:8889/')
-    >>> proxy.request('GET', 'http://google.com/')
-
-
-.. _ssl_custom:
-
-Custom SSL certificates
------------------------
-
-Instead of using `certifi <https://certifi.io/>`_ you can provide your
-own certificate authority bundle. This is useful for cases where you've
-generated your own certificates or when you're using a private certificate
-authority. Just provide the full path to the certificate bundle when creating a
-:class:`~poolmanager.PoolManager`::
-
-    >>> import urllib3
-    >>> http = urllib3.PoolManager(
-    ...     cert_reqs='CERT_REQUIRED',
-    ...     ca_certs='/path/to/your/certificate_bundle')
-
-When you specify your own certificate bundle only requests that can be
-verified with that bundle will succeed. It's recommended to use a separate
-:class:`~poolmanager.PoolManager` to make requests to URLs that do not need
-the custom certificate.
-
-.. _ssl_client:
-
-Client certificates
--------------------
-
-You can also specify a client certificate. This is useful when both the server
-and the client need to verify each other's identity. Typically these
-certificates are issued from the same authority. To use a client certificate,
-provide the full path when creating a :class:`~poolmanager.PoolManager`::
-
-    >>> http = urllib3.PoolManager(
-    ...     cert_file='/path/to/your/client_cert.pem',
-    ...     cert_reqs='CERT_REQUIRED',
-    ...     ca_certs='/path/to/your/certificate_bundle')
-
-If you have an encrypted client certificate private key you can use
-the ``key_password`` parameter to specify a password to decrypt the key. ::
-
-    >>> http = urllib3.PoolManager(
-    ...     cert_file='/path/to/your/client_cert.pem',
-    ...     cert_reqs='CERT_REQUIRED',
-    ...     key_file='/path/to/your/client.key',
-    ...     key_password='keyfile_password')
-
-If your key isn't encrypted the ``key_password`` parameter isn't required.
-
-.. _ssl_mac:
-
-Certificate validation and Mac OS X
------------------------------------
-
-Apple-provided Python and OpenSSL libraries contain a patches that make them
-automatically check the system keychain's certificates. This can be
-surprising if you specify custom certificates and see requests unexpectedly
-succeed. For example, if you are specifying your own certificate for validation
-and the server presents a different certificate you would expect the connection
-to fail. However, if that server presents a certificate that is in the system
-keychain then the connection will succeed.
-
-`This article <https://hynek.me/articles/apple-openssl-verification-surprises/>`_
-has more in-depth analysis and explanation.
-
-.. _ssl_warnings:
-
-SSL Warnings
-------------
-
-urllib3 will issue several different warnings based on the level of certificate
-verification support. These warnings indicate particular situations and can
-be resolved in different ways.
-
-* :class:`~exceptions.InsecureRequestWarning`
-    This happens when a request is made to an HTTPS URL without certificate
-    verification enabled. Follow the :ref:`certificate verification <ssl>`
-    guide to resolve this warning.
-* :class:`~exceptions.InsecurePlatformWarning`
-    This happens on Python 2 platforms that have an outdated :mod:`ssl` module.
-    These older :mod:`ssl` modules can cause some insecure requests to succeed
-    where they should fail and secure requests to fail where they should
-    succeed. Follow the :ref:`pyOpenSSL <ssl_py2>` guide to resolve this
-    warning.
-
-.. _sni_warning:
-
-* :class:`~exceptions.SNIMissingWarning`
-    This happens on Python 2 versions older than 2.7.9. These older versions
-    lack `SNI <https://en.wikipedia.org/wiki/Server_Name_Indication>`_ support.
-    This can cause servers to present a certificate that the client thinks is
-    invalid. Follow the :ref:`pyOpenSSL <ssl_py2>` guide to resolve this
-    warning.
-
-.. _disable_ssl_warnings:
-
-Making unverified HTTPS requests is **strongly** discouraged, however, if you
-understand the risks and wish to disable these warnings, you can use :func:`~urllib3.disable_warnings`::
-
-    >>> import urllib3
-    >>> urllib3.disable_warnings()
-
-Alternatively you can capture the warnings with the standard :mod:`logging` module::
-
-    >>> logging.captureWarnings(True)
-
-Finally, you can suppress the warnings at the interpreter level by setting the
-``PYTHONWARNINGS`` environment variable or by using the
-`-W flag <https://docs.python.org/3/using/cmdline.html#cmdoption-w>`_.
-
-Google App Engine
------------------
-
-urllib3 supports `Google App Engine <https://cloud.google.com/appengine>`_ with
-some caveats.
-
-If you're using the `Flexible environment
-<https://cloud.google.com/appengine/docs/flexible/>`_, you do not have to do
-any configuration- urllib3 will just work. However, if you're using the
-`Standard environment <https://cloud.google.com/appengine/docs/python/>`_ then
-you either have to use :mod:`urllib3.contrib.appengine`'s
-:class:`~urllib3.contrib.appengine.AppEngineManager` or use the `Sockets API
-<https://cloud.google.com/appengine/docs/python/sockets/>`_
-
-To use :class:`~urllib3.contrib.appengine.AppEngineManager`::
-
-    >>> from urllib3.contrib.appengine import AppEngineManager
-    >>> http = AppEngineManager()
-    >>> http.request('GET', 'https://google.com/')
-
-To use the Sockets API, add the following to your app.yaml and use
-:class:`~urllib3.poolmanager.PoolManager` as usual::
-
-    env_variables:
-        GAE_USE_SOCKETS_HTTPLIB : 'true'
-
-For more details on the limitations and gotchas, see
-:mod:`urllib3.contrib.appengine`.
-
-Brotli Encoding
----------------
-
-Brotli is a compression algorithm created by Google with better compression
-than gzip and deflate and is supported by urllib3 if the
-`brotlipy <https://github.com/python-hyper/brotlipy>`_ package is installed.
-You may also request the package be installed via the ``urllib3[brotli]`` extra::
-
-    python -m pip install urllib3[brotli]
-
-Here's an example using brotli encoding via the ``Accept-Encoding`` header::
-
-    >>> from urllib3 import PoolManager
-    >>> http = PoolManager()
-    >>> http.request('GET', 'https://www.google.com/', headers={'Accept-Encoding': 'br'})

+ 0 - 274
desktop/core/ext-py/urllib3-1.25.8/docs/conf.py

@@ -1,274 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# urllib3 documentation build configuration file, created by
-# sphinx-quickstart on Wed Oct  5 13:15:40 2011.
-#
-# This file is execfile()d with the current directory set to its containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-from datetime import date
-import os
-import sys
-
-import alabaster
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-
-root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
-sys.path.insert(0, root_path)
-
-# Mock some expensive/platform-specific modules so build will work.
-# (https://read-the-docs.readthedocs.io/en/latest/faq.html#\
-#  i-get-import-errors-on-libraries-that-depend-on-c-modules)
-import mock
-
-
-class MockModule(mock.Mock):
-    @classmethod
-    def __getattr__(cls, name):
-        return MockModule()
-
-
-MOCK_MODULES = (
-    'ntlm',
-)
-
-sys.modules.update((mod_name, MockModule()) for mod_name in MOCK_MODULES)
-
-
-import urllib3
-
-
-# -- General configuration -----------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be extensions
-# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = [
-    'alabaster',
-    'sphinx.ext.autodoc',
-    'sphinx.ext.doctest',
-    'sphinx.ext.intersphinx',
-]
-
-# Test code blocks only when explicitly specified
-doctest_test_doctest_blocks = ''
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix of source filenames.
-source_suffix = '.rst'
-
-# The encoding of source files.
-#source_encoding = 'utf-8-sig'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'urllib3'
-copyright = u'{year}, Andrey Petrov'.format(year=date.today().year)
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = urllib3.__version__
-# The full version, including alpha/beta/rc tags.
-release = version
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#language = None
-
-# There are two options for replacing |today|: either, you set today to some
-# non-false value, then it is used:
-#today = ''
-# Else, today_fmt is used as the format for a strftime call.
-#today_fmt = '%B %d, %Y'
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-exclude_patterns = ['_build']
-
-# The reST default role (used for this markup: `text`) to use for all documents.
-#default_role = None
-
-# If true, '()' will be appended to :func: etc. cross-reference text.
-#add_function_parentheses = True
-
-# If true, the current module name will be prepended to all description
-# unit titles (such as .. function::).
-#add_module_names = True
-
-# If true, sectionauthor and moduleauthor directives will be shown in the
-# output. They are ignored by default.
-#show_authors = False
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# A list of ignored prefixes for module index sorting.
-#modindex_common_prefix = []
-
-
-# -- Options for HTML output ---------------------------------------------------
-
-# The theme to use for HTML and HTML Help pages.  See the documentation for
-# a list of builtin themes.
-html_theme = 'alabaster'
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further.  For a list of options available for each theme, see the
-# documentation.
-html_theme_options = {
-    'description': 'Sanity-friendly HTTP client.',
-    'github_user': 'urllib3',
-    'github_repo': 'urllib3',
-    'github_button': False,
-    'github_banner': True,
-    'travis_button': True,
-    'show_powered_by': False,
-    'font_family': "'Roboto', Georgia, sans",
-    'head_font_family': "'Roboto', Georgia, serif",
-    'code_font_family': "'Roboto Mono', 'Consolas', monospace",
-}
-
-# Add any paths that contain custom themes here, relative to this directory.
-html_theme_path = [alabaster.get_path()]
-
-# The name for this set of Sphinx documents.  If None, it defaults to
-# "<project> v<release> documentation".
-#html_title = None
-
-# A shorter title for the navigation bar.  Default is the same as html_title.
-#html_short_title = None
-
-# The name of an image file (relative to this directory) to place at the top
-# of the sidebar.
-#html_logo = None
-
-# The name of an image file (within the static path) to use as favicon of the
-# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
-# pixels large.
-#html_favicon = None
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-#html_static_path = ['_static']
-
-# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
-# using the given strftime format.
-#html_last_updated_fmt = '%b %d, %Y'
-
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-#html_use_smartypants = True
-
-# Custom sidebar templates, maps document names to template names.
-html_sidebars = {
-    '**': [
-        'about.html',
-        'navigation.html',
-        'relations.html',
-        'searchbox.html',
-        'donate.html',
-    ]
-}
-
-# Additional templates that should be rendered to pages, maps page names to
-# template names.
-#html_additional_pages = {}
-
-# If false, no module index is generated.
-#html_domain_indices = True
-
-# If false, no index is generated.
-#html_use_index = True
-
-# If true, the index is split into individual pages for each letter.
-#html_split_index = False
-
-# If true, links to the reST sources are added to the pages.
-#html_show_sourcelink = True
-
-# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
-#html_show_sphinx = True
-
-# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
-#html_show_copyright = True
-
-# If true, an OpenSearch description file will be output, and all pages will
-# contain a <link> tag referring to it.  The value of this option must be the
-# base URL from which the finished HTML is served.
-#html_use_opensearch = ''
-
-# This is the file name suffix for HTML files (e.g. ".xhtml").
-#html_file_suffix = None
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'urllib3doc'
-
-
-# -- Options for LaTeX output --------------------------------------------------
-
-# The paper size ('letter' or 'a4').
-#latex_paper_size = 'letter'
-
-# The font size ('10pt', '11pt' or '12pt').
-#latex_font_size = '10pt'
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title, author, documentclass [howto/manual]).
-latex_documents = [
-  ('index', 'urllib3.tex', u'urllib3 Documentation',
-   u'Andrey Petrov', 'manual'),
-]
-
-# The name of an image file (relative to this directory) to place at the top of
-# the title page.
-#latex_logo = None
-
-# For "manual" documents, if this is true, then toplevel headings are parts,
-# not chapters.
-#latex_use_parts = False
-
-# If true, show page references after internal links.
-#latex_show_pagerefs = False
-
-# If true, show URL addresses after external links.
-#latex_show_urls = False
-
-# Additional stuff for the LaTeX preamble.
-#latex_preamble = ''
-
-# Documents to append as an appendix to all manuals.
-#latex_appendices = []
-
-# If false, no module index is generated.
-#latex_domain_indices = True
-
-
-# -- Options for manual page output --------------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
-    ('index', 'urllib3', u'urllib3 Documentation',
-     [u'Andrey Petrov'], 1)
-]
-
-intersphinx_mapping = {
-    'python': ('https://docs.python.org/3.7', None),}

+ 0 - 144
desktop/core/ext-py/urllib3-1.25.8/docs/contributing.rst

@@ -1,144 +0,0 @@
-Contributing
-============
-
-urllib3 is a community-maintained project and we happily accept contributions.
-
-If you wish to add a new feature or fix a bug:
-
-#. `Check for open issues <https://github.com/urllib3/urllib3/issues>`_ or open
-   a fresh issue to start a discussion around a feature idea or a bug. There is
-   a *Contributor Friendly* tag for issues that should be ideal for people who
-   are not very familiar with the codebase yet.
-#. Fork the `urllib3 repository on Github <https://github.com/urllib3/urllib3>`_
-   to start making your changes.
-#. Write a test which shows that the bug was fixed or that the feature works
-   as expected.
-#. Format your changes with black using command `$ nox -s blacken` and lint your
-   changes using command `nox -s lint`.
-#. Send a pull request and bug the maintainer until it gets merged and published.
-   :) Make sure to add yourself to ``CONTRIBUTORS.txt``.
-
-
-Setting up your development environment
----------------------------------------
-
-In order to setup the development environment all that you need is 
-`nox <https://nox.thea.codes/en/stable/index.html>`_ installed in your machine::
-
-  $ pip install --user --upgrade nox
-
-
-Running the tests
------------------
-
-We use some external dependencies, multiple interpreters and code coverage
-analysis while running test suite. Our ``noxfile.py`` handles much of this for
-you::
-
-  $ nox --sessions test-2.7 test-3.7
-  [ Nox will create virtualenv, install the specified dependencies, and run the commands in order.]
-  nox > Running session test-2.7
-  .......
-  .......
-  nox > Session test-2.7 was successful.
-  .......
-  .......
-  nox > Running session test-3.7
-  .......
-  .......
-  nox > Session test-3.7 was successful.
-
-There is also a nox command for running all of our tests and multiple python
-versions.
-
-  $ nox --sessions test
-
-Note that code coverage less than 100% is regarded as a failing run. Some
-platform-specific tests are skipped unless run in that platform.  To make sure
-the code works in all of urllib3's supported platforms, you can run our ``tox``
-suite::
-
-  $ nox --sessions test
-  [ Nox will create virtualenv, install the specified dependencies, and run the commands in order.]
-  .......
-  .......
-  nox > Session test-2.7 was successful.
-  nox > Session test-3.4 was successful.
-  nox > Session test-3.5 was successful.
-  nox > Session test-3.6 was successful.
-  nox > Session test-3.7 was successful.
-  nox > Session test-3.8 was successful.
-  nox > Session test-pypy was successful.
-
-Our test suite `runs continuously on Travis CI
-<https://travis-ci.org/urllib3/urllib3>`_ with every pull request.
-
-Releases
---------
-
-A release candidate can be created by any contributor by creating a branch
-named ``release-x.x`` where ``x.x`` is the version of the proposed release.
-
-- Update ``CHANGES.rst`` and ``urllib3/__init__.py`` with the proper version number
-  and commit the changes to ``release-x.x``.
-- Open a pull request to merge the ``release-x.x`` branch into the ``master`` branch.
-- Integration tests are run against the release candidate on Travis. From here on all
-  the steps below will be handled by a maintainer so unless you receive review comments
-  you are done here.
-- Once the pull request is squash merged into master the merging maintainer
-  will tag the merge commit with the version number:
-
-  - ``git tag -a 1.24.1 [commit sha]``
-  - ``git push origin master --tags``
-
-- After the commit is tagged Travis will build the tagged commit and upload the sdist and wheel
-  to PyPI and create a draft release on GitHub for the tag. The merging maintainer will
-  ensure that the PyPI sdist and wheel are properly uploaded.
-- The merging maintainer will mark the draft release on GitHub as an approved release.
-
-Sponsorship
------------
-
-.. |tideliftlogo| image:: https://nedbatchelder.com/pix/Tidelift_Logos_RGB_Tidelift_Shorthand_On-White_small.png
-   :width: 75
-   :alt: Tidelift
-
-.. list-table::
-   :widths: 10 100
-
-   * - |tideliftlogo|
-     - Professional support for urllib3 is available as part of the `Tidelift
-       Subscription`_.  Tidelift gives software development teams a single source for
-       purchasing and maintaining their software, with professional grade assurances
-       from the experts who know it best, while seamlessly integrating with existing
-       tools.
-
-.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=docs
-
-Please consider sponsoring urllib3 development, especially if your company
-benefits from this library.
-
-Your contribution will go towards adding new features to urllib3 and making
-sure all functionality continues to meet our high quality standards.
-
-We also welcome sponsorship in the form of time. We greatly appreciate companies
-who encourage employees to contribute on an ongoing basis during their work hours.
-Please let us know and we'll be glad to add you to our sponsors list!
-
-A grant for contiguous full-time development has the biggest impact for
-progress. Periods of 3 to 10 days allow a contributor to tackle substantial
-complex issues which are otherwise left to linger until somebody can't afford
-to not fix them.
-
-Contact `@theacodes <https://github.com/theacodes>`_ or `@shazow <https://github.com/shazow>`_ 
-to arrange a grant for a core contributor.
-
-Huge thanks to all the companies and individuals who financially contributed to
-the development of urllib3. Please send a PR if you've donated and would like
-to be listed.
-
-* `GOVCERT.LU <https://govcert.lu/>`_ (October 23, 2018)
-
-* `Stripe <https://stripe.com/>`_ (June 23, 2014)
-
-.. * [Company] ([date])

+ 0 - 90
desktop/core/ext-py/urllib3-1.25.8/docs/reference/index.rst

@@ -1,90 +0,0 @@
-Reference
-=========
-
-.. contents::
-    :local:
-    :backlinks: none
-
-Subpackages
------------
-
-.. toctree::
-
-    urllib3.contrib
-    urllib3.util
-
-Submodules
-----------
-
-urllib3.connection module
--------------------------
-
-.. automodule:: urllib3.connection
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-urllib3.connectionpool module
------------------------------
-
-.. automodule:: urllib3.connectionpool
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-urllib3.exceptions module
--------------------------
-
-.. automodule:: urllib3.exceptions
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-urllib3.fields module
----------------------
-
-.. automodule:: urllib3.fields
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-urllib3.filepost module
------------------------
-
-.. automodule:: urllib3.filepost
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-urllib3.poolmanager module
---------------------------
-
-.. automodule:: urllib3.poolmanager
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-urllib3.request module
-----------------------
-
-.. automodule:: urllib3.request
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-urllib3.response module
------------------------
-
-.. automodule:: urllib3.response
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-
-Module contents
----------------
-
-.. automodule:: urllib3
-    :members:
-    :undoc-members:
-    :show-inheritance:

+ 0 - 37
desktop/core/ext-py/urllib3-1.25.8/docs/reference/urllib3.contrib.rst

@@ -1,37 +0,0 @@
-urllib3.contrib package
-=======================
-
-These modules implement various extra features, that may not be ready for
-prime time or that require optional third-party dependencies.
-
-urllib3.contrib.appengine module
---------------------------------
-
-.. automodule:: urllib3.contrib.appengine
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-urllib3.contrib.ntlmpool module
--------------------------------
-
-.. automodule:: urllib3.contrib.ntlmpool
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-urllib3.contrib.pyopenssl module
---------------------------------
-
-.. automodule:: urllib3.contrib.pyopenssl
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-urllib3.contrib.socks module
-----------------------------
-
-.. automodule:: urllib3.contrib.socks
-    :members:
-    :undoc-members:
-    :show-inheritance:

+ 0 - 70
desktop/core/ext-py/urllib3-1.25.8/docs/reference/urllib3.util.rst

@@ -1,70 +0,0 @@
-urllib3.util package
-====================
-
-Useful methods for working with :mod:`httplib`, completely decoupled from
-code specific to **urllib3**.
-
-At the very core, just like its predecessors, :mod:`urllib3` is built on top of
-:mod:`httplib` -- the lowest level HTTP library included in the Python
-standard library.
-
-To aid the limited functionality of the :mod:`httplib` module, :mod:`urllib3`
-provides various helper methods which are used with the higher level components
-but can also be used independently.
-
-urllib3.util.connection module
-------------------------------
-
-.. automodule:: urllib3.util.connection
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-urllib3.util.request module
----------------------------
-
-.. automodule:: urllib3.util.request
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-urllib3.util.response module
-----------------------------
-
-.. automodule:: urllib3.util.response
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-urllib3.util.retry module
--------------------------
-
-.. automodule:: urllib3.util.retry
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-urllib3.util.timeout module
----------------------------
-
-.. automodule:: urllib3.util.timeout
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-urllib3.util.url module
------------------------
-
-.. automodule:: urllib3.util.url
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-
-Module contents
----------------
-
-.. automodule:: urllib3.util
-    :members:
-    :undoc-members:
-    :show-inheritance:

+ 0 - 24
desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/README.rst

@@ -1,24 +0,0 @@
-Creating a new SAN-less CRT
----------------------------
-
-(Instructions lifted from Heroku_)
-
-1. Generate a new CSR::
-   
-       openssl req -new -key server.key -out server.new.csr -nodes -days 10957
-
-2. Generate a new CRT::
-
-       openssl x509 -req -in server.new.csr -signkey server.key -out server.new.crt -days 10957
-
-Creating a new PEM file with your new CRT
------------------------------------------
-
-1. Concatenate the ``crt`` and ``key`` files into one::
-
-       cat server.new.crt server.key > cacert.new.pem
-
-
-:Last Modified: 1 Nov 2014
-
-.. _Heroku: https://devcenter.heroku.com/articles/ssl-certificate-self

+ 0 - 15
desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/cacert.key

@@ -1,15 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIICXgIBAAKBgQDKz8a9X2SfNms9TffyNaFO/K42fAjUI1dAM1G8TVoj0a81ay7W
-z4R7V1zfjXFT/WoRW04Y6xek0bff0OtsW+AriooUy7+pPYnrchpAW0p7hPjH1DIB
-Vab01CJMhQ24er92Q1dF4WBv4yKqEaV1IYz1cvqvCCJgAbsWn1I8Cna1lwIDAQAB
-AoGAPpkK+oBrCkk9qFpcYUH0W/DZxK9b+j4+O+6bF8e4Pr4FmjNO7bZ3aap5W/bI
-N+hLyLepzz8guRqR6l8NixCAi+JiVW/agh5o4Jrek8UJWQamwSL4nJ36U3Iw/l7w
-vcN1txfkpsA2SB9QFPGfDKcP3+IZMOZ7uFLzk/gzgLYiCEECQQD+M5Lj+e/sNBkb
-XeIBxWIrPfEeIkk4SDkqImzDjq1FcfxZkvfskqyJgUvcLe5hb+ibY8jqWvtpvFTI
-5v/tzHvPAkEAzD8fNrGz8KiAVTo7+0vrb4AebAdSLZUvbp0AGs5pXUAuQx6VEgz8
-opNKpZjBwAFsZKlwhgDqaChiAt9aKUkzuQJBALlai9I2Dg7SkjgVRdX6wjE7slRB
-tdgXOa+SeHJD1+5aRiJeeu8CqFJ/d/wtdbOQsTCVGwxfmREpZT00ywrvXpsCQQCU
-gs1Kcrn5Ijx2PCrDFbfyUkFMoaIiXNipYGVkGHRKhtFcoo8YGfNUry7W7BTtbNuI
-8h9MgLvw0nQ5zHf9jymZAkEA7o4uA6XSS1zUqEQ55bZRFHcz/99pLH35G906iwVb
-d5rd1Z4Cf5s/91o5gwL6ZP2Ig34CCn+NSL4avgz6K0VUaA==
------END RSA PRIVATE KEY-----

+ 0 - 23
desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/cacert.pem

@@ -1,23 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDzDCCAzWgAwIBAgIJALPrscov4b/jMA0GCSqGSIb3DQEBBQUAMIGBMQswCQYD
-VQQGEwJGSTEOMAwGA1UECAwFZHVtbXkxDjAMBgNVBAcMBWR1bW15MQ4wDAYDVQQK
-DAVkdW1teTEOMAwGA1UECwwFZHVtbXkxETAPBgNVBAMMCFNuYWtlT2lsMR8wHQYJ
-KoZIhvcNAQkBFhBkdW1teUB0ZXN0LmxvY2FsMB4XDTExMTIyMjA3NTYxNVoXDTIx
-MTIxOTA3NTYxNVowgYExCzAJBgNVBAYTAkZJMQ4wDAYDVQQIDAVkdW1teTEOMAwG
-A1UEBwwFZHVtbXkxDjAMBgNVBAoMBWR1bW15MQ4wDAYDVQQLDAVkdW1teTERMA8G
-A1UEAwwIU25ha2VPaWwxHzAdBgkqhkiG9w0BCQEWEGR1bW15QHRlc3QubG9jYWww
-gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMrPxr1fZJ82az1N9/I1oU78rjZ8
-CNQjV0AzUbxNWiPRrzVrLtbPhHtXXN+NcVP9ahFbThjrF6TRt9/Q62xb4CuKihTL
-v6k9ietyGkBbSnuE+MfUMgFVpvTUIkyFDbh6v3ZDV0XhYG/jIqoRpXUhjPVy+q8I
-ImABuxafUjwKdrWXAgMBAAGjggFIMIIBRDAdBgNVHQ4EFgQUGXd/I2JiQllF+3Wd
-x3NyBLszCi0wgbYGA1UdIwSBrjCBq4AUGXd/I2JiQllF+3Wdx3NyBLszCi2hgYek
-gYQwgYExCzAJBgNVBAYTAkZJMQ4wDAYDVQQIDAVkdW1teTEOMAwGA1UEBwwFZHVt
-bXkxDjAMBgNVBAoMBWR1bW15MQ4wDAYDVQQLDAVkdW1teTERMA8GA1UEAwwIU25h
-a2VPaWwxHzAdBgkqhkiG9w0BCQEWEGR1bW15QHRlc3QubG9jYWyCCQCz67HKL+G/
-4zAPBgNVHRMBAf8EBTADAQH/MBEGCWCGSAGG+EIBAQQEAwIBBjAJBgNVHRIEAjAA
-MCsGCWCGSAGG+EIBDQQeFhxUaW55Q0EgR2VuZXJhdGVkIENlcnRpZmljYXRlMA4G
-A1UdDwEB/wQEAwICBDANBgkqhkiG9w0BAQUFAAOBgQBvz3AlIM1x7CMmwkmhLV6+
-PJkMnPW7XbP+cDYUlddCk7XhIDY4486JxqZegMTWgbUt0AgXYfHLFsTqUJXrnLj2
-WqLb3KP2D1HvnvxJjdJV3M6+TP7tGiY4ICi0zff96FG5C2w9Avsozhr3xDFtjKBv
-gyA6UdP3oZGN93oOFiMJXg==
------END CERTIFICATE-----

+ 0 - 17
desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/client_bad.pem

@@ -1,17 +0,0 @@
------BEGIN CERTIFICATE-----
-MIICsDCCAhmgAwIBAgIJAL63Nc6KY94BMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
-BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
-aWRnaXRzIFB0eSBMdGQwHhcNMTExMDExMjMxMjAzWhcNMjExMDA4MjMxMjAzWjBF
-MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
-ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
-gQC8HGxvblJ4Z0i/lIlG8jrNsFrCqYRAXtj3xdnnjfUpd/kNhU/KahMsG6urAe/4
-Yj+Zqf1sVnt0Cye8FZE3cN9RAcwJrlTCRiicJiXEbA7cPfMphqNGqjVHtmxQ1OsU
-NHK7cxKa9OX3xmg4h55vxSZYgibAEPO2g3ueGk7RWIAQ8wIDAQABo4GnMIGkMB0G
-A1UdDgQWBBSeeo/YRpdn5DK6bUI7ZDJ57pzGdDB1BgNVHSMEbjBsgBSeeo/YRpdn
-5DK6bUI7ZDJ57pzGdKFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUt
-U3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAL63Nc6K
-Y94BMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAOntoloMGt1325UR0
-GGEKQJbiRhLXY4otdgFjEvCG2RPZVLxWYhLMu0LkB6HBYULEuoy12ushtRWlhS1k
-6PNRkaZ+LQTSREj6Do4c4zzLxCDmxYmejOz63cIWX2x5IY6qEx2BNOfmM4xEdF8W
-LSGGbQfuAghiEh0giAi4AQloDlY=
------END CERTIFICATE-----

+ 0 - 33
desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/client_intermediate.pem

@@ -1,33 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIChzCCAfCgAwIBAgIUZgix95Zxzc+WryIWanrDezW1VjcwDQYJKoZIhvcNAQEL
-BQAwRDEbMBkGA1UECgwSdHJ1c3RtZSB2MC40LjArZGV2MSUwIwYDVQQLDBxUZXN0
-aW5nIENBICNwN2dEd0tMS3EydlJOajZmMCAXDTAwMDEwMTAwMDAwMFoYDzMwMDAw
-MTAxMDAwMDAwWjBNMRswGQYDVQQKDBJ0cnVzdG1lIHYwLjQuMCtkZXYxLjAsBgNV
-BAsMJVRlc3Rpbmcgc2VydmVyIGNlcnQgI0NPajVGVkxXWEVtcmFHNTQwgZ8wDQYJ
-KoZIhvcNAQEBBQADgY0AMIGJAoGBAKeE765+Ws1ZdC86tfZ5LvLTjWluQgmsTx2o
-7xhYAOFmTbZb6qNLCDS07R1VP74ve6UlFD55cV8VbxvEZd8Z3LOADF6nTN61XPbj
-dn2J6GfsSjaHE6+mJDXhCtVrD4EGdD4nXRem48mjsrAkrvJ8v4gQNzGzQ27D2dWT
-B7Ij6mWNAgMBAAGjazBpMB0GA1UdDgQWBBT66uW6I2OfZYacXgQkop4qlX+qJTAM
-BgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFESoDYfzVyFP3QHyZG9cvxmlBIGsMBkG
-A1UdEQEB/wQPMA2CC2xvY2FsY2xpZW50MA0GCSqGSIb3DQEBCwUAA4GBAG8zoqW0
-w5ROSuNFE7fi5I4bdC6sbddiFRXX//TkP2vRD3cM11AKp52UjzK2nUrkoigrJ5p8
-xa/PGnPfOVCPiKIb1kzeI/7tyBet6n3q2L0wQo3PR/QCHeSiIpm8lAi1a+8ShXFM
-F2CG+z7IN0cQO4bzcwtkk8MhcCsMP14K5PK2
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICwjCCAiugAwIBAgIUWL7wOmK0BVMR8LM5UBewDZEEuH0wDQYJKoZIhvcNAQEL
-BQAwgYExCzAJBgNVBAYTAkZJMQ4wDAYDVQQIDAVkdW1teTEOMAwGA1UEBwwFZHVt
-bXkxDjAMBgNVBAoMBWR1bW15MQ4wDAYDVQQLDAVkdW1teTERMA8GA1UEAwwIU25h
-a2VPaWwxHzAdBgkqhkiG9w0BCQEWEGR1bW15QHRlc3QubG9jYWwwIBcNMDAwMTAx
-MDAwMDAwWhgPMzAwMDAxMDEwMDAwMDBaMEQxGzAZBgNVBAoMEnRydXN0bWUgdjAu
-NC4wK2RldjElMCMGA1UECwwcVGVzdGluZyBDQSAjcDdnRHdLTEtxMnZSTmo2ZjCB
-nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAr7134NKsqNQ44gIFElVC5KnGYIYv
-D96Kv+5UgXVAyNNK4NpQXHVFmCZpSuyvlz4UZzFBoykISjU+vcGqbFqwRrYciPwh
-45HVQgtoe0SSpze7sv0qsMJiGNRDK06nVI/aCHP9FRoD5iPq8E7lSNVYipai466G
-1lEvVLb0SGNihAUCAwEAAaNxMG8wHQYDVR0OBBYEFESoDYfzVyFP3QHyZG9cvxml
-BIGsMBIGA1UdEwEB/wQIMAYBAf8CAQgwDgYDVR0PAQH/BAQDAgEGMCoGA1UdJQEB
-/wQgMB4GCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMwDQYJKoZIhvcNAQEL
-BQADgYEAEs9EAeL3300UxzmT4zyj2cHB2GQxisteEuz9VcWhrvyNDxQ3ko0BxG04
-4fye7dpElrrbSq8PYkygA1qiBCN2NL+v78XWb2OYd7PptpbPehzaEpCTK37O+Num
-sB4v1c63r2w1mH1lSjZDkJfd1hml+VwntSzuCmGERlroE6PQwf8=
------END CERTIFICATE-----

+ 0 - 18
desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/client_password.key

@@ -1,18 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: AES-256-CBC,70C641602D5F366DC5DB70645351993D
-
-/Ijrtw+2Rjc1mQCXWoNCtzjbRoIhBHQu9ZbQoCnC4/lHru2megV0vDQju0yYjs2H
-7Y7tnMe0hlR9F21be6AkoKDF4B5Kg2X47fwG5V9SIbHBkz3KClfnPp/ojrhIWLTo
-grtZoXBFkivDnkuF9NO3qRlskP7u//r3kB5uXIG0ZpfUbRwgm13SqHj1oEB9RdYM
-bGhB3tL6dxdIXEgyc9numKBQ0lQu5yYlOH+1aiJSQQdN59ZunreIq//UM1Qc7Uj/
-ILJusFmnec40ArJ+aykENWkToHSKkpeL6no6ZRCnkAYqtUJ84B6zMv9zYhN5UF3O
-WHP/4FAu4AylJvNx9sYxXdGaBb+YcX46B7wQk2mkmCtK6cgkrNV3/bohUbYt3tSe
-K9dH2xe9orxsGQjoKxylwh7+h8o+BwHpk1naFSzliQV4gvi8yBEzXxM98vNU5B4L
-ex8Q2ARWvfNc7OBqboPP0yBMKP/cV9n+fNMwbP0koHxBt71527fVQLoemMiPRb5M
-+rcufc+80AUK4baAA5Nu2sZGRqoiFemQ2vgEAxOzRbt/pHzdheO6OHqLJ5W4IWaW
-Erojm7/ar6gDlIIGwM8IJdbcMG69s7r8u47lD45ONQMq41Io4Svvs0SCgdRhLt/3
-Nb6Smxy7vWFOcrHEJVsv27UD0FViaYHy37DIc6lVvX9s6+VKbdIYuiqxalbaCpKo
-VP8kdQZ4SFBAxV9cgPjFbQKVBXkLBdxJKGPzzK3Jc9khD1uHp5Um8OSM21Kh55N3
-jvDY5h8fQ0cPyJmlZJzRdYi1+8H5TSFvEXd6cqVkYWiJ1ac0gPOoVt7+YAZ6JB2J
------END RSA PRIVATE KEY-----

+ 0 - 36
desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/server.combined.pem

@@ -1,36 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDczCCAtygAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UEBhMCRkkx
-DjAMBgNVBAgMBWR1bW15MQ4wDAYDVQQHDAVkdW1teTEOMAwGA1UECgwFZHVtbXkx
-DjAMBgNVBAsMBWR1bW15MREwDwYDVQQDDAhTbmFrZU9pbDEfMB0GCSqGSIb3DQEJ
-ARYQZHVtbXlAdGVzdC5sb2NhbDAeFw0xMTEyMjIwNzU4NDBaFw0yMTEyMTgwNzU4
-NDBaMGExCzAJBgNVBAYTAkZJMQ4wDAYDVQQIDAVkdW1teTEOMAwGA1UEBwwFZHVt
-bXkxDjAMBgNVBAoMBWR1bW15MQ4wDAYDVQQLDAVkdW1teTESMBAGA1UEAwwJbG9j
-YWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDXe3FqmCWvP8XPxqtT
-+0bfL1Tvzvebi46k0WIcUV8bP3vyYiSRXG9ALmyzZH4GHY9UVs4OEDkCMDOBSezB
-0y9ai/9doTNcaictdEBu8nfdXKoTtzrn+VX4UPrkH5hm7NQ1fTQuj1MR7yBCmYqN
-3Q2Q+Efuujyx0FwBzAuy1aKYuwIDAQABo4IBGDCCARQwCQYDVR0TBAIwADAdBgNV
-HQ4EFgQUG+dK5Uos08QUwAWofDb3a8YcYlIwgbYGA1UdIwSBrjCBq4AUGXd/I2Ji
-QllF+3Wdx3NyBLszCi2hgYekgYQwgYExCzAJBgNVBAYTAkZJMQ4wDAYDVQQIDAVk
-dW1teTEOMAwGA1UEBwwFZHVtbXkxDjAMBgNVBAoMBWR1bW15MQ4wDAYDVQQLDAVk
-dW1teTERMA8GA1UEAwwIU25ha2VPaWwxHzAdBgkqhkiG9w0BCQEWEGR1bW15QHRl
-c3QubG9jYWyCCQCz67HKL+G/4zAJBgNVHRIEAjAAMCQGA1UdEQQdMBuBDnJvb3RA
-bG9jYWxob3N0gglsb2NhbGhvc3QwDQYJKoZIhvcNAQEFBQADgYEAgcW6X1ZUyufm
-TFEqEAdpKXdL0rxDwcsM/qqqsXbkz17otH6ujPhBEagzdKtgeNKfy0aXz6rWZugk
-lF0IqyC4mcI+vvfgGR5Iy4KdXMrIX98MbrvGJBfbdKhGW2b84wDV42DIDiD2ZGGe
-6YZQQIo9LxjuOTf9jsvf+PIkbI4H0To=
------END CERTIFICATE-----
------BEGIN RSA PRIVATE KEY-----
-MIICXgIBAAKBgQDXe3FqmCWvP8XPxqtT+0bfL1Tvzvebi46k0WIcUV8bP3vyYiSR
-XG9ALmyzZH4GHY9UVs4OEDkCMDOBSezB0y9ai/9doTNcaictdEBu8nfdXKoTtzrn
-+VX4UPrkH5hm7NQ1fTQuj1MR7yBCmYqN3Q2Q+Efuujyx0FwBzAuy1aKYuwIDAQAB
-AoGBANOGBM6bbhq7ImYU4qf8+RQrdVg2tc9Fzo+yTnn30sF/rx8/AiCDOV4qdGAh
-HKjKKaGj2H/rotqoEFcxBy05LrgJXxydBP72e9PYhNgKOcSmCQu4yALIPEXfKuIM
-zgAErHVJ2l79fif3D4hzNyz+u5E1A9n3FG9cgaJSiYP8IG2RAkEA82GZ8rBkSGQQ
-ZQ3oFuzPAAL21lbj8D0p76fsCpvS7427DtZDOjhOIKZmaeykpv+qSzRraqEqjDRi
-S4kjQvwh6QJBAOKniZ+NDo2lSpbOFk+XlmABK1DormVpj8KebHEZYok1lRI+WiX9
-Nnoe9YLgix7++6H5SBBCcTB4HvM+5A4BuwMCQQChcX/eZbXP81iQwB3Rfzp8xnqY
-icDf7qKvz9Ma4myU7Y5E9EpaB1mD/P14jDpYcMW050vNyqTfpiwB8TFL0NZpAkEA
-02jkFH9UyMgZV6qo4tqI98l/ZrtyF8OrxSNSEPhVkZf6EQc5vN9/lc8Uv1vESEgb
-3AwRrKDcxRH2BHtv6qSwkwJAGjqnkIcEkA75r1e55/EF2chcZW1+tpwKupE8CtAH
-VXGd5DVwt4cYWkLUj2gF2fJbV97uu2MAg5CFDb+vQ6p5eA==
------END RSA PRIVATE KEY-----

+ 0 - 21
desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/server.crt

@@ -1,21 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDczCCAtygAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UEBhMCRkkx
-DjAMBgNVBAgMBWR1bW15MQ4wDAYDVQQHDAVkdW1teTEOMAwGA1UECgwFZHVtbXkx
-DjAMBgNVBAsMBWR1bW15MREwDwYDVQQDDAhTbmFrZU9pbDEfMB0GCSqGSIb3DQEJ
-ARYQZHVtbXlAdGVzdC5sb2NhbDAeFw0xMTEyMjIwNzU4NDBaFw0yMTEyMTgwNzU4
-NDBaMGExCzAJBgNVBAYTAkZJMQ4wDAYDVQQIDAVkdW1teTEOMAwGA1UEBwwFZHVt
-bXkxDjAMBgNVBAoMBWR1bW15MQ4wDAYDVQQLDAVkdW1teTESMBAGA1UEAwwJbG9j
-YWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDXe3FqmCWvP8XPxqtT
-+0bfL1Tvzvebi46k0WIcUV8bP3vyYiSRXG9ALmyzZH4GHY9UVs4OEDkCMDOBSezB
-0y9ai/9doTNcaictdEBu8nfdXKoTtzrn+VX4UPrkH5hm7NQ1fTQuj1MR7yBCmYqN
-3Q2Q+Efuujyx0FwBzAuy1aKYuwIDAQABo4IBGDCCARQwCQYDVR0TBAIwADAdBgNV
-HQ4EFgQUG+dK5Uos08QUwAWofDb3a8YcYlIwgbYGA1UdIwSBrjCBq4AUGXd/I2Ji
-QllF+3Wdx3NyBLszCi2hgYekgYQwgYExCzAJBgNVBAYTAkZJMQ4wDAYDVQQIDAVk
-dW1teTEOMAwGA1UEBwwFZHVtbXkxDjAMBgNVBAoMBWR1bW15MQ4wDAYDVQQLDAVk
-dW1teTERMA8GA1UEAwwIU25ha2VPaWwxHzAdBgkqhkiG9w0BCQEWEGR1bW15QHRl
-c3QubG9jYWyCCQCz67HKL+G/4zAJBgNVHRIEAjAAMCQGA1UdEQQdMBuBDnJvb3RA
-bG9jYWxob3N0gglsb2NhbGhvc3QwDQYJKoZIhvcNAQEFBQADgYEAgcW6X1ZUyufm
-TFEqEAdpKXdL0rxDwcsM/qqqsXbkz17otH6ujPhBEagzdKtgeNKfy0aXz6rWZugk
-lF0IqyC4mcI+vvfgGR5Iy4KdXMrIX98MbrvGJBfbdKhGW2b84wDV42DIDiD2ZGGe
-6YZQQIo9LxjuOTf9jsvf+PIkbI4H0To=
------END CERTIFICATE-----

+ 0 - 22
desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/server.csr

@@ -1,22 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDqDCCAxGgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UEBhMCRkkx
-DjAMBgNVBAgTBWR1bW15MQ4wDAYDVQQHEwVkdW1teTEOMAwGA1UEChMFZHVtbXkx
-DjAMBgNVBAsTBWR1bW15MREwDwYDVQQDEwhTbmFrZU9pbDEfMB0GCSqGSIb3DQEJ
-ARYQZHVtbXlAdGVzdC5sb2NhbDAeFw0xMTEyMjIwNzU4NDBaFw0yMTEyMTgwNzU4
-NDBaMGExCzAJBgNVBAYTAkZJMQ4wDAYDVQQIEwVkdW1teTEOMAwGA1UEBxMFZHVt
-bXkxDjAMBgNVBAoTBWR1bW15MQ4wDAYDVQQLEwVkdW1teTESMBAGA1UEAxMJbG9j
-YWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDXe3FqmCWvP8XPxqtT
-+0bfL1Tvzvebi46k0WIcUV8bP3vyYiSRXG9ALmyzZH4GHY9UVs4OEDkCMDOBSezB
-0y9ai/9doTNcaictdEBu8nfdXKoTtzrn+VX4UPrkH5hm7NQ1fTQuj1MR7yBCmYqN
-3Q2Q+Efuujyx0FwBzAuy1aKYuwIDAQABo4IBTTCCAUkwCQYDVR0TBAIwADARBglg
-hkgBhvhCAQEEBAMCBkAwKwYJYIZIAYb4QgENBB4WHFRpbnlDQSBHZW5lcmF0ZWQg
-Q2VydGlmaWNhdGUwHQYDVR0OBBYEFBvnSuVKLNPEFMAFqHw292vGHGJSMIG2BgNV
-HSMEga4wgauAFBl3fyNiYkJZRft1ncdzcgS7MwotoYGHpIGEMIGBMQswCQYDVQQG
-EwJGSTEOMAwGA1UECBMFZHVtbXkxDjAMBgNVBAcTBWR1bW15MQ4wDAYDVQQKEwVk
-dW1teTEOMAwGA1UECxMFZHVtbXkxETAPBgNVBAMTCFNuYWtlT2lsMR8wHQYJKoZI
-hvcNAQkBFhBkdW1teUB0ZXN0LmxvY2FsggkAs+uxyi/hv+MwCQYDVR0SBAIwADAZ
-BgNVHREEEjAQgQ5yb290QGxvY2FsaG9zdDANBgkqhkiG9w0BAQUFAAOBgQBXdedG
-XHLPmOVBeKWjTmaekcaQi44snhYqE1uXRoIQXQsyw+Ya5+n/uRxPKZO/C78EESL0
-8rnLTdZXm4GBYyHYmMy0AdWR7y030viOzAkWWRRRbuecsaUzFCI+F9jTV5LHuRzz
-V8fUKwiEE9swzkWgMpfVTPFuPgzxwG9gMbrBfg==
------END CERTIFICATE-----

+ 0 - 15
desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/server.key

@@ -1,15 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIICXgIBAAKBgQDXe3FqmCWvP8XPxqtT+0bfL1Tvzvebi46k0WIcUV8bP3vyYiSR
-XG9ALmyzZH4GHY9UVs4OEDkCMDOBSezB0y9ai/9doTNcaictdEBu8nfdXKoTtzrn
-+VX4UPrkH5hm7NQ1fTQuj1MR7yBCmYqN3Q2Q+Efuujyx0FwBzAuy1aKYuwIDAQAB
-AoGBANOGBM6bbhq7ImYU4qf8+RQrdVg2tc9Fzo+yTnn30sF/rx8/AiCDOV4qdGAh
-HKjKKaGj2H/rotqoEFcxBy05LrgJXxydBP72e9PYhNgKOcSmCQu4yALIPEXfKuIM
-zgAErHVJ2l79fif3D4hzNyz+u5E1A9n3FG9cgaJSiYP8IG2RAkEA82GZ8rBkSGQQ
-ZQ3oFuzPAAL21lbj8D0p76fsCpvS7427DtZDOjhOIKZmaeykpv+qSzRraqEqjDRi
-S4kjQvwh6QJBAOKniZ+NDo2lSpbOFk+XlmABK1DormVpj8KebHEZYok1lRI+WiX9
-Nnoe9YLgix7++6H5SBBCcTB4HvM+5A4BuwMCQQChcX/eZbXP81iQwB3Rfzp8xnqY
-icDf7qKvz9Ma4myU7Y5E9EpaB1mD/P14jDpYcMW050vNyqTfpiwB8TFL0NZpAkEA
-02jkFH9UyMgZV6qo4tqI98l/ZrtyF8OrxSNSEPhVkZf6EQc5vN9/lc8Uv1vESEgb
-3AwRrKDcxRH2BHtv6qSwkwJAGjqnkIcEkA75r1e55/EF2chcZW1+tpwKupE8CtAH
-VXGd5DVwt4cYWkLUj2gF2fJbV97uu2MAg5CFDb+vQ6p5eA==
------END RSA PRIVATE KEY-----

+ 0 - 12
desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/server.key.org

@@ -1,12 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: DES-EDE3-CBC,8B3708EAD53963D4
-
-uyLo4sFmSo7+K1uVgSENI+85JsG5o1JmovvxD/ucUl9CDhDj4KgFzs95r7gjjlhS
-kA/hIY8Ec9i6T3zMXpAswWI5Mv2LE+UdYR5h60dYtIinLC7KF0QIztSecNWy20Bi
-/NkobZhN7VZUuCEoSRWj4Ia3EuATF8Y9ZRGFPNsqMbSAhsGZ1P5xbDMEpE+5PbJP
-LvdF9yWDT77rHeI4CKV4aP/yxtm1heEhKw5o6hdpPBQajPpjSQbh7/V6Qd0QsKcV
-n27kPnSabsTbbc2IR40il4mZfHvXAlp4KoHL3RUgaons7q0hAUpUi+vJXbEukGGt
-3dlyWwKwEFS7xBQ1pQvzcePI4/fRQxhZNxeFZW6n12Y3X61vg1IsG7usPhRe3iDP
-3g1MXQMAhxaECnDN9b006IeoYdaktd4wrs/fn8x6Yz4=
------END RSA PRIVATE KEY-----

+ 0 - 18
desktop/core/ext-py/urllib3-1.25.8/dummyserver/certs/server_password.key

@@ -1,18 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: AES-256-CBC,D1BAE8F8B899FD9C2367B4CCF40917CF
-
-emTIXrQCcOcHtknXXZwK9X4qS8WcT6ozH2TTTDOcz9+G6CnszwvnsLCnO3eiLVbI
-NXiFib7ulQksoHQd2MPC9pjWm1a8vadMYOWgx8jnYkgVE+l1ICGgZVACg55/E6Xj
-qC4hZijQnKhPPyzdebeos2IIk7B3op4kHYJQGpwisAuSmT06c2x/jsmFr+2UMSq5
-Xf+kWuQlHUPcDct6uLJJ4zhFljcxFvk3cgMZIJaqyWCX7+gDCOi2gWrP2l1osllc
-q0egNUdg3RVrbxgxFn4XdHpmTNbIc3NTTR+xYuqHun8UbJrss1Ed25rrK0QzuV0l
-vyKLj1MSOV9VRCujF58I9whDZSwt07Aozmm1JC9F8kyMhbL9C4gmwEKHIQ5N5I+V
-mZKKAbJyQ2B1Oza/yZUnJG6hUyKTVbbCW57OltTDr4KlUzYUJJzTVyMy14AVv3zU
-GzKX5m3AzWMjykpmHjYNcI/zMQem0OQB2U9Pqyyh2GzItnHpnkqb7RDJSIYiOToc
-jA65NhS4sIZWWzwsRRaE2sq1rlssQFkzM3gIHi2C+tJD3PvmYRKW+6fLLNCqikMk
-w4OvHc8U/hIY2YnGAzjE7bbCrkQduhCwBL7bK08HYrluQv6dgVJLA9TtC4jYLYeo
-1uXDNGcY943fwU5h/YwQbvVQ5oo9oHBJuLgUzXlPjc+va4gw0JSG59GgXaTMVTjw
-wybmcNlaFZbK0XrveX3ykJimnuDK29yY4nWSzPFRxvaaWaRAL4IgEXvKCiQhg8NE
-snV2L3uQgJNv6RmE+c4HzQQ71iZuZ+iJglzt/iG4pO88zxjLLfT4qwfPAlEdxRmN
------END RSA PRIVATE KEY-----

+ 0 - 5
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/packages/__init__.py

@@ -1,5 +0,0 @@
-from __future__ import absolute_import
-
-from . import ssl_match_hostname
-
-__all__ = ("ssl_match_hostname",)

+ 0 - 19
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/packages/ssl_match_hostname/__init__.py

@@ -1,19 +0,0 @@
-import sys
-
-try:
-    # Our match_hostname function is the same as 3.5's, so we only want to
-    # import the match_hostname function if it's at least that good.
-    if sys.version_info < (3, 5):
-        raise ImportError("Fallback to vendored code")
-
-    from ssl import CertificateError, match_hostname
-except ImportError:
-    try:
-        # Backport of the function from a pypi module
-        from backports.ssl_match_hostname import CertificateError, match_hostname
-    except ImportError:
-        # Our vendored copy
-        from ._implementation import CertificateError, match_hostname
-
-# Not needed, but documenting what we provide.
-__all__ = ("CertificateError", "match_hostname")

+ 0 - 127
desktop/core/ext-py/urllib3-1.25.8/test/conftest.py

@@ -1,127 +0,0 @@
-import collections
-import contextlib
-import threading
-import platform
-import sys
-
-import pytest
-import trustme
-from tornado import web, ioloop
-
-from dummyserver.handlers import TestingApp
-from dummyserver.server import run_tornado_app
-from dummyserver.server import (
-    DEFAULT_CA,
-    DEFAULT_CA_KEY,
-    CLIENT_INTERMEDIATE_PEM,
-    CLIENT_NO_INTERMEDIATE_PEM,
-    CLIENT_INTERMEDIATE_KEY,
-    HAS_IPV6,
-)
-
-
-# The Python 3.8+ default loop on Windows breaks Tornado
-@pytest.fixture(scope="session", autouse=True)
-def configure_windows_event_loop():
-    if sys.version_info >= (3, 8) and platform.system() == "Windows":
-        import asyncio
-
-        asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
-
-
-@pytest.fixture(scope="session")
-def certs_dir(tmp_path_factory):
-    tmpdir = tmp_path_factory.mktemp("certs")
-    # Start from existing root CA as we don't want to change the server certificate yet
-    with open(DEFAULT_CA, "rb") as crt, open(DEFAULT_CA_KEY, "rb") as key:
-        root_ca = trustme.CA.from_pem(crt.read(), key.read())
-
-    # client cert chain
-    intermediate_ca = root_ca.create_child_ca()
-    cert = intermediate_ca.issue_cert(u"example.com")
-
-    cert.private_key_pem.write_to_path(str(tmpdir / CLIENT_INTERMEDIATE_KEY))
-    # Write the client cert and the intermediate CA
-    client_cert = str(tmpdir / CLIENT_INTERMEDIATE_PEM)
-    cert.cert_chain_pems[0].write_to_path(client_cert)
-    cert.cert_chain_pems[1].write_to_path(client_cert, append=True)
-    # Write only the client cert
-    cert.cert_chain_pems[0].write_to_path(str(tmpdir / CLIENT_NO_INTERMEDIATE_PEM))
-
-    yield tmpdir
-
-
-ServerConfig = collections.namedtuple("ServerConfig", ["host", "port", "ca_certs"])
-
-
-@contextlib.contextmanager
-def run_server_in_thread(scheme, host, tmpdir, ca, server_cert):
-    ca_cert_path = str(tmpdir / "ca.pem")
-    server_cert_path = str(tmpdir / "server.pem")
-    server_key_path = str(tmpdir / "server.key")
-    ca.cert_pem.write_to_path(ca_cert_path)
-    server_cert.private_key_pem.write_to_path(server_key_path)
-    server_cert.cert_chain_pems[0].write_to_path(server_cert_path)
-    server_certs = {"keyfile": server_key_path, "certfile": server_cert_path}
-
-    io_loop = ioloop.IOLoop.current()
-    app = web.Application([(r".*", TestingApp)])
-    server, port = run_tornado_app(app, io_loop, server_certs, scheme, host)
-    server_thread = threading.Thread(target=io_loop.start)
-    server_thread.start()
-
-    yield ServerConfig(host, port, ca_cert_path)
-
-    io_loop.add_callback(server.stop)
-    io_loop.add_callback(io_loop.stop)
-    server_thread.join()
-
-
-@pytest.fixture
-def no_san_server(tmp_path_factory):
-    tmpdir = tmp_path_factory.mktemp("certs")
-    ca = trustme.CA()
-    # only common name, no subject alternative names
-    server_cert = ca.issue_cert(common_name=u"localhost")
-
-    with run_server_in_thread("https", "localhost", tmpdir, ca, server_cert) as cfg:
-        yield cfg
-
-
-@pytest.fixture
-def ip_san_server(tmp_path_factory):
-    tmpdir = tmp_path_factory.mktemp("certs")
-    ca = trustme.CA()
-    # IP address in Subject Alternative Name
-    server_cert = ca.issue_cert(u"127.0.0.1")
-
-    with run_server_in_thread("https", "127.0.0.1", tmpdir, ca, server_cert) as cfg:
-        yield cfg
-
-
-@pytest.fixture
-def ipv6_addr_server(tmp_path_factory):
-    if not HAS_IPV6:
-        pytest.skip("Only runs on IPv6 systems")
-
-    tmpdir = tmp_path_factory.mktemp("certs")
-    ca = trustme.CA()
-    # IP address in Common Name
-    server_cert = ca.issue_cert(common_name=u"::1")
-
-    with run_server_in_thread("https", "::1", tmpdir, ca, server_cert) as cfg:
-        yield cfg
-
-
-@pytest.fixture
-def ipv6_san_server(tmp_path_factory):
-    if not HAS_IPV6:
-        pytest.skip("Only runs on IPv6 systems")
-
-    tmpdir = tmp_path_factory.mktemp("certs")
-    ca = trustme.CA()
-    # IP address in Subject Alternative Name
-    server_cert = ca.issue_cert(u"::1")
-
-    with run_server_in_thread("https", "::1", tmpdir, ca, server_cert) as cfg:
-        yield cfg

+ 0 - 52
desktop/core/ext-py/urllib3-1.25.8/test/test_connection.py

@@ -1,52 +0,0 @@
-import datetime
-import mock
-
-import pytest
-
-from urllib3.connection import CertificateError, _match_hostname, RECENT_DATE
-
-
-class TestConnection(object):
-    """
-    Tests in this suite should not make any network requests or connections.
-    """
-
-    def test_match_hostname_no_cert(self):
-        cert = None
-        asserted_hostname = "foo"
-        with pytest.raises(ValueError):
-            _match_hostname(cert, asserted_hostname)
-
-    def test_match_hostname_empty_cert(self):
-        cert = {}
-        asserted_hostname = "foo"
-        with pytest.raises(ValueError):
-            _match_hostname(cert, asserted_hostname)
-
-    def test_match_hostname_match(self):
-        cert = {"subjectAltName": [("DNS", "foo")]}
-        asserted_hostname = "foo"
-        _match_hostname(cert, asserted_hostname)
-
-    def test_match_hostname_mismatch(self):
-        cert = {"subjectAltName": [("DNS", "foo")]}
-        asserted_hostname = "bar"
-        try:
-            with mock.patch("urllib3.connection.log.warning") as mock_log:
-                _match_hostname(cert, asserted_hostname)
-        except CertificateError as e:
-            assert "hostname 'bar' doesn't match 'foo'" in str(e)
-            mock_log.assert_called_once_with(
-                "Certificate did not match expected hostname: %s. Certificate: %s",
-                "bar",
-                {"subjectAltName": [("DNS", "foo")]},
-            )
-            assert e._peer_cert == cert
-
-    def test_recent_date(self):
-        # This test is to make sure that the RECENT_DATE value
-        # doesn't get too far behind what the current date is.
-        # When this test fails update urllib3.connection.RECENT_DATE
-        # according to the rules defined in that file.
-        two_years = datetime.timedelta(days=365 * 2)
-        assert RECENT_DATE > (datetime.datetime.today() - two_years).date()

+ 0 - 45
desktop/core/ext-py/urllib3-1.25.8/test/test_proxymanager.py

@@ -1,45 +0,0 @@
-import pytest
-
-from urllib3.poolmanager import ProxyManager
-
-
-class TestProxyManager(object):
-    def test_proxy_headers(self):
-        url = "http://pypi.org/project/urllib3/"
-        with ProxyManager("http://something:1234") as p:
-            # Verify default headers
-            default_headers = {"Accept": "*/*", "Host": "pypi.org"}
-            headers = p._set_proxy_headers(url)
-
-            assert headers == default_headers
-
-            # Verify default headers don't overwrite provided headers
-            provided_headers = {
-                "Accept": "application/json",
-                "custom": "header",
-                "Host": "test.python.org",
-            }
-            headers = p._set_proxy_headers(url, provided_headers)
-
-            assert headers == provided_headers
-
-            # Verify proxy with nonstandard port
-            provided_headers = {"Accept": "application/json"}
-            expected_headers = provided_headers.copy()
-            expected_headers.update({"Host": "pypi.org:8080"})
-            url_with_port = "http://pypi.org:8080/project/urllib3/"
-            headers = p._set_proxy_headers(url_with_port, provided_headers)
-
-            assert headers == expected_headers
-
-    def test_default_port(self):
-        with ProxyManager("http://something") as p:
-            assert p.proxy.port == 80
-        with ProxyManager("https://something") as p:
-            assert p.proxy.port == 443
-
-    def test_invalid_scheme(self):
-        with pytest.raises(AssertionError):
-            ProxyManager("invalid://host/p")
-        with pytest.raises(ValueError):
-            ProxyManager("invalid://host/p")

+ 0 - 367
desktop/core/ext-py/urllib3-1.25.8/test/with_dummyserver/test_proxy_poolmanager.py

@@ -1,367 +0,0 @@
-import json
-import socket
-
-import pytest
-
-from dummyserver.testcase import HTTPDummyProxyTestCase, IPv6HTTPDummyProxyTestCase
-from dummyserver.server import (
-    DEFAULT_CA,
-    DEFAULT_CA_BAD,
-    HAS_IPV6,
-    get_unreachable_address,
-)
-from .. import TARPIT_HOST, requires_network
-
-from urllib3._collections import HTTPHeaderDict
-from urllib3.poolmanager import proxy_from_url, ProxyManager
-from urllib3.exceptions import MaxRetryError, SSLError, ProxyError, ConnectTimeoutError
-from urllib3.connectionpool import connection_from_url, VerifiedHTTPSConnection
-
-from test import SHORT_TIMEOUT, LONG_TIMEOUT
-
-# Retry failed tests
-pytestmark = pytest.mark.flaky
-
-
-class TestHTTPProxyManager(HTTPDummyProxyTestCase):
-    @classmethod
-    def setup_class(cls):
-        super(TestHTTPProxyManager, cls).setup_class()
-        cls.http_url = "http://%s:%d" % (cls.http_host, cls.http_port)
-        cls.http_url_alt = "http://%s:%d" % (cls.http_host_alt, cls.http_port)
-        cls.https_url = "https://%s:%d" % (cls.https_host, cls.https_port)
-        cls.https_url_alt = "https://%s:%d" % (cls.https_host_alt, cls.https_port)
-        cls.proxy_url = "http://%s:%d" % (cls.proxy_host, cls.proxy_port)
-
-    def test_basic_proxy(self):
-        with proxy_from_url(self.proxy_url, ca_certs=DEFAULT_CA) as http:
-            r = http.request("GET", "%s/" % self.http_url)
-            assert r.status == 200
-
-            r = http.request("GET", "%s/" % self.https_url)
-            assert r.status == 200
-
-    def test_nagle_proxy(self):
-        """ Test that proxy connections do not have TCP_NODELAY turned on """
-        with ProxyManager(self.proxy_url) as http:
-            hc2 = http.connection_from_host(self.http_host, self.http_port)
-            conn = hc2._get_conn()
-            try:
-                hc2._make_request(conn, "GET", "/")
-                tcp_nodelay_setting = conn.sock.getsockopt(
-                    socket.IPPROTO_TCP, socket.TCP_NODELAY
-                )
-                assert tcp_nodelay_setting == 0, (
-                    "Expected TCP_NODELAY for proxies to be set "
-                    "to zero, instead was %s" % tcp_nodelay_setting
-                )
-            finally:
-                conn.close()
-
-    def test_proxy_conn_fail(self):
-        host, port = get_unreachable_address()
-        with proxy_from_url(
-            "http://%s:%s/" % (host, port), retries=1, timeout=LONG_TIMEOUT
-        ) as http:
-            with pytest.raises(MaxRetryError):
-                http.request("GET", "%s/" % self.https_url)
-            with pytest.raises(MaxRetryError):
-                http.request("GET", "%s/" % self.http_url)
-
-            with pytest.raises(MaxRetryError) as e:
-                http.request("GET", "%s/" % self.http_url)
-            assert type(e.value.reason) == ProxyError
-
-    def test_oldapi(self):
-        with ProxyManager(
-            connection_from_url(self.proxy_url), ca_certs=DEFAULT_CA
-        ) as http:
-            r = http.request("GET", "%s/" % self.http_url)
-            assert r.status == 200
-
-            r = http.request("GET", "%s/" % self.https_url)
-            assert r.status == 200
-
-    def test_proxy_verified(self):
-        with proxy_from_url(
-            self.proxy_url, cert_reqs="REQUIRED", ca_certs=DEFAULT_CA_BAD
-        ) as http:
-            https_pool = http._new_pool("https", self.https_host, self.https_port)
-            with pytest.raises(MaxRetryError) as e:
-                https_pool.request("GET", "/", retries=0)
-            assert isinstance(e.value.reason, SSLError)
-            assert "certificate verify failed" in str(e.value.reason), (
-                "Expected 'certificate verify failed', instead got: %r" % e.value.reason
-            )
-
-            http = proxy_from_url(
-                self.proxy_url, cert_reqs="REQUIRED", ca_certs=DEFAULT_CA
-            )
-            https_pool = http._new_pool("https", self.https_host, self.https_port)
-
-            conn = https_pool._new_conn()
-            assert conn.__class__ == VerifiedHTTPSConnection
-            https_pool.request("GET", "/")  # Should succeed without exceptions.
-
-            http = proxy_from_url(
-                self.proxy_url, cert_reqs="REQUIRED", ca_certs=DEFAULT_CA
-            )
-            https_fail_pool = http._new_pool("https", "127.0.0.1", self.https_port)
-
-            with pytest.raises(MaxRetryError) as e:
-                https_fail_pool.request("GET", "/", retries=0)
-            assert isinstance(e.value.reason, SSLError)
-            assert "doesn't match" in str(e.value.reason)
-
-    def test_redirect(self):
-        with proxy_from_url(self.proxy_url) as http:
-            r = http.request(
-                "GET",
-                "%s/redirect" % self.http_url,
-                fields={"target": "%s/" % self.http_url},
-                redirect=False,
-            )
-
-            assert r.status == 303
-
-            r = http.request(
-                "GET",
-                "%s/redirect" % self.http_url,
-                fields={"target": "%s/" % self.http_url},
-            )
-
-            assert r.status == 200
-            assert r.data == b"Dummy server!"
-
-    def test_cross_host_redirect(self):
-        with proxy_from_url(self.proxy_url) as http:
-            cross_host_location = "%s/echo?a=b" % self.http_url_alt
-            with pytest.raises(MaxRetryError):
-                http.request(
-                    "GET",
-                    "%s/redirect" % self.http_url,
-                    fields={"target": cross_host_location},
-                    retries=0,
-                )
-
-            r = http.request(
-                "GET",
-                "%s/redirect" % self.http_url,
-                fields={"target": "%s/echo?a=b" % self.http_url_alt},
-                retries=1,
-            )
-            assert r._pool.host != self.http_host_alt
-
-    def test_cross_protocol_redirect(self):
-        with proxy_from_url(self.proxy_url, ca_certs=DEFAULT_CA) as http:
-            cross_protocol_location = "%s/echo?a=b" % self.https_url
-            with pytest.raises(MaxRetryError):
-                http.request(
-                    "GET",
-                    "%s/redirect" % self.http_url,
-                    fields={"target": cross_protocol_location},
-                    retries=0,
-                )
-
-            r = http.request(
-                "GET",
-                "%s/redirect" % self.http_url,
-                fields={"target": "%s/echo?a=b" % self.https_url},
-                retries=1,
-            )
-            assert r._pool.host == self.https_host
-
-    def test_headers(self):
-        with proxy_from_url(
-            self.proxy_url,
-            headers={"Foo": "bar"},
-            proxy_headers={"Hickory": "dickory"},
-            ca_certs=DEFAULT_CA,
-        ) as http:
-
-            r = http.request_encode_url("GET", "%s/headers" % self.http_url)
-            returned_headers = json.loads(r.data.decode())
-            assert returned_headers.get("Foo") == "bar"
-            assert returned_headers.get("Hickory") == "dickory"
-            assert returned_headers.get("Host") == "%s:%s" % (
-                self.http_host,
-                self.http_port,
-            )
-
-            r = http.request_encode_url("GET", "%s/headers" % self.http_url_alt)
-            returned_headers = json.loads(r.data.decode())
-            assert returned_headers.get("Foo") == "bar"
-            assert returned_headers.get("Hickory") == "dickory"
-            assert returned_headers.get("Host") == "%s:%s" % (
-                self.http_host_alt,
-                self.http_port,
-            )
-
-            r = http.request_encode_url("GET", "%s/headers" % self.https_url)
-            returned_headers = json.loads(r.data.decode())
-            assert returned_headers.get("Foo") == "bar"
-            assert returned_headers.get("Hickory") is None
-            assert returned_headers.get("Host") == "%s:%s" % (
-                self.https_host,
-                self.https_port,
-            )
-
-            r = http.request_encode_body("POST", "%s/headers" % self.http_url)
-            returned_headers = json.loads(r.data.decode())
-            assert returned_headers.get("Foo") == "bar"
-            assert returned_headers.get("Hickory") == "dickory"
-            assert returned_headers.get("Host") == "%s:%s" % (
-                self.http_host,
-                self.http_port,
-            )
-
-            r = http.request_encode_url(
-                "GET", "%s/headers" % self.http_url, headers={"Baz": "quux"}
-            )
-            returned_headers = json.loads(r.data.decode())
-            assert returned_headers.get("Foo") is None
-            assert returned_headers.get("Baz") == "quux"
-            assert returned_headers.get("Hickory") == "dickory"
-            assert returned_headers.get("Host") == "%s:%s" % (
-                self.http_host,
-                self.http_port,
-            )
-
-            r = http.request_encode_url(
-                "GET", "%s/headers" % self.https_url, headers={"Baz": "quux"}
-            )
-            returned_headers = json.loads(r.data.decode())
-            assert returned_headers.get("Foo") is None
-            assert returned_headers.get("Baz") == "quux"
-            assert returned_headers.get("Hickory") is None
-            assert returned_headers.get("Host") == "%s:%s" % (
-                self.https_host,
-                self.https_port,
-            )
-
-            r = http.request_encode_body(
-                "GET", "%s/headers" % self.http_url, headers={"Baz": "quux"}
-            )
-            returned_headers = json.loads(r.data.decode())
-            assert returned_headers.get("Foo") is None
-            assert returned_headers.get("Baz") == "quux"
-            assert returned_headers.get("Hickory") == "dickory"
-            assert returned_headers.get("Host") == "%s:%s" % (
-                self.http_host,
-                self.http_port,
-            )
-
-            r = http.request_encode_body(
-                "GET", "%s/headers" % self.https_url, headers={"Baz": "quux"}
-            )
-            returned_headers = json.loads(r.data.decode())
-            assert returned_headers.get("Foo") is None
-            assert returned_headers.get("Baz") == "quux"
-            assert returned_headers.get("Hickory") is None
-            assert returned_headers.get("Host") == "%s:%s" % (
-                self.https_host,
-                self.https_port,
-            )
-
-    def test_headerdict(self):
-        default_headers = HTTPHeaderDict(a="b")
-        proxy_headers = HTTPHeaderDict()
-        proxy_headers.add("foo", "bar")
-
-        with proxy_from_url(
-            self.proxy_url, headers=default_headers, proxy_headers=proxy_headers
-        ) as http:
-            request_headers = HTTPHeaderDict(baz="quux")
-            r = http.request(
-                "GET", "%s/headers" % self.http_url, headers=request_headers
-            )
-            returned_headers = json.loads(r.data.decode())
-            assert returned_headers.get("Foo") == "bar"
-            assert returned_headers.get("Baz") == "quux"
-
-    def test_proxy_pooling(self):
-        with proxy_from_url(self.proxy_url, cert_reqs="NONE") as http:
-            for x in range(2):
-                http.urlopen("GET", self.http_url)
-            assert len(http.pools) == 1
-
-            for x in range(2):
-                http.urlopen("GET", self.http_url_alt)
-            assert len(http.pools) == 1
-
-            for x in range(2):
-                http.urlopen("GET", self.https_url)
-            assert len(http.pools) == 2
-
-            for x in range(2):
-                http.urlopen("GET", self.https_url_alt)
-            assert len(http.pools) == 3
-
-    def test_proxy_pooling_ext(self):
-        with proxy_from_url(self.proxy_url) as http:
-            hc1 = http.connection_from_url(self.http_url)
-            hc2 = http.connection_from_host(self.http_host, self.http_port)
-            hc3 = http.connection_from_url(self.http_url_alt)
-            hc4 = http.connection_from_host(self.http_host_alt, self.http_port)
-            assert hc1 == hc2
-            assert hc2 == hc3
-            assert hc3 == hc4
-
-            sc1 = http.connection_from_url(self.https_url)
-            sc2 = http.connection_from_host(
-                self.https_host, self.https_port, scheme="https"
-            )
-            sc3 = http.connection_from_url(self.https_url_alt)
-            sc4 = http.connection_from_host(
-                self.https_host_alt, self.https_port, scheme="https"
-            )
-            assert sc1 == sc2
-            assert sc2 != sc3
-            assert sc3 == sc4
-
-    @pytest.mark.timeout(0.5)
-    @requires_network
-    def test_https_proxy_timeout(self):
-        with proxy_from_url("https://{host}".format(host=TARPIT_HOST)) as https:
-            with pytest.raises(MaxRetryError) as e:
-                https.request("GET", self.http_url, timeout=SHORT_TIMEOUT)
-            assert type(e.value.reason) == ConnectTimeoutError
-
-    @pytest.mark.timeout(0.5)
-    @requires_network
-    def test_https_proxy_pool_timeout(self):
-        with proxy_from_url(
-            "https://{host}".format(host=TARPIT_HOST), timeout=SHORT_TIMEOUT
-        ) as https:
-            with pytest.raises(MaxRetryError) as e:
-                https.request("GET", self.http_url)
-            assert type(e.value.reason) == ConnectTimeoutError
-
-    def test_scheme_host_case_insensitive(self):
-        """Assert that upper-case schemes and hosts are normalized."""
-        with proxy_from_url(self.proxy_url.upper(), ca_certs=DEFAULT_CA) as http:
-            r = http.request("GET", "%s/" % self.http_url.upper())
-            assert r.status == 200
-
-            r = http.request("GET", "%s/" % self.https_url.upper())
-            assert r.status == 200
-
-
-@pytest.mark.skipif(not HAS_IPV6, reason="Only runs on IPv6 systems")
-class TestIPv6HTTPProxyManager(IPv6HTTPDummyProxyTestCase):
-    @classmethod
-    def setup_class(cls):
-        HTTPDummyProxyTestCase.setup_class()
-        cls.http_url = "http://%s:%d" % (cls.http_host, cls.http_port)
-        cls.http_url_alt = "http://%s:%d" % (cls.http_host_alt, cls.http_port)
-        cls.https_url = "https://%s:%d" % (cls.https_host, cls.https_port)
-        cls.https_url_alt = "https://%s:%d" % (cls.https_host_alt, cls.https_port)
-        cls.proxy_url = "http://[%s]:%d" % (cls.proxy_host, cls.proxy_port)
-
-    def test_basic_ipv6_proxy(self):
-        with proxy_from_url(self.proxy_url, ca_certs=DEFAULT_CA) as http:
-            r = http.request("GET", "%s/" % self.http_url)
-            assert r.status == 200
-
-            r = http.request("GET", "%s/" % self.https_url)
-            assert r.status == 200

+ 219 - 12
desktop/core/ext-py/urllib3-1.25.8/CHANGES.rst → desktop/core/ext-py/urllib3-1.26.12/CHANGES.rst

@@ -1,6 +1,213 @@
 Changes
 =======
 
+1.26.12 (2022-08-22)
+--------------------
+
+* Deprecated the `urllib3[secure]` extra and the `urllib3.contrib.pyopenssl` module.
+  Both will be removed in v2.x. See this `GitHub issue <https://github.com/urllib3/urllib3/issues/2680>`_
+  for justification and info on how to migrate.
+
+
+1.26.11 (2022-07-25)
+--------------------
+
+* Fixed an issue where reading more than 2 GiB in a call to ``HTTPResponse.read`` would
+  raise an ``OverflowError`` on Python 3.9 and earlier.
+
+
+1.26.10 (2022-07-07)
+--------------------
+
+* Removed support for Python 3.5
+* Fixed an issue where a ``ProxyError`` recommending configuring the proxy as HTTP
+  instead of HTTPS could appear even when an HTTPS proxy wasn't configured.
+
+
+1.26.9 (2022-03-16)
+-------------------
+
+* Changed ``urllib3[brotli]`` extra to favor installing Brotli libraries that are still
+  receiving updates like ``brotli`` and ``brotlicffi`` instead of ``brotlipy``.
+  This change does not impact behavior of urllib3, only which dependencies are installed.
+* Fixed a socket leaking when ``HTTPSConnection.connect()`` raises an exception.
+* Fixed ``server_hostname`` being forwarded from ``PoolManager`` to ``HTTPConnectionPool``
+  when requesting an HTTP URL. Should only be forwarded when requesting an HTTPS URL.
+
+
+1.26.8 (2022-01-07)
+-------------------
+
+* Added extra message to ``urllib3.exceptions.ProxyError`` when urllib3 detects that
+  a proxy is configured to use HTTPS but the proxy itself appears to only use HTTP.
+* Added a mention of the size of the connection pool when discarding a connection due to the pool being full.
+* Added explicit support for Python 3.11.
+* Deprecated the ``Retry.MAX_BACKOFF`` class property in favor of ``Retry.DEFAULT_MAX_BACKOFF``
+  to better match the rest of the default parameter names. ``Retry.MAX_BACKOFF`` is removed in v2.0.
+* Changed location of the vendored ``ssl.match_hostname`` function from ``urllib3.packages.ssl_match_hostname``
+  to ``urllib3.util.ssl_match_hostname`` to ensure Python 3.10+ compatibility after being repackaged
+  by downstream distributors.
+* Fixed absolute imports, all imports are now relative.
+
+
+1.26.7 (2021-09-22)
+-------------------
+
+* Fixed a bug with HTTPS hostname verification involving IP addresses and lack
+  of SNI. (Issue #2400)
+* Fixed a bug where IPv6 braces weren't stripped during certificate hostname
+  matching. (Issue #2240)
+
+
+1.26.6 (2021-06-25)
+-------------------
+
+* Deprecated the ``urllib3.contrib.ntlmpool`` module. urllib3 is not able to support
+  it properly due to `reasons listed in this issue <https://github.com/urllib3/urllib3/issues/2282>`_.
+  If you are a user of this module please leave a comment.
+* Changed ``HTTPConnection.request_chunked()`` to not erroneously emit multiple
+  ``Transfer-Encoding`` headers in the case that one is already specified.
+* Fixed typo in deprecation message to recommend ``Retry.DEFAULT_ALLOWED_METHODS``.
+
+
+1.26.5 (2021-05-26)
+-------------------
+
+* Fixed deprecation warnings emitted in Python 3.10.
+* Updated vendored ``six`` library to 1.16.0.
+* Improved performance of URL parser when splitting
+  the authority component.
+
+
+1.26.4 (2021-03-15)
+-------------------
+
+* Changed behavior of the default ``SSLContext`` when connecting to HTTPS proxy
+  during HTTPS requests. The default ``SSLContext`` now sets ``check_hostname=True``.
+
+
+1.26.3 (2021-01-26)
+-------------------
+
+* Fixed bytes and string comparison issue with headers (Pull #2141)
+
+* Changed ``ProxySchemeUnknown`` error message to be
+  more actionable if the user supplies a proxy URL without
+  a scheme. (Pull #2107)
+
+
+1.26.2 (2020-11-12)
+-------------------
+
+* Fixed an issue where ``wrap_socket`` and ``CERT_REQUIRED`` wouldn't
+  be imported properly on Python 2.7.8 and earlier (Pull #2052)
+
+
+1.26.1 (2020-11-11)
+-------------------
+
+* Fixed an issue where two ``User-Agent`` headers would be sent if a
+  ``User-Agent`` header key is passed as ``bytes`` (Pull #2047)
+
+
+1.26.0 (2020-11-10)
+-------------------
+
+* **NOTE: urllib3 v2.0 will drop support for Python 2**.
+  `Read more in the v2.0 Roadmap <https://urllib3.readthedocs.io/en/latest/v2-roadmap.html>`_.
+
+* Added support for HTTPS proxies contacting HTTPS servers (Pull #1923, Pull #1806)
+
+* Deprecated negotiating TLSv1 and TLSv1.1 by default. Users that
+  still wish to use TLS earlier than 1.2 without a deprecation warning
+  should opt-in explicitly by setting ``ssl_version=ssl.PROTOCOL_TLSv1_1`` (Pull #2002)
+  **Starting in urllib3 v2.0: Connections that receive a ``DeprecationWarning`` will fail**
+
+* Deprecated ``Retry`` options ``Retry.DEFAULT_METHOD_WHITELIST``, ``Retry.DEFAULT_REDIRECT_HEADERS_BLACKLIST``
+  and ``Retry(method_whitelist=...)`` in favor of ``Retry.DEFAULT_ALLOWED_METHODS``,
+  ``Retry.DEFAULT_REMOVE_HEADERS_ON_REDIRECT``, and ``Retry(allowed_methods=...)``
+  (Pull #2000) **Starting in urllib3 v2.0: Deprecated options will be removed**
+
+* Added default ``User-Agent`` header to every request (Pull #1750)
+
+* Added ``urllib3.util.SKIP_HEADER`` for skipping ``User-Agent``, ``Accept-Encoding``, 
+  and ``Host`` headers from being automatically emitted with requests (Pull #2018)
+
+* Collapse ``transfer-encoding: chunked`` request data and framing into
+  the same ``socket.send()`` call (Pull #1906)
+
+* Send ``http/1.1`` ALPN identifier with every TLS handshake by default (Pull #1894)
+
+* Properly terminate SecureTransport connections when CA verification fails (Pull #1977)
+
+* Don't emit an ``SNIMissingWarning`` when passing ``server_hostname=None``
+  to SecureTransport (Pull #1903)
+
+* Disabled requesting TLSv1.2 session tickets as they weren't being used by urllib3 (Pull #1970)
+
+* Suppress ``BrokenPipeError`` when writing request body after the server
+  has closed the socket (Pull #1524)
+
+* Wrap ``ssl.SSLError`` that can be raised from reading a socket (e.g. "bad MAC")
+  into an ``urllib3.exceptions.SSLError`` (Pull #1939)
+
+
+1.25.11 (2020-10-19)
+--------------------
+
+* Fix retry backoff time parsed from ``Retry-After`` header when given
+  in the HTTP date format. The HTTP date was parsed as the local timezone
+  rather than accounting for the timezone in the HTTP date (typically
+  UTC) (Pull #1932, Pull #1935, Pull #1938, Pull #1949)
+
+* Fix issue where an error would be raised when the ``SSLKEYLOGFILE``
+  environment variable was set to the empty string. Now ``SSLContext.keylog_file``
+  is not set in this situation (Pull #2016)
+
+
+1.25.10 (2020-07-22)
+--------------------
+
+* Added support for ``SSLKEYLOGFILE`` environment variable for
+  logging TLS session keys with use with programs like
+  Wireshark for decrypting captured web traffic (Pull #1867)
+
+* Fixed loading of SecureTransport libraries on macOS Big Sur
+  due to the new dynamic linker cache (Pull #1905)
+
+* Collapse chunked request bodies data and framing into one
+  call to ``send()`` to reduce the number of TCP packets by 2-4x (Pull #1906)
+
+* Don't insert ``None`` into ``ConnectionPool`` if the pool
+  was empty when requesting a connection (Pull #1866)
+
+* Avoid ``hasattr`` call in ``BrotliDecoder.decompress()`` (Pull #1858)
+
+
+1.25.9 (2020-04-16)
+-------------------
+
+* Added ``InvalidProxyConfigurationWarning`` which is raised when
+  erroneously specifying an HTTPS proxy URL. urllib3 doesn't currently
+  support connecting to HTTPS proxies but will soon be able to
+  and we would like users to migrate properly without much breakage.
+
+  See `this GitHub issue <https://github.com/urllib3/urllib3/issues/1850>`_
+  for more information on how to fix your proxy config. (Pull #1851)
+
+* Drain connection after ``PoolManager`` redirect (Pull #1817)
+
+* Ensure ``load_verify_locations`` raises ``SSLError`` for all backends (Pull #1812)
+
+* Rename ``VerifiedHTTPSConnection`` to ``HTTPSConnection`` (Pull #1805)
+
+* Allow the CA certificate data to be passed as a string (Pull #1804)
+
+* Raise ``ValueError`` if method contains control characters (Pull #1800)
+
+* Add ``__repr__`` to ``Timeout`` (Pull #1795)
+
+
 1.25.8 (2020-01-20)
 -------------------
 
@@ -97,7 +304,7 @@ Changes
 * Add TLSv1.3 support to CPython, pyOpenSSL, and SecureTransport ``SSLContext``
   implementations. (Pull #1496)
 
-* Switched the default multipart header encoder from RFC 2231 to HTML 5 working draft. (Issue #303, PR #1492)
+* Switched the default multipart header encoder from RFC 2231 to HTML 5 working draft. (Issue #303, Pull #1492)
 
 * Fixed issue where OpenSSL would block if an encrypted client private key was
   given and no password was given. Instead an ``SSLError`` is raised. (Pull #1489)
@@ -328,13 +535,13 @@ Changes
   interprets the presence of any flag as requesting certificate validation.
 
   There is no PR for this patch, as it was prepared for simultaneous disclosure
-  and release. The master branch received the same fix in PR #1010.
+  and release. The master branch received the same fix in Pull #1010.
 
 
 1.18 (2016-09-26)
 -----------------
 
-* Fixed incorrect message for IncompleteRead exception. (PR #973)
+* Fixed incorrect message for IncompleteRead exception. (Pull #973)
 
 * Accept ``iPAddress`` subject alternative name fields in TLS certificates.
   (Issue #258)
@@ -363,32 +570,32 @@ Changes
   contains retries history. (Issue #848)
 
 * Timeout can no longer be set as boolean, and must be greater than zero.
-  (PR #924)
+  (Pull #924)
 
 * Removed pyasn1 and ndg-httpsclient from dependencies used for PyOpenSSL. We
   now use cryptography and idna, both of which are already dependencies of
-  PyOpenSSL. (PR #930)
+  PyOpenSSL. (Pull #930)
 
 * Fixed infinite loop in ``stream`` when amt=None. (Issue #928)
 
 * Try to use the operating system's certificates when we are using an
-  ``SSLContext``. (PR #941)
+  ``SSLContext``. (Pull #941)
 
 * Updated cipher suite list to allow ChaCha20+Poly1305. AES-GCM is preferred to
-  ChaCha20, but ChaCha20 is then preferred to everything else. (PR #947)
+  ChaCha20, but ChaCha20 is then preferred to everything else. (Pull #947)
 
-* Updated cipher suite list to remove 3DES-based cipher suites. (PR #958)
+* Updated cipher suite list to remove 3DES-based cipher suites. (Pull #958)
 
-* Removed the cipher suite fallback to allow HIGH ciphers. (PR #958)
+* Removed the cipher suite fallback to allow HIGH ciphers. (Pull #958)
 
 * Implemented ``length_remaining`` to determine remaining content
-  to be read. (PR #949)
+  to be read. (Pull #949)
 
 * Implemented ``enforce_content_length`` to enable exceptions when
-  incomplete data chunks are received. (PR #949)
+  incomplete data chunks are received. (Pull #949)
 
 * Dropped connection start, dropped connection reset, redirect, forced retry,
-  and new HTTPS connection log levels to DEBUG, from INFO. (PR #967)
+  and new HTTPS connection log levels to DEBUG, from INFO. (Pull #967)
 
 
 1.16 (2016-06-11)

+ 1 - 1
desktop/core/ext-py/urllib3-1.25.8/LICENSE.txt → desktop/core/ext-py/urllib3-1.26.12/LICENSE.txt

@@ -1,6 +1,6 @@
 MIT License
 
-Copyright (c) 2008-2019 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
+Copyright (c) 2008-2020 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal

+ 1 - 1
desktop/core/ext-py/urllib3-1.25.8/MANIFEST.in → desktop/core/ext-py/urllib3-1.26.12/MANIFEST.in

@@ -1,4 +1,4 @@
-include README.rst CHANGES.rst LICENSE.txt CONTRIBUTORS.txt dev-requirements.txt Makefile
+include README.rst CHANGES.rst LICENSE.txt dev-requirements.txt Makefile
 recursive-include dummyserver *
 recursive-include test *
 recursive-include docs *

+ 1438 - 0
desktop/core/ext-py/urllib3-1.26.12/PKG-INFO

@@ -0,0 +1,1438 @@
+Metadata-Version: 2.1
+Name: urllib3
+Version: 1.26.12
+Summary: HTTP library with thread-safe connection pooling, file post, and more.
+Home-page: https://urllib3.readthedocs.io/
+Author: Andrey Petrov
+Author-email: andrey.petrov@shazow.net
+License: MIT
+Project-URL: Documentation, https://urllib3.readthedocs.io/
+Project-URL: Code, https://github.com/urllib3/urllib3
+Project-URL: Issue tracker, https://github.com/urllib3/urllib3/issues
+Keywords: urllib httplib threadsafe filepost http https ssl pooling
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Internet :: WWW/HTTP
+Classifier: Topic :: Software Development :: Libraries
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4
+Description-Content-Type: text/x-rst
+Provides-Extra: brotli
+Provides-Extra: secure
+Provides-Extra: socks
+License-File: LICENSE.txt
+
+
+urllib3 is a powerful, *user-friendly* HTTP client for Python. Much of the
+Python ecosystem already uses urllib3 and you should too.
+urllib3 brings many critical features that are missing from the Python
+standard libraries:
+
+- Thread safety.
+- Connection pooling.
+- Client-side SSL/TLS verification.
+- File uploads with multipart encoding.
+- Helpers for retrying requests and dealing with HTTP redirects.
+- Support for gzip, deflate, and brotli encoding.
+- Proxy support for HTTP and SOCKS.
+- 100% test coverage.
+
+urllib3 is powerful and easy to use:
+
+.. code-block:: python
+
+    >>> import urllib3
+    >>> http = urllib3.PoolManager()
+    >>> r = http.request('GET', 'http://httpbin.org/robots.txt')
+    >>> r.status
+    200
+    >>> r.data
+    'User-agent: *\nDisallow: /deny\n'
+
+
+Installing
+----------
+
+urllib3 can be installed with `pip <https://pip.pypa.io>`_::
+
+    $ python -m pip install urllib3
+
+Alternatively, you can grab the latest source code from `GitHub <https://github.com/urllib3/urllib3>`_::
+
+    $ git clone https://github.com/urllib3/urllib3.git
+    $ cd urllib3
+    $ git checkout 1.26.x
+    $ pip install .
+
+
+Documentation
+-------------
+
+urllib3 has usage and reference documentation at `urllib3.readthedocs.io <https://urllib3.readthedocs.io>`_.
+
+
+Contributing
+------------
+
+urllib3 happily accepts contributions. Please see our
+`contributing documentation <https://urllib3.readthedocs.io/en/latest/contributing.html>`_
+for some tips on getting started.
+
+
+Security Disclosures
+--------------------
+
+To report a security vulnerability, please use the
+`Tidelift security contact <https://tidelift.com/security>`_.
+Tidelift will coordinate the fix and disclosure with maintainers.
+
+
+Maintainers
+-----------
+
+- `@sethmlarson <https://github.com/sethmlarson>`__ (Seth M. Larson)
+- `@pquentin <https://github.com/pquentin>`__ (Quentin Pradet)
+- `@theacodes <https://github.com/theacodes>`__ (Thea Flowers)
+- `@haikuginger <https://github.com/haikuginger>`__ (Jess Shapiro)
+- `@lukasa <https://github.com/lukasa>`__ (Cory Benfield)
+- `@sigmavirus24 <https://github.com/sigmavirus24>`__ (Ian Stapleton Cordasco)
+- `@shazow <https://github.com/shazow>`__ (Andrey Petrov)
+
+👋
+
+
+Sponsorship
+-----------
+
+If your company benefits from this library, please consider `sponsoring its
+development <https://urllib3.readthedocs.io/en/latest/sponsors.html>`_.
+
+
+For Enterprise
+--------------
+
+.. |tideliftlogo| image:: https://nedbatchelder.com/pix/Tidelift_Logos_RGB_Tidelift_Shorthand_On-White_small.png
+   :width: 75
+   :alt: Tidelift
+
+.. list-table::
+   :widths: 10 100
+
+   * - |tideliftlogo|
+     - Professional support for urllib3 is available as part of the `Tidelift
+       Subscription`_.  Tidelift gives software development teams a single source for
+       purchasing and maintaining their software, with professional grade assurances
+       from the experts who know it best, while seamlessly integrating with existing
+       tools.
+
+.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=readme
+
+
+Changes
+=======
+
+1.26.12 (2022-08-22)
+--------------------
+
+* Deprecated the `urllib3[secure]` extra and the `urllib3.contrib.pyopenssl` module.
+  Both will be removed in v2.x. See this `GitHub issue <https://github.com/urllib3/urllib3/issues/2680>`_
+  for justification and info on how to migrate.
+
+
+1.26.11 (2022-07-25)
+--------------------
+
+* Fixed an issue where reading more than 2 GiB in a call to ``HTTPResponse.read`` would
+  raise an ``OverflowError`` on Python 3.9 and earlier.
+
+
+1.26.10 (2022-07-07)
+--------------------
+
+* Removed support for Python 3.5
+* Fixed an issue where a ``ProxyError`` recommending configuring the proxy as HTTP
+  instead of HTTPS could appear even when an HTTPS proxy wasn't configured.
+
+
+1.26.9 (2022-03-16)
+-------------------
+
+* Changed ``urllib3[brotli]`` extra to favor installing Brotli libraries that are still
+  receiving updates like ``brotli`` and ``brotlicffi`` instead of ``brotlipy``.
+  This change does not impact behavior of urllib3, only which dependencies are installed.
+* Fixed a socket leaking when ``HTTPSConnection.connect()`` raises an exception.
+* Fixed ``server_hostname`` being forwarded from ``PoolManager`` to ``HTTPConnectionPool``
+  when requesting an HTTP URL. Should only be forwarded when requesting an HTTPS URL.
+
+
+1.26.8 (2022-01-07)
+-------------------
+
+* Added extra message to ``urllib3.exceptions.ProxyError`` when urllib3 detects that
+  a proxy is configured to use HTTPS but the proxy itself appears to only use HTTP.
+* Added a mention of the size of the connection pool when discarding a connection due to the pool being full.
+* Added explicit support for Python 3.11.
+* Deprecated the ``Retry.MAX_BACKOFF`` class property in favor of ``Retry.DEFAULT_MAX_BACKOFF``
+  to better match the rest of the default parameter names. ``Retry.MAX_BACKOFF`` is removed in v2.0.
+* Changed location of the vendored ``ssl.match_hostname`` function from ``urllib3.packages.ssl_match_hostname``
+  to ``urllib3.util.ssl_match_hostname`` to ensure Python 3.10+ compatibility after being repackaged
+  by downstream distributors.
+* Fixed absolute imports, all imports are now relative.
+
+
+1.26.7 (2021-09-22)
+-------------------
+
+* Fixed a bug with HTTPS hostname verification involving IP addresses and lack
+  of SNI. (Issue #2400)
+* Fixed a bug where IPv6 braces weren't stripped during certificate hostname
+  matching. (Issue #2240)
+
+
+1.26.6 (2021-06-25)
+-------------------
+
+* Deprecated the ``urllib3.contrib.ntlmpool`` module. urllib3 is not able to support
+  it properly due to `reasons listed in this issue <https://github.com/urllib3/urllib3/issues/2282>`_.
+  If you are a user of this module please leave a comment.
+* Changed ``HTTPConnection.request_chunked()`` to not erroneously emit multiple
+  ``Transfer-Encoding`` headers in the case that one is already specified.
+* Fixed typo in deprecation message to recommend ``Retry.DEFAULT_ALLOWED_METHODS``.
+
+
+1.26.5 (2021-05-26)
+-------------------
+
+* Fixed deprecation warnings emitted in Python 3.10.
+* Updated vendored ``six`` library to 1.16.0.
+* Improved performance of URL parser when splitting
+  the authority component.
+
+
+1.26.4 (2021-03-15)
+-------------------
+
+* Changed behavior of the default ``SSLContext`` when connecting to HTTPS proxy
+  during HTTPS requests. The default ``SSLContext`` now sets ``check_hostname=True``.
+
+
+1.26.3 (2021-01-26)
+-------------------
+
+* Fixed bytes and string comparison issue with headers (Pull #2141)
+
+* Changed ``ProxySchemeUnknown`` error message to be
+  more actionable if the user supplies a proxy URL without
+  a scheme. (Pull #2107)
+
+
+1.26.2 (2020-11-12)
+-------------------
+
+* Fixed an issue where ``wrap_socket`` and ``CERT_REQUIRED`` wouldn't
+  be imported properly on Python 2.7.8 and earlier (Pull #2052)
+
+
+1.26.1 (2020-11-11)
+-------------------
+
+* Fixed an issue where two ``User-Agent`` headers would be sent if a
+  ``User-Agent`` header key is passed as ``bytes`` (Pull #2047)
+
+
+1.26.0 (2020-11-10)
+-------------------
+
+* **NOTE: urllib3 v2.0 will drop support for Python 2**.
+  `Read more in the v2.0 Roadmap <https://urllib3.readthedocs.io/en/latest/v2-roadmap.html>`_.
+
+* Added support for HTTPS proxies contacting HTTPS servers (Pull #1923, Pull #1806)
+
+* Deprecated negotiating TLSv1 and TLSv1.1 by default. Users that
+  still wish to use TLS earlier than 1.2 without a deprecation warning
+  should opt-in explicitly by setting ``ssl_version=ssl.PROTOCOL_TLSv1_1`` (Pull #2002)
+  **Starting in urllib3 v2.0: Connections that receive a ``DeprecationWarning`` will fail**
+
+* Deprecated ``Retry`` options ``Retry.DEFAULT_METHOD_WHITELIST``, ``Retry.DEFAULT_REDIRECT_HEADERS_BLACKLIST``
+  and ``Retry(method_whitelist=...)`` in favor of ``Retry.DEFAULT_ALLOWED_METHODS``,
+  ``Retry.DEFAULT_REMOVE_HEADERS_ON_REDIRECT``, and ``Retry(allowed_methods=...)``
+  (Pull #2000) **Starting in urllib3 v2.0: Deprecated options will be removed**
+
+* Added default ``User-Agent`` header to every request (Pull #1750)
+
+* Added ``urllib3.util.SKIP_HEADER`` for skipping ``User-Agent``, ``Accept-Encoding``, 
+  and ``Host`` headers from being automatically emitted with requests (Pull #2018)
+
+* Collapse ``transfer-encoding: chunked`` request data and framing into
+  the same ``socket.send()`` call (Pull #1906)
+
+* Send ``http/1.1`` ALPN identifier with every TLS handshake by default (Pull #1894)
+
+* Properly terminate SecureTransport connections when CA verification fails (Pull #1977)
+
+* Don't emit an ``SNIMissingWarning`` when passing ``server_hostname=None``
+  to SecureTransport (Pull #1903)
+
+* Disabled requesting TLSv1.2 session tickets as they weren't being used by urllib3 (Pull #1970)
+
+* Suppress ``BrokenPipeError`` when writing request body after the server
+  has closed the socket (Pull #1524)
+
+* Wrap ``ssl.SSLError`` that can be raised from reading a socket (e.g. "bad MAC")
+  into an ``urllib3.exceptions.SSLError`` (Pull #1939)
+
+
+1.25.11 (2020-10-19)
+--------------------
+
+* Fix retry backoff time parsed from ``Retry-After`` header when given
+  in the HTTP date format. The HTTP date was parsed as the local timezone
+  rather than accounting for the timezone in the HTTP date (typically
+  UTC) (Pull #1932, Pull #1935, Pull #1938, Pull #1949)
+
+* Fix issue where an error would be raised when the ``SSLKEYLOGFILE``
+  environment variable was set to the empty string. Now ``SSLContext.keylog_file``
+  is not set in this situation (Pull #2016)
+
+
+1.25.10 (2020-07-22)
+--------------------
+
+* Added support for ``SSLKEYLOGFILE`` environment variable for
+  logging TLS session keys with use with programs like
+  Wireshark for decrypting captured web traffic (Pull #1867)
+
+* Fixed loading of SecureTransport libraries on macOS Big Sur
+  due to the new dynamic linker cache (Pull #1905)
+
+* Collapse chunked request bodies data and framing into one
+  call to ``send()`` to reduce the number of TCP packets by 2-4x (Pull #1906)
+
+* Don't insert ``None`` into ``ConnectionPool`` if the pool
+  was empty when requesting a connection (Pull #1866)
+
+* Avoid ``hasattr`` call in ``BrotliDecoder.decompress()`` (Pull #1858)
+
+
+1.25.9 (2020-04-16)
+-------------------
+
+* Added ``InvalidProxyConfigurationWarning`` which is raised when
+  erroneously specifying an HTTPS proxy URL. urllib3 doesn't currently
+  support connecting to HTTPS proxies but will soon be able to
+  and we would like users to migrate properly without much breakage.
+
+  See `this GitHub issue <https://github.com/urllib3/urllib3/issues/1850>`_
+  for more information on how to fix your proxy config. (Pull #1851)
+
+* Drain connection after ``PoolManager`` redirect (Pull #1817)
+
+* Ensure ``load_verify_locations`` raises ``SSLError`` for all backends (Pull #1812)
+
+* Rename ``VerifiedHTTPSConnection`` to ``HTTPSConnection`` (Pull #1805)
+
+* Allow the CA certificate data to be passed as a string (Pull #1804)
+
+* Raise ``ValueError`` if method contains control characters (Pull #1800)
+
+* Add ``__repr__`` to ``Timeout`` (Pull #1795)
+
+
+1.25.8 (2020-01-20)
+-------------------
+
+* Drop support for EOL Python 3.4 (Pull #1774)
+
+* Optimize _encode_invalid_chars (Pull #1787)
+
+
+1.25.7 (2019-11-11)
+-------------------
+
+* Preserve ``chunked`` parameter on retries (Pull #1715, Pull #1734)
+
+* Allow unset ``SERVER_SOFTWARE`` in App Engine (Pull #1704, Issue #1470)
+
+* Fix issue where URL fragment was sent within the request target. (Pull #1732)
+
+* Fix issue where an empty query section in a URL would fail to parse. (Pull #1732)
+
+* Remove TLS 1.3 support in SecureTransport due to Apple removing support (Pull #1703)
+
+
+1.25.6 (2019-09-24)
+-------------------
+
+* Fix issue where tilde (``~``) characters were incorrectly
+  percent-encoded in the path. (Pull #1692)
+
+
+1.25.5 (2019-09-19)
+-------------------
+
+* Add mitigation for BPO-37428 affecting Python <3.7.4 and OpenSSL 1.1.1+ which
+  caused certificate verification to be enabled when using ``cert_reqs=CERT_NONE``.
+  (Issue #1682)
+
+
+1.25.4 (2019-09-19)
+-------------------
+
+* Propagate Retry-After header settings to subsequent retries. (Pull #1607)
+
+* Fix edge case where Retry-After header was still respected even when
+  explicitly opted out of. (Pull #1607)
+
+* Remove dependency on ``rfc3986`` for URL parsing.
+
+* Fix issue where URLs containing invalid characters within ``Url.auth`` would
+  raise an exception instead of percent-encoding those characters.
+
+* Add support for ``HTTPResponse.auto_close = False`` which makes HTTP responses
+  work well with BufferedReaders and other ``io`` module features. (Pull #1652)
+
+* Percent-encode invalid characters in URL for ``HTTPConnectionPool.request()`` (Pull #1673)
+
+
+1.25.3 (2019-05-23)
+-------------------
+
+* Change ``HTTPSConnection`` to load system CA certificates
+  when ``ca_certs``, ``ca_cert_dir``, and ``ssl_context`` are
+  unspecified. (Pull #1608, Issue #1603)
+
+* Upgrade bundled rfc3986 to v1.3.2. (Pull #1609, Issue #1605)
+
+
+1.25.2 (2019-04-28)
+-------------------
+
+* Change ``is_ipaddress`` to not detect IPvFuture addresses. (Pull #1583)
+
+* Change ``parse_url`` to percent-encode invalid characters within the
+  path, query, and target components. (Pull #1586)
+
+
+1.25.1 (2019-04-24)
+-------------------
+
+* Add support for Google's ``Brotli`` package. (Pull #1572, Pull #1579)
+
+* Upgrade bundled rfc3986 to v1.3.1 (Pull #1578)
+
+
+1.25 (2019-04-22)
+-----------------
+
+* Require and validate certificates by default when using HTTPS (Pull #1507)
+
+* Upgraded ``urllib3.utils.parse_url()`` to be RFC 3986 compliant. (Pull #1487)
+
+* Added support for ``key_password`` for ``HTTPSConnectionPool`` to use
+  encrypted ``key_file`` without creating your own ``SSLContext`` object. (Pull #1489)
+
+* Add TLSv1.3 support to CPython, pyOpenSSL, and SecureTransport ``SSLContext``
+  implementations. (Pull #1496)
+
+* Switched the default multipart header encoder from RFC 2231 to HTML 5 working draft. (Issue #303, Pull #1492)
+
+* Fixed issue where OpenSSL would block if an encrypted client private key was
+  given and no password was given. Instead an ``SSLError`` is raised. (Pull #1489)
+
+* Added support for Brotli content encoding. It is enabled automatically if
+  ``brotlipy`` package is installed which can be requested with
+  ``urllib3[brotli]`` extra. (Pull #1532)
+
+* Drop ciphers using DSS key exchange from default TLS cipher suites.
+  Improve default ciphers when using SecureTransport. (Pull #1496)
+
+* Implemented a more efficient ``HTTPResponse.__iter__()`` method. (Issue #1483)
+
+1.24.3 (2019-05-01)
+-------------------
+
+* Apply fix for CVE-2019-9740. (Pull #1591)
+
+1.24.2 (2019-04-17)
+-------------------
+
+* Don't load system certificates by default when any other ``ca_certs``, ``ca_certs_dir`` or
+  ``ssl_context`` parameters are specified.
+
+* Remove Authorization header regardless of case when redirecting to cross-site. (Issue #1510)
+
+* Add support for IPv6 addresses in subjectAltName section of certificates. (Issue #1269)
+
+
+1.24.1 (2018-11-02)
+-------------------
+
+* Remove quadratic behavior within ``GzipDecoder.decompress()`` (Issue #1467)
+
+* Restored functionality of ``ciphers`` parameter for ``create_urllib3_context()``. (Issue #1462)
+
+
+1.24 (2018-10-16)
+-----------------
+
+* Allow key_server_hostname to be specified when initializing a PoolManager to allow custom SNI to be overridden. (Pull #1449)
+
+* Test against Python 3.7 on AppVeyor. (Pull #1453)
+
+* Early-out ipv6 checks when running on App Engine. (Pull #1450)
+
+* Change ambiguous description of backoff_factor (Pull #1436)
+
+* Add ability to handle multiple Content-Encodings (Issue #1441 and Pull #1442)
+
+* Skip DNS names that can't be idna-decoded when using pyOpenSSL (Issue #1405).
+
+* Add a server_hostname parameter to HTTPSConnection which allows for
+  overriding the SNI hostname sent in the handshake. (Pull #1397)
+
+* Drop support for EOL Python 2.6 (Pull #1429 and Pull #1430)
+
+* Fixed bug where responses with header Content-Type: message/* erroneously
+  raised HeaderParsingError, resulting in a warning being logged. (Pull #1439)
+
+* Move urllib3 to src/urllib3 (Pull #1409)
+
+
+1.23 (2018-06-04)
+-----------------
+
+* Allow providing a list of headers to strip from requests when redirecting
+  to a different host. Defaults to the ``Authorization`` header. Different
+  headers can be set via ``Retry.remove_headers_on_redirect``. (Issue #1316)
+
+* Fix ``util.selectors._fileobj_to_fd`` to accept ``long`` (Issue #1247).
+
+* Dropped Python 3.3 support. (Pull #1242)
+
+* Put the connection back in the pool when calling stream() or read_chunked() on
+  a chunked HEAD response. (Issue #1234)
+
+* Fixed pyOpenSSL-specific ssl client authentication issue when clients
+  attempted to auth via certificate + chain (Issue #1060)
+
+* Add the port to the connectionpool connect print (Pull #1251)
+
+* Don't use the ``uuid`` module to create multipart data boundaries. (Pull #1380)
+
+* ``read_chunked()`` on a closed response returns no chunks. (Issue #1088)
+
+* Add Python 2.6 support to ``contrib.securetransport`` (Pull #1359)
+
+* Added support for auth info in url for SOCKS proxy (Pull #1363)
+
+
+1.22 (2017-07-20)
+-----------------
+
+* Fixed missing brackets in ``HTTP CONNECT`` when connecting to IPv6 address via
+  IPv6 proxy. (Issue #1222)
+
+* Made the connection pool retry on ``SSLError``.  The original ``SSLError``
+  is available on ``MaxRetryError.reason``. (Issue #1112)
+
+* Drain and release connection before recursing on retry/redirect.  Fixes
+  deadlocks with a blocking connectionpool. (Issue #1167)
+
+* Fixed compatibility for cookiejar. (Issue #1229)
+
+* pyopenssl: Use vendored version of ``six``. (Issue #1231)
+
+
+1.21.1 (2017-05-02)
+-------------------
+
+* Fixed SecureTransport issue that would cause long delays in response body
+  delivery. (Pull #1154)
+
+* Fixed regression in 1.21 that threw exceptions when users passed the
+  ``socket_options`` flag to the ``PoolManager``.  (Issue #1165)
+
+* Fixed regression in 1.21 that threw exceptions when users passed the
+  ``assert_hostname`` or ``assert_fingerprint`` flag to the ``PoolManager``.
+  (Pull #1157)
+
+
+1.21 (2017-04-25)
+-----------------
+
+* Improved performance of certain selector system calls on Python 3.5 and
+  later. (Pull #1095)
+
+* Resolved issue where the PyOpenSSL backend would not wrap SysCallError
+  exceptions appropriately when sending data. (Pull #1125)
+
+* Selectors now detects a monkey-patched select module after import for modules
+  that patch the select module like eventlet, greenlet. (Pull #1128)
+
+* Reduced memory consumption when streaming zlib-compressed responses
+  (as opposed to raw deflate streams). (Pull #1129)
+
+* Connection pools now use the entire request context when constructing the
+  pool key. (Pull #1016)
+
+* ``PoolManager.connection_from_*`` methods now accept a new keyword argument,
+  ``pool_kwargs``, which are merged with the existing ``connection_pool_kw``.
+  (Pull #1016)
+
+* Add retry counter for ``status_forcelist``. (Issue #1147)
+
+* Added ``contrib`` module for using SecureTransport on macOS:
+  ``urllib3.contrib.securetransport``.  (Pull #1122)
+
+* urllib3 now only normalizes the case of ``http://`` and ``https://`` schemes:
+  for schemes it does not recognise, it assumes they are case-sensitive and
+  leaves them unchanged.
+  (Issue #1080)
+
+
+1.20 (2017-01-19)
+-----------------
+
+* Added support for waiting for I/O using selectors other than select,
+  improving urllib3's behaviour with large numbers of concurrent connections.
+  (Pull #1001)
+
+* Updated the date for the system clock check. (Issue #1005)
+
+* ConnectionPools now correctly consider hostnames to be case-insensitive.
+  (Issue #1032)
+
+* Outdated versions of PyOpenSSL now cause the PyOpenSSL contrib module
+  to fail when it is injected, rather than at first use. (Pull #1063)
+
+* Outdated versions of cryptography now cause the PyOpenSSL contrib module
+  to fail when it is injected, rather than at first use. (Issue #1044)
+
+* Automatically attempt to rewind a file-like body object when a request is
+  retried or redirected. (Pull #1039)
+
+* Fix some bugs that occur when modules incautiously patch the queue module.
+  (Pull #1061)
+
+* Prevent retries from occurring on read timeouts for which the request method
+  was not in the method whitelist. (Issue #1059)
+
+* Changed the PyOpenSSL contrib module to lazily load idna to avoid
+  unnecessarily bloating the memory of programs that don't need it. (Pull
+  #1076)
+
+* Add support for IPv6 literals with zone identifiers. (Pull #1013)
+
+* Added support for socks5h:// and socks4a:// schemes when working with SOCKS
+  proxies, and controlled remote DNS appropriately. (Issue #1035)
+
+
+1.19.1 (2016-11-16)
+-------------------
+
+* Fixed AppEngine import that didn't function on Python 3.5. (Pull #1025)
+
+
+1.19 (2016-11-03)
+-----------------
+
+* urllib3 now respects Retry-After headers on 413, 429, and 503 responses when
+  using the default retry logic. (Pull #955)
+
+* Remove markers from setup.py to assist ancient setuptools versions. (Issue
+  #986)
+
+* Disallow superscripts and other integerish things in URL ports. (Issue #989)
+
+* Allow urllib3's HTTPResponse.stream() method to continue to work with
+  non-httplib underlying FPs. (Pull #990)
+
+* Empty filenames in multipart headers are now emitted as such, rather than
+  being suppressed. (Issue #1015)
+
+* Prefer user-supplied Host headers on chunked uploads. (Issue #1009)
+
+
+1.18.1 (2016-10-27)
+-------------------
+
+* CVE-2016-9015. Users who are using urllib3 version 1.17 or 1.18 along with
+  PyOpenSSL injection and OpenSSL 1.1.0 *must* upgrade to this version. This
+  release fixes a vulnerability whereby urllib3 in the above configuration
+  would silently fail to validate TLS certificates due to erroneously setting
+  invalid flags in OpenSSL's ``SSL_CTX_set_verify`` function. These erroneous
+  flags do not cause a problem in OpenSSL versions before 1.1.0, which
+  interprets the presence of any flag as requesting certificate validation.
+
+  There is no PR for this patch, as it was prepared for simultaneous disclosure
+  and release. The master branch received the same fix in Pull #1010.
+
+
+1.18 (2016-09-26)
+-----------------
+
+* Fixed incorrect message for IncompleteRead exception. (Pull #973)
+
+* Accept ``iPAddress`` subject alternative name fields in TLS certificates.
+  (Issue #258)
+
+* Fixed consistency of ``HTTPResponse.closed`` between Python 2 and 3.
+  (Issue #977)
+
+* Fixed handling of wildcard certificates when using PyOpenSSL. (Issue #979)
+
+
+1.17 (2016-09-06)
+-----------------
+
+* Accept ``SSLContext`` objects for use in SSL/TLS negotiation. (Issue #835)
+
+* ConnectionPool debug log now includes scheme, host, and port. (Issue #897)
+
+* Substantially refactored documentation. (Issue #887)
+
+* Used URLFetch default timeout on AppEngine, rather than hardcoding our own.
+  (Issue #858)
+
+* Normalize the scheme and host in the URL parser (Issue #833)
+
+* ``HTTPResponse`` contains the last ``Retry`` object, which now also
+  contains retries history. (Issue #848)
+
+* Timeout can no longer be set as boolean, and must be greater than zero.
+  (Pull #924)
+
+* Removed pyasn1 and ndg-httpsclient from dependencies used for PyOpenSSL. We
+  now use cryptography and idna, both of which are already dependencies of
+  PyOpenSSL. (Pull #930)
+
+* Fixed infinite loop in ``stream`` when amt=None. (Issue #928)
+
+* Try to use the operating system's certificates when we are using an
+  ``SSLContext``. (Pull #941)
+
+* Updated cipher suite list to allow ChaCha20+Poly1305. AES-GCM is preferred to
+  ChaCha20, but ChaCha20 is then preferred to everything else. (Pull #947)
+
+* Updated cipher suite list to remove 3DES-based cipher suites. (Pull #958)
+
+* Removed the cipher suite fallback to allow HIGH ciphers. (Pull #958)
+
+* Implemented ``length_remaining`` to determine remaining content
+  to be read. (Pull #949)
+
+* Implemented ``enforce_content_length`` to enable exceptions when
+  incomplete data chunks are received. (Pull #949)
+
+* Dropped connection start, dropped connection reset, redirect, forced retry,
+  and new HTTPS connection log levels to DEBUG, from INFO. (Pull #967)
+
+
+1.16 (2016-06-11)
+-----------------
+
+* Disable IPv6 DNS when IPv6 connections are not possible. (Issue #840)
+
+* Provide ``key_fn_by_scheme`` pool keying mechanism that can be
+  overridden. (Issue #830)
+
+* Normalize scheme and host to lowercase for pool keys, and include
+  ``source_address``. (Issue #830)
+
+* Cleaner exception chain in Python 3 for ``_make_request``.
+  (Issue #861)
+
+* Fixed installing ``urllib3[socks]`` extra. (Issue #864)
+
+* Fixed signature of ``ConnectionPool.close`` so it can actually safely be
+  called by subclasses. (Issue #873)
+
+* Retain ``release_conn`` state across retries. (Issues #651, #866)
+
+* Add customizable ``HTTPConnectionPool.ResponseCls``, which defaults to
+  ``HTTPResponse`` but can be replaced with a subclass. (Issue #879)
+
+
+1.15.1 (2016-04-11)
+-------------------
+
+* Fix packaging to include backports module. (Issue #841)
+
+
+1.15 (2016-04-06)
+-----------------
+
+* Added Retry(raise_on_status=False). (Issue #720)
+
+* Always use setuptools, no more distutils fallback. (Issue #785)
+
+* Dropped support for Python 3.2. (Issue #786)
+
+* Chunked transfer encoding when requesting with ``chunked=True``.
+  (Issue #790)
+
+* Fixed regression with IPv6 port parsing. (Issue #801)
+
+* Append SNIMissingWarning messages to allow users to specify it in
+  the PYTHONWARNINGS environment variable. (Issue #816)
+
+* Handle unicode headers in Py2. (Issue #818)
+
+* Log certificate when there is a hostname mismatch. (Issue #820)
+
+* Preserve order of request/response headers. (Issue #821)
+
+
+1.14 (2015-12-29)
+-----------------
+
+* contrib: SOCKS proxy support! (Issue #762)
+
+* Fixed AppEngine handling of transfer-encoding header and bug
+  in Timeout defaults checking. (Issue #763)
+
+
+1.13.1 (2015-12-18)
+-------------------
+
+* Fixed regression in IPv6 + SSL for match_hostname. (Issue #761)
+
+
+1.13 (2015-12-14)
+-----------------
+
+* Fixed ``pip install urllib3[secure]`` on modern pip. (Issue #706)
+
+* pyopenssl: Fixed SSL3_WRITE_PENDING error. (Issue #717)
+
+* pyopenssl: Support for TLSv1.1 and TLSv1.2. (Issue #696)
+
+* Close connections more defensively on exception. (Issue #734)
+
+* Adjusted ``read_chunked`` to handle gzipped, chunk-encoded bodies without
+  repeatedly flushing the decoder, to function better on Jython. (Issue #743)
+
+* Accept ``ca_cert_dir`` for SSL-related PoolManager configuration. (Issue #758)
+
+
+1.12 (2015-09-03)
+-----------------
+
+* Rely on ``six`` for importing ``httplib`` to work around
+  conflicts with other Python 3 shims. (Issue #688)
+
+* Add support for directories of certificate authorities, as supported by
+  OpenSSL. (Issue #701)
+
+* New exception: ``NewConnectionError``, raised when we fail to establish
+  a new connection, usually ``ECONNREFUSED`` socket error.
+
+
+1.11 (2015-07-21)
+-----------------
+
+* When ``ca_certs`` is given, ``cert_reqs`` defaults to
+  ``'CERT_REQUIRED'``. (Issue #650)
+
+* ``pip install urllib3[secure]`` will install Certifi and
+  PyOpenSSL as dependencies. (Issue #678)
+
+* Made ``HTTPHeaderDict`` usable as a ``headers`` input value
+  (Issues #632, #679)
+
+* Added `urllib3.contrib.appengine <https://urllib3.readthedocs.io/en/latest/contrib.html#google-app-engine>`_
+  which has an ``AppEngineManager`` for using ``URLFetch`` in 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
+  ``ValueError`` instead of ``AssertionError`` (backwards
+  compatible for now, but please migrate). (Issue #640)
+
+* Fix pools not getting replenished when an error occurs during a
+  request using ``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)
+
+* Fix ``httplib.IncompleteRead`` not getting converted to
+  ``ProtocolError`` when using ``HTTPResponse.stream()``
+  (Issue #674)
+
+1.10.4 (2015-05-03)
+-------------------
+
+* 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)
+
+
+1.10.3 (2015-04-21)
+-------------------
+
+* Emit ``InsecurePlatformWarning`` when 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)
+
+
+1.10.2 (2015-02-25)
+-------------------
+
+* 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)
+
+
+1.10.1 (2015-02-10)
+-------------------
+
+* 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)
+
+
+1.10 (2014-12-14)
+-----------------
+
+* Disabled SSLv3. (Issue #473)
+
+* Add ``Url.url`` property to return the composed url string. (Issue #394)
+
+* Fixed PyOpenSSL + gevent ``WantWriteError``. (Issue #412)
+
+* ``MaxRetryError.reason`` will 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)
+
+* Emit ``InsecureRequestWarning`` for *every* insecure HTTPS request.
+  (Issue #496)
+
+* Emit ``SecurityWarning`` when certificate has no ``subjectAltName``.
+  (Issue #499)
+
+* Close and discard sockets which experienced SSL-related errors.
+  (Issue #501)
+
+* Handle ``body`` param in ``.request(...)``. (Issue #513)
+
+* Respect timeout with HTTPS proxy. (Issue #505)
+
+* PyOpenSSL: Handle ZeroReturnError exception. (Issue #520)
+
+
+1.9.1 (2014-09-13)
+------------------
+
+* 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)
+
+* Emit ``SecurityWarning`` if system clock is waaay off. (Issue #445)
+
+* Fixed PyOpenSSL compatibility with PyPy. (Issue #450)
+
+* Fixed ``BrokenPipeError`` and ``ConnectionError`` handling in Py3.
+  (Issue #443)
+
+
+
+1.9 (2014-07-04)
+----------------
+
+* 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
+  <https://urllib3.readthedocs.io/en/latest/security.html>`_ for details.
+  (Issue #426)
+
+* New retry logic and ``urllib3.util.retry.Retry`` configuration 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
+  ``.reason`` property. (Issue #326)
+
+* ``urllib3.exceptions.ConnectionError`` renamed to
+  ``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)
+
+
+1.8.3 (2014-06-23)
+------------------
+
+* Fix TLS verification when using a proxy in Python 3.4.1. (Issue #385)
+
+* Add ``disable_cache`` option to ``urllib3.util.make_headers``. (Issue #393)
+
+* Wrap ``socket.timeout`` exception with
+  ``urllib3.exceptions.ReadTimeoutError``. (Issue #399)
+
+* Fixed proxy-related bug where connections were being reused incorrectly.
+  (Issues #366, #369)
+
+* Added ``socket_options`` keyword parameter which allows to define
+  ``setsockopt`` configuration of new sockets. (Issue #397)
+
+* Removed ``HTTPConnection.tcp_nodelay`` in favor of
+  ``HTTPConnection.default_socket_options``. (Issue #397)
+
+* Fixed ``TypeError`` bug in Python 2.6.4. (Issue #411)
+
+
+1.8.2 (2014-04-17)
+------------------
+
+* Fix ``urllib3.util`` not being included in the package.
+
+
+1.8.1 (2014-04-17)
+------------------
+
+* Fix AppEngine bug of HTTPS requests going out as HTTP. (Issue #356)
+
+* Don't install ``dummyserver`` into ``site-packages`` as it's only needed
+  for the test suite. (Issue #362)
+
+* Added support for specifying ``source_address``. (Issue #352)
+
+
+1.8 (2014-03-04)
+----------------
+
+* Improved url parsing in ``urllib3.util.parse_url`` (properly parse '@' in
+  username, and blank ports like 'hostname:').
+
+* New ``urllib3.connection`` module which contains all the HTTPConnection
+  objects.
+
+* Several ``urllib3.util.Timeout``-related fixes. Also changed constructor
+  signature to a more sensible order. [Backwards incompatible]
+  (Issues #252, #262, #263)
+
+* Use ``backports.ssl_match_hostname`` if it's installed. (Issue #274)
+
+* Added ``.tell()`` method to ``urllib3.response.HTTPResponse`` which
+  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_host``
+  to 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)
+
+* Fixed ``urllib3.poolmanager.ProxyManager`` not 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.pyopenssl``
+  from the default 64 to 1024 in a single certificate. (Issue #318)
+
+* Headers are now passed and stored as a custom
+  ``urllib3.collections_.HTTPHeaderDict`` object rather than a plain ``dict``.
+  (Issue #329, #333)
+
+* Headers no longer lose their case on Python 3. (Issue #236)
+
+* ``urllib3.contrib.pyopenssl`` now uses the operating system's default CA
+  certificates on inject. (Issue #332)
+
+* Requests with ``retries=False`` will immediately raise any exceptions without
+  wrapping them in ``MaxRetryError``. (Issue #348)
+
+* Fixed open socket leak with SSL-related failures. (Issue #344, #348)
+
+
+1.7.1 (2013-09-25)
+------------------
+
+* Added granular timeout support with new ``urllib3.util.Timeout`` class.
+  (Issue #231)
+
+* Fixed Python 3.4 support. (Issue #238)
+
+
+1.7 (2013-08-14)
+----------------
+
+* 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.HTTPResponse`` now inherits from ``io.IOBase`` for bonus
+  file-like functionality. (Issue #187)
+
+* Passing ``assert_hostname=False`` when 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
+  ``urllib3.poolmanager.PoolManager.connection_from_host(...)`` (Issue #204)
+
+* ``ProxyManager`` requests now include non-default port in ``Host: ...``
+  header. (Issue #217)
+
+* Added HTTPS proxy support in ``ProxyManager``. (Issue #170 #139)
+
+* New ``RequestField`` object can be passed to the ``fields=...`` param which
+  can specify headers. (Issue #220)
+
+* Raise ``urllib3.exceptions.ProxyError`` when connecting to proxy fails.
+  (Issue #221)
+
+* Use international headers when posting file names. (Issue #119)
+
+* Improved IPv6 support. (Issue #203)
+
+
+1.6 (2013-04-25)
+----------------
+
+* Contrib: Optional SNI support for Py2 using PyOpenSSL. (Issue #156)
+
+* ``ProxyManager`` automatically adds ``Host: ...`` header if not given.
+
+* Improved SSL-related code. ``cert_req`` now optionally takes a string like
+  "REQUIRED" or "NONE". Same with ``ssl_version`` takes strings like "SSLv23"
+  The string values reflect the suffix of the respective constant variable.
+  (Issue #130)
+
+* Vendored ``socksipy`` now 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 ``ssl_version`` parameter of ``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 ``six`` module
+  namespace. (Issue #113)
+
+* ``urllib3.exceptions.MaxRetryError`` contains a ``reason`` property holding
+  the exception that prompted the final retry. If ``reason is None`` then it
+  was due to a redirect. (Issue #92, #114)
+
+* Fixed ``PoolManager.urlopen()`` from not redirecting more than once.
+  (Issue #149)
+
+* Don't assume ``Content-Type: text/plain`` for 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)
+
+
+1.5 (2012-08-02)
+----------------
+
+* Added ``urllib3.add_stderr_logger()`` for quickly enabling STDERR debug
+  logging in urllib3.
+
+* Native full URL parsing (including auth, path, query, fragment) available in
+  ``urllib3.util.parse_url(url)``.
+
+* Built-in redirect will switch method to 'GET' if status code is 303.
+  (Issue #11)
+
+* ``urllib3.PoolManager`` strips the scheme and host before sending the request
+  uri. (Issue #8)
+
+* New ``urllib3.exceptions.DecodeError`` exception 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
+  ``urllib3.PoolManager.clear()``.
+
+* 99% -> 100% unit test coverage.
+
+
+1.4 (2012-06-16)
+----------------
+
+* Minor AppEngine-related fixes.
+
+* Switched from ``mimetools.choose_boundary`` to ``uuid.uuid4()``.
+
+* Improved url parsing. (Issue #73)
+
+* IPv6 url support. (Issue #72)
+
+
+1.3 (2012-03-25)
+----------------
+
+* Removed pre-1.0 deprecated API.
+
+* Refactored helpers into a ``urllib3.util`` submodule.
+
+* 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)
+
+* Minor ``encode_multipart_formdata`` fixes related to Python 3 strings vs
+  bytes.
+
+
+1.2.2 (2012-02-06)
+------------------
+
+* Fixed packaging bug of not shipping ``test-requirements.txt``. (Issue #47)
+
+
+1.2.1 (2012-02-05)
+------------------
+
+* Fixed another bug related to when ``ssl`` module is not available. (Issue #41)
+
+* Location parsing errors now raise ``urllib3.exceptions.LocationParseError``
+  which inherits from ``ValueError``.
+
+
+1.2 (2012-01-29)
+----------------
+
+* Added Python 3 support (tested on 3.2.2)
+
+* Dropped Python 2.5 support (tested on 2.6.7, 2.7.2)
+
+* Use ``select.poll`` instead of ``select.select`` for platforms that support
+  it.
+
+* Use ``Queue.LifoQueue`` instead of ``Queue.Queue`` for more aggressive
+  connection reusing. Configurable by overriding ``ConnectionPool.QueueCls``.
+
+* Fixed ``ImportError`` during install when ``ssl`` module is not available.
+  (Issue #41)
+
+* Fixed ``PoolManager`` redirects between schemes (such as HTTP -> HTTPS) not
+  completing properly. (Issue #28, uncovered by Issue #10 in v1.1)
+
+* Ported ``dummyserver`` to use ``tornado`` instead of ``webob`` +
+  ``eventlet``. Removed extraneous unsupported dummyserver testing backends.
+  Added socket-level tests.
+
+* More tests. Achievement Unlocked: 99% Coverage.
+
+
+1.1 (2012-01-07)
+----------------
+
+* Refactored ``dummyserver`` to its own root namespace module (used for
+  testing).
+
+* Added hostname verification for ``VerifiedHTTPSConnection`` by vendoring in
+  Py32's ``ssl_match_hostname``. (Issue #25)
+
+* Fixed cross-host HTTP redirects when using ``PoolManager``. (Issue #10)
+
+* Fixed ``decode_content`` being ignored when set through ``urlopen``. (Issue
+  #27)
+
+* Fixed timeout-related bugs. (Issues #17, #23)
+
+
+1.0.2 (2011-11-04)
+------------------
+
+* Fixed typo in ``VerifiedHTTPSConnection`` which 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 ``__delitem__`` and
+  ``__getitem__`` behaviour), with tests. Shouldn't affect core urllib3 code.
+
+
+1.0.1 (2011-10-10)
+------------------
+
+* Fixed a bug where the same connection would get returned into the pool twice,
+  causing extraneous "HttpConnectionPool is full" log warnings.
+
+
+1.0 (2011-10-08)
+----------------
+
+* Added ``PoolManager`` with LRU expiration of connections (tested and
+  documented).
+* Added ``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 ``encode_multipart_formdata``.
+* Convenience request methods are now inherited from ``RequestMethods``. Old
+  helpers like ``get_url`` and ``post_url`` should be abandoned in favour of
+  the new ``request(method, url, ...)``.
+* Refactored code to be even more decoupled, reusable, and extendable.
+* License header added to ``.py`` files.
+* Embiggened the documentation: Lots of Sphinx-friendly docstrings in the code
+  and docs in ``docs/`` and on https://urllib3.readthedocs.io/.
+* Embettered all the things!
+* Started writing this file.
+
+
+0.4.1 (2011-07-17)
+------------------
+
+* Minor bug fixes, code cleanup.
+
+
+0.4 (2011-03-01)
+----------------
+
+* Better unicode support.
+* Added ``VerifiedHTTPSConnection``.
+* Added ``NTLMConnectionPool`` in contrib.
+* Minor improvements.
+
+
+0.3.1 (2010-07-13)
+------------------
+
+* Added ``assert_host_name`` optional parameter. Now compatible with proxies.
+
+
+0.3 (2009-12-10)
+----------------
+
+* Added HTTPS support.
+* Minor bug fixes.
+* Refactored, broken backwards compatibility with 0.2.
+* API to be treated as stable from this version forward.
+
+
+0.2 (2008-11-17)
+----------------
+
+* Added unit tests.
+* Bug fixes.
+
+
+0.1 (2008-11-16)
+----------------
+
+* First release.

+ 41 - 25
desktop/core/ext-py/urllib3-1.25.8/README.rst → desktop/core/ext-py/urllib3-1.26.12/README.rst

@@ -1,7 +1,21 @@
-urllib3
-=======
-
-urllib3 is a powerful, *sanity-friendly* HTTP client for Python. Much of the
+.. raw:: html
+
+   <p align="center">
+      <a href="https://github.com/urllib3/urllib3">
+         <img src="./docs/images/banner.svg" width="60%" alt="urllib3" />
+      </a>
+   </p>
+   <p align="center">
+      <a href="https://pypi.org/project/urllib3"><img alt="PyPI Version" src="https://img.shields.io/pypi/v/urllib3.svg?maxAge=86400" /></a>
+      <a href="https://pypi.org/project/urllib3"><img alt="Python Versions" src="https://img.shields.io/pypi/pyversions/urllib3.svg?maxAge=86400" /></a>
+      <a href="https://discord.gg/CHEgCZN"><img alt="Join our Discord" src="https://img.shields.io/discord/756342717725933608?color=%237289da&label=discord" /></a>
+      <a href="https://codecov.io/gh/urllib3/urllib3"><img alt="Coverage Status" src="https://img.shields.io/codecov/c/github/urllib3/urllib3.svg" /></a>
+      <a href="https://github.com/urllib3/urllib3/actions?query=workflow%3ACI"><img alt="Build Status on GitHub" src="https://github.com/urllib3/urllib3/workflows/CI/badge.svg" /></a>
+      <a href="https://travis-ci.org/urllib3/urllib3"><img alt="Build Status on Travis" src="https://travis-ci.org/urllib3/urllib3.svg?branch=master" /></a>
+      <a href="https://urllib3.readthedocs.io"><img alt="Documentation Status" src="https://readthedocs.org/projects/urllib3/badge/?version=latest" /></a>
+   </p>
+
+urllib3 is a powerful, *user-friendly* HTTP client for Python. Much of the
 Python ecosystem already uses urllib3 and you should too.
 urllib3 brings many critical features that are missing from the Python
 standard libraries:
@@ -15,7 +29,9 @@ standard libraries:
 - Proxy support for HTTP and SOCKS.
 - 100% test coverage.
 
-urllib3 is powerful and easy to use::
+urllib3 is powerful and easy to use:
+
+.. code-block:: python
 
     >>> import urllib3
     >>> http = urllib3.PoolManager()
@@ -31,12 +47,14 @@ Installing
 
 urllib3 can be installed with `pip <https://pip.pypa.io>`_::
 
-    $ pip install urllib3
+    $ python -m pip install urllib3
 
 Alternatively, you can grab the latest source code from `GitHub <https://github.com/urllib3/urllib3>`_::
 
-    $ git clone git://github.com/urllib3/urllib3.git
-    $ python setup.py install
+    $ git clone https://github.com/urllib3/urllib3.git
+    $ cd urllib3
+    $ git checkout 1.26.x
+    $ pip install .
 
 
 Documentation
@@ -60,16 +78,17 @@ To report a security vulnerability, please use the
 `Tidelift security contact <https://tidelift.com/security>`_.
 Tidelift will coordinate the fix and disclosure with maintainers.
 
+
 Maintainers
 -----------
 
-- `@sethmlarson <https://github.com/sethmlarson>`_ (Seth M. Larson)
-- `@pquentin <https://github.com/pquentin>`_ (Quentin Pradet)
-- `@theacodes <https://github.com/theacodes>`_ (Thea Flowers)
-- `@haikuginger <https://github.com/haikuginger>`_ (Jess Shapiro)
-- `@lukasa <https://github.com/lukasa>`_ (Cory Benfield)
-- `@sigmavirus24 <https://github.com/sigmavirus24>`_ (Ian Stapleton Cordasco)
-- `@shazow <https://github.com/shazow>`_ (Andrey Petrov)
+- `@sethmlarson <https://github.com/sethmlarson>`__ (Seth M. Larson)
+- `@pquentin <https://github.com/pquentin>`__ (Quentin Pradet)
+- `@theacodes <https://github.com/theacodes>`__ (Thea Flowers)
+- `@haikuginger <https://github.com/haikuginger>`__ (Jess Shapiro)
+- `@lukasa <https://github.com/lukasa>`__ (Cory Benfield)
+- `@sigmavirus24 <https://github.com/sigmavirus24>`__ (Ian Stapleton Cordasco)
+- `@shazow <https://github.com/shazow>`__ (Andrey Petrov)
 
 👋
 
@@ -77,6 +96,13 @@ Maintainers
 Sponsorship
 -----------
 
+If your company benefits from this library, please consider `sponsoring its
+development <https://urllib3.readthedocs.io/en/latest/sponsors.html>`_.
+
+
+For Enterprise
+--------------
+
 .. |tideliftlogo| image:: https://nedbatchelder.com/pix/Tidelift_Logos_RGB_Tidelift_Shorthand_On-White_small.png
    :width: 75
    :alt: Tidelift
@@ -92,13 +118,3 @@ Sponsorship
        tools.
 
 .. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=readme
-
-If your company benefits from this library, please consider `sponsoring its
-development <https://urllib3.readthedocs.io/en/latest/contributing.html#sponsorship-project-grants>`_.
-
-Sponsors include:
-
-- Abbott (2018-2019), sponsored `@sethmlarson <https://github.com/sethmlarson>`_'s work on urllib3.
-- Google Cloud Platform (2018-2019), sponsored `@theacodes <https://github.com/theacodes>`_'s work on urllib3.
-- Akamai (2017-2018), sponsored `@haikuginger <https://github.com/haikuginger>`_'s work on urllib3
-- Hewlett Packard Enterprise (2016-2017), sponsored `@Lukasa’s <https://github.com/Lukasa>`_ work on urllib3.

+ 20 - 0
desktop/core/ext-py/urllib3-1.26.12/dev-requirements.txt

@@ -0,0 +1,20 @@
+mock==3.0.5
+coverage~=5.0
+tornado==5.1.1;python_version<="2.7"
+tornado==6.1.0;python_version>"3.5"
+PySocks==1.7.1
+# https://github.com/Anorov/PySocks/issues/131
+win-inet-pton==1.1.0
+pytest==4.6.9; python_version<"3.10"
+pytest==6.2.4; python_version>="3.10"
+pytest-timeout==1.4.2
+pytest-freezegun==0.4.2
+flaky==3.7.0
+trustme==0.7.0
+cryptography==3.2.1;python_version<"3.6"
+cryptography==3.4.7;python_version>="3.6"
+python-dateutil==2.8.1
+
+# https://github.com/GrahamDumpleton/wrapt/issues/189
+wrapt==1.12.1; python_version<="2.7" and sys_platform=="win32"
+gcp-devrel-py-tools==0.0.16

+ 0 - 0
desktop/core/ext-py/urllib3-1.25.8/docs/Makefile → desktop/core/ext-py/urllib3-1.26.12/docs/Makefile


+ 1 - 1
desktop/core/ext-py/urllib3-1.25.8/docs/images/banner.svg → desktop/core/ext-py/urllib3-1.26.12/docs/_static/banner.svg

@@ -1 +1 @@
-<svg viewBox="0 0 400 119.35" xmlns="http://www.w3.org/2000/svg"><path d="m23.05 31v51.88q0 7.35 1.73 11.05 3.06 6.55 12 6.56 11.48 0 15.71-9.32 2.2-5.06 2.2-13.34v-46.83h22.82v86h-21.86v-12.09c-.21.26-.74 1-1.57 2.36a15.9 15.9 0 0 1 -3 3.48 31.44 31.44 0 0 1 -10.2 6.47 34.57 34.57 0 0 1 -11.52 1.78q-19 0-25.66-13.74-3.7-7.61-3.7-22.38v-51.88z"/><path d="m140.44 29c.29 0 .93.07 1.93.12v23.06c-1.42-.16-2.68-.27-3.79-.32s-2-.08-2.68-.08q-13.58 0-18.23 8.84-2.61 5-2.61 15.32v41.12h-22.65v-86.06h21.47v15q5.2-8.61 9.08-11.76 6.3-5.24 16.41-5.24z"/><path d="m177.56 86h-22.81v-86h22.81zm-22.81 10.3h22.81v20.76h-22.81z" fill="#e32400"/><path d="m210.13 86h-22.82v-86h22.82zm-22.82 10.3h22.82v20.76h-22.82z" fill="#ff9300"/><path d="m242.69 20.76h-22.81v-20.76h22.81zm-22.81 10.24h22.81v86h-22.81z" fill="#4f7a28"/><path d="m333.45 41.36q9.66 12.24 9.66 31.58 0 20-9.53 33.23t-26.58 13.18q-10.71 0-17.21-4.26-3.89-2.53-8.41-8.84v10.81h-22.18v-116.19h22.49v41.36a32.94 32.94 0 0 1 9.46-9.16q6.11-3.94 15.57-3.94 17.07 0 26.73 12.23zm-18.8 52.41q4.86-7 4.85-18.47 0-9.15-2.38-15.15-4.55-11.37-16.72-11.37-12.33 0-16.95 11.13-2.38 5.93-2.39 15.32 0 11 4.94 18.31t15 7.26a15.6 15.6 0 0 0 13.65-7.03z"/><path d="m363 49.73q.31 5.06 1.74 7.42 2.59 4.34 9.47 4.34a11.79 11.79 0 0 0 5.6-1.42q5.06-2.68 5-9.24t-5-8.6q-3.07-1.33-11.6-1.66v-9.57q7-.15 9.87-1.34 5-2.13 5-8.21a7.91 7.91 0 0 0 -2.81-6.45 10.56 10.56 0 0 0 -6.87-2.25 8.91 8.91 0 0 0 -7.3 3.12 12.32 12.32 0 0 0 -2.57 8.09h-13.53a20.75 20.75 0 0 1 7.42-17.37q5.96-4.78 16.58-4.77 10.89 0 17.33 5.17a16.55 16.55 0 0 1 6.43 13.53 14.06 14.06 0 0 1 -2.42 8.48 17.71 17.71 0 0 1 -6.55 5.41 13 13 0 0 1 7.78 4.34q3.43 3.72 3.43 11.45 0 10.59-7.3 16.38a27.25 27.25 0 0 1 -17.49 5.8q-12.07 0-19.37-5.32t-7.31-17.33z"/></svg>
+<svg viewBox="0 0 400 119.35" xmlns="http://www.w3.org/2000/svg"><path d="m23.05 31v51.88q0 7.35 1.73 11.05 3.06 6.55 12 6.56 11.48 0 15.71-9.32 2.2-5.06 2.2-13.34v-46.83h22.82v86h-21.86v-12.09c-.21.26-.74 1-1.57 2.36a15.9 15.9 0 0 1 -3 3.48 31.44 31.44 0 0 1 -10.2 6.47 34.57 34.57 0 0 1 -11.52 1.78q-19 0-25.66-13.74-3.7-7.61-3.7-22.38v-51.88z"/><path d="m140.44 29c.29 0 .93.07 1.93.12v23.06c-1.42-.16-2.68-.27-3.79-.32s-2-.08-2.68-.08q-13.58 0-18.23 8.84-2.61 5-2.61 15.32v41.12h-22.65v-86.06h21.47v15q5.2-8.61 9.08-11.76 6.3-5.24 16.41-5.24z"/><path d="m177.56 86h-22.81v-86h22.81zm-22.81 10.3h22.81v20.76h-22.81z" fill="#cb3b0f"/><path d="m210.13 86h-22.82v-86h22.82zm-22.82 10.3h22.82v20.76h-22.82z" fill="#ea9b1c"/><path d="m242.69 20.76h-22.81v-20.76h22.81zm-22.81 10.24h22.81v86h-22.81z" fill="#577a27"/><path d="m333.45 41.36q9.66 12.24 9.66 31.58 0 20-9.53 33.23t-26.58 13.18q-10.71 0-17.21-4.26-3.89-2.53-8.41-8.84v10.81h-22.18v-116.19h22.49v41.36a32.94 32.94 0 0 1 9.46-9.16q6.11-3.94 15.57-3.94 17.07 0 26.73 12.23zm-18.8 52.41q4.86-7 4.85-18.47 0-9.15-2.38-15.15-4.55-11.37-16.72-11.37-12.33 0-16.95 11.13-2.38 5.93-2.39 15.32 0 11 4.94 18.31t15 7.26a15.6 15.6 0 0 0 13.65-7.03z"/><path d="m363 49.73q.31 5.06 1.74 7.42 2.59 4.34 9.47 4.34a11.79 11.79 0 0 0 5.6-1.42q5.06-2.68 5-9.24t-5-8.6q-3.07-1.33-11.6-1.66v-9.57q7-.15 9.87-1.34 5-2.13 5-8.21a7.91 7.91 0 0 0 -2.81-6.45 10.56 10.56 0 0 0 -6.87-2.25 8.91 8.91 0 0 0 -7.3 3.12 12.32 12.32 0 0 0 -2.57 8.09h-13.53a20.75 20.75 0 0 1 7.42-17.37q5.96-4.78 16.58-4.77 10.89 0 17.33 5.17a16.55 16.55 0 0 1 6.43 13.53 14.06 14.06 0 0 1 -2.42 8.48 17.71 17.71 0 0 1 -6.55 5.41 13 13 0 0 1 7.78 4.34q3.43 3.72 3.43 11.45 0 10.59-7.3 16.38a27.25 27.25 0 0 1 -17.49 5.8q-12.07 0-19.37-5.32t-7.31-17.33z"/></svg>

+ 1 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/_static/dark-logo.svg

@@ -0,0 +1 @@
+<svg viewBox="0 0 400 119.35" xmlns="http://www.w3.org/2000/svg"><path d="m23.05 31v51.88q0 7.35 1.73 11.05 3.06 6.55 12 6.56 11.48 0 15.71-9.32 2.2-5.06 2.2-13.34v-46.83h22.82v86h-21.86v-12.09c-.21.26-.74 1-1.57 2.36a15.9 15.9 0 0 1 -3 3.48 31.44 31.44 0 0 1 -10.2 6.47 34.57 34.57 0 0 1 -11.52 1.78q-19 0-25.66-13.74-3.7-7.61-3.7-22.38v-51.88z" fill="#fff"/><path d="m140.44 29c.29 0 .93.07 1.93.12v23.06c-1.42-.16-2.68-.27-3.79-.32s-2-.08-2.68-.08q-13.58 0-18.23 8.84-2.61 5-2.61 15.32v41.12h-22.65v-86.06h21.47v15q5.2-8.61 9.08-11.76 6.3-5.24 16.41-5.24z" fill="#fff"/><path d="m177.56 86h-22.81v-86h22.81zm-22.81 10.3h22.81v20.76h-22.81z" fill="#cb3b0f"/><path d="m210.13 86h-22.82v-86h22.82zm-22.82 10.3h22.82v20.76h-22.82z" fill="#ea9b1c"/><path d="m242.69 20.76h-22.81v-20.76h22.81zm-22.81 10.24h22.81v86h-22.81z" fill="#577a27"/><path d="m333.45 41.36q9.66 12.24 9.66 31.58 0 20-9.53 33.23t-26.58 13.18q-10.71 0-17.21-4.26-3.89-2.53-8.41-8.84v10.81h-22.18v-116.19h22.49v41.36a32.94 32.94 0 0 1 9.46-9.16q6.11-3.94 15.57-3.94 17.07 0 26.73 12.23zm-18.8 52.41q4.86-7 4.85-18.47 0-9.15-2.38-15.15-4.55-11.37-16.72-11.37-12.33 0-16.95 11.13-2.38 5.93-2.39 15.32 0 11 4.94 18.31t15 7.26a15.6 15.6 0 0 0 13.65-7.03z" fill="#fff"/><path d="m363 49.73q.31 5.06 1.74 7.42 2.59 4.34 9.47 4.34a11.79 11.79 0 0 0 5.6-1.42q5.06-2.68 5-9.24t-5-8.6q-3.07-1.33-11.6-1.66v-9.57q7-.15 9.87-1.34 5-2.13 5-8.21a7.91 7.91 0 0 0 -2.81-6.45 10.56 10.56 0 0 0 -6.87-2.25 8.91 8.91 0 0 0 -7.3 3.12 12.32 12.32 0 0 0 -2.57 8.09h-13.53a20.75 20.75 0 0 1 7.42-17.37q5.96-4.78 16.58-4.77 10.89 0 17.33 5.17a16.55 16.55 0 0 1 6.43 13.53 14.06 14.06 0 0 1 -2.42 8.48 17.71 17.71 0 0 1 -6.55 5.41 13 13 0 0 1 7.78 4.34q3.43 3.72 3.43 11.45 0 10.59-7.3 16.38a27.25 27.25 0 0 1 -17.49 5.8q-12.07 0-19.37-5.32t-7.31-17.33z" fill="#fff"/></svg>

+ 503 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/advanced-usage.rst

@@ -0,0 +1,503 @@
+Advanced Usage
+==============
+
+.. currentmodule:: urllib3
+
+
+Customizing Pool Behavior
+-------------------------
+
+The :class:`~poolmanager.PoolManager` class automatically handles creating
+:class:`~connectionpool.ConnectionPool` instances for each host as needed. By
+default, it will keep a maximum of 10 :class:`~connectionpool.ConnectionPool`
+instances. If you're making requests to many different hosts it might improve
+performance to increase this number::
+
+    >>> import urllib3
+    >>> http = urllib3.PoolManager(num_pools=50)
+
+However, keep in mind that this does increase memory and socket consumption.
+
+Similarly, the :class:`~connectionpool.ConnectionPool` class keeps a pool
+of individual :class:`~connection.HTTPConnection` instances. These connections
+are used during an individual request and returned to the pool when the request
+is complete. By default only one connection will be saved for re-use. If you
+are making many requests to the same host simultaneously it might improve
+performance to increase this number::
+
+    >>> import urllib3
+    >>> http = urllib3.PoolManager(maxsize=10)
+    # Alternatively
+    >>> http = urllib3.HTTPConnectionPool('google.com', maxsize=10)
+
+The behavior of the pooling for :class:`~connectionpool.ConnectionPool` is
+different from :class:`~poolmanager.PoolManager`. By default, if a new
+request is made and there is no free connection in the pool then a new
+connection will be created. However, this connection will not be saved if more
+than ``maxsize`` connections exist. This means that ``maxsize`` does not
+determine the maximum number of connections that can be open to a particular
+host, just the maximum number of connections to keep in the pool. However, if you specify ``block=True`` then there can be at most ``maxsize`` connections
+open to a particular host::
+
+    >>> http = urllib3.PoolManager(maxsize=10, block=True)
+    # Alternatively
+    >>> http = urllib3.HTTPConnectionPool('google.com', maxsize=10, block=True)
+
+Any new requests will block until a connection is available from the pool.
+This is a great way to prevent flooding a host with too many connections in
+multi-threaded applications.
+
+.. _stream:
+.. _streaming_and_io:
+
+Streaming and I/O
+-----------------
+
+When using ``preload_content=True`` (the default setting) the
+response body will be read immediately into memory and the HTTP connection
+will be released back into the pool without manual intervention.
+
+However, when dealing with large responses it's often better to stream the response
+content using ``preload_content=False``. Setting ``preload_content`` to ``False`` means
+that urllib3 will only read from the socket when data is requested.
+
+.. note:: When using ``preload_content=False``, you need to manually release
+    the HTTP connection back to the connection pool so that it can be re-used.
+    To ensure the HTTP connection is in a valid state before being re-used
+    all data should be read off the wire.
+
+    You can call the  :meth:`~response.HTTPResponse.drain_conn` to throw away
+    unread data still on the wire. This call isn't necessary if data has already
+    been completely read from the response.
+
+    After all data is read you can call :meth:`~response.HTTPResponse.release_conn`
+    to release the connection into the pool.
+
+    You can call the :meth:`~response.HTTPResponse.close` to close the connection,
+    but this call doesn’t return the connection to the pool, throws away the unread
+    data on the wire, and leaves the connection in an undefined protocol state.
+    This is desirable if you prefer not reading data from the socket to re-using the
+    HTTP connection.
+
+:meth:`~response.HTTPResponse.stream` lets you iterate over chunks of the response content.
+
+    >>> import urllib3
+    >>> http = urllib3.PoolManager()
+    >>> r = http.request(
+    ...     'GET',
+    ...     'http://httpbin.org/bytes/1024',
+    ...     preload_content=False)
+    >>> for chunk in r.stream(32):
+    ...     print(chunk)
+    b'...'
+    b'...'
+    ...
+    >>> r.release_conn()
+
+However, you can also treat the :class:`~response.HTTPResponse` instance as
+a file-like object. This allows you to do buffering::
+
+    >>> r = http.request(
+    ...     'GET',
+    ...     'http://httpbin.org/bytes/1024',
+    ...     preload_content=False)
+    >>> r.read(4)
+    b'\x88\x1f\x8b\xe5'
+
+Calls to :meth:`~response.HTTPResponse.read()` will block until more response
+data is available.
+
+    >>> import io
+    >>> reader = io.BufferedReader(r, 8)
+    >>> reader.read(4)
+    >>> r.release_conn()
+
+You can use this file-like object to do things like decode the content using
+:mod:`codecs`::
+
+    >>> import codecs
+    >>> reader = codecs.getreader('utf-8')
+    >>> r = http.request(
+    ...     'GET',
+    ...     'http://httpbin.org/ip',
+    ...     preload_content=False)
+    >>> json.load(reader(r))
+    {'origin': '127.0.0.1'}
+    >>> r.release_conn()
+
+.. _proxies:
+
+Proxies
+-------
+
+You can use :class:`~poolmanager.ProxyManager` to tunnel requests through an
+HTTP proxy::
+
+    >>> import urllib3
+    >>> proxy = urllib3.ProxyManager('http://localhost:3128/')
+    >>> proxy.request('GET', 'http://google.com/')
+
+The usage of :class:`~poolmanager.ProxyManager` is the same as
+:class:`~poolmanager.PoolManager`.
+
+You can connect to a proxy using HTTP, HTTPS or SOCKS. urllib3's behavior will
+be different depending on the type of proxy you selected and the destination
+you're contacting.
+
+HTTP and HTTPS Proxies
+~~~~~~~~~~~~~~~~~~~~~~
+
+Both HTTP/HTTPS proxies support HTTP and HTTPS destinations. The only
+difference between them is if you need to establish a TLS connection to the
+proxy first. You can specify which proxy you need to contact by specifying the
+proper proxy scheme. (i.e ``http://`` or ``https://``)
+
+urllib3's behavior will be different depending on your proxy and destination:
+
+* HTTP proxy + HTTP destination
+   Your request will be forwarded with the `absolute URI
+   <https://tools.ietf.org/html/rfc7230#section-5.3.2>`_.
+
+* HTTP proxy + HTTPS destination
+    A TCP tunnel will be established with a `HTTP
+    CONNECT <https://tools.ietf.org/html/rfc7231#section-4.3.6>`_. Afterward a
+    TLS connection will be established with the destination and your request
+    will be sent.
+
+* HTTPS proxy + HTTP destination
+    A TLS connection will be established to the proxy and later your request
+    will be forwarded with the `absolute URI
+    <https://tools.ietf.org/html/rfc7230#section-5.3.2>`_.
+
+* HTTPS proxy + HTTPS destination
+    A TLS-in-TLS tunnel will be established.  An initial TLS connection will be
+    established to the proxy, then an `HTTP CONNECT
+    <https://tools.ietf.org/html/rfc7231#section-4.3.6>`_ will be sent to
+    establish a TCP connection to the destination and finally a second TLS
+    connection will be established to the destination. You can customize the
+    :class:`ssl.SSLContext` used for the proxy TLS connection through the
+    ``proxy_ssl_context`` argument of the :class:`~poolmanager.ProxyManager`
+    class.
+
+For HTTPS proxies we also support forwarding your requests to HTTPS destinations with
+an `absolute URI <https://tools.ietf.org/html/rfc7230#section-5.3.2>`_ if the
+``use_forwarding_for_https`` argument is set to ``True``. We strongly recommend you
+**only use this option with trusted or corporate proxies** as the proxy will have
+full visibility of your requests.
+
+.. _https_proxy_error_http_proxy:
+
+Your proxy appears to only use HTTP and not HTTPS
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If you're receiving the :class:`~urllib3.exceptions.ProxyError` and it mentions
+your proxy only speaks HTTP and not HTTPS here's what to do to solve your issue:
+
+If you're using ``urllib3`` directly, make sure the URL you're passing into :class:`urllib3.ProxyManager`
+starts with ``http://`` instead of ``https://``:
+
+.. code-block:: python
+
+     # Do this:
+     http = urllib3.ProxyManager("http://...")
+
+     # Not this:
+     http = urllib3.ProxyManager("https://...")
+
+If instead you're using ``urllib3`` through another library like Requests
+there are multiple ways your proxy could be mis-configured. You need to figure out
+where the configuration isn't correct and make the fix there. Some common places
+to look are environment variables like ``HTTP_PROXY``, ``HTTPS_PROXY``, and ``ALL_PROXY``.
+
+Ensure that the values for all of these environment variables starts with ``http://``
+and not ``https://``:
+
+.. code-block:: bash
+
+     # Check your existing environment variables in bash
+     $ env | grep "_PROXY"
+     HTTP_PROXY=http://127.0.0.1:8888
+     HTTPS_PROXY=https://127.0.0.1:8888  # <--- This setting is the problem!
+
+     # Make the fix in your current session and test your script
+     $ export HTTPS_PROXY="http://127.0.0.1:8888"
+     $ python test-proxy.py  # This should now pass.
+
+     # Persist your change in your shell 'profile' (~/.bashrc, ~/.profile, ~/.bash_profile, etc)
+     # You may need to logout and log back in to ensure this works across all programs.
+     $ vim ~/.bashrc
+
+If you're on Windows or macOS your proxy may be getting set at a system level.
+To check this first ensure that the above environment variables aren't set
+then run the following:
+
+.. code-block:: bash
+
+    $ python -c 'import urllib.request; print(urllib.request.getproxies())'
+
+If the output of the above command isn't empty and looks like this:
+
+.. code-block:: python
+
+    {
+      "http": "http://127.0.0.1:8888",
+      "https": "https://127.0.0.1:8888"  # <--- This setting is the problem!
+    }
+
+Search how to configure proxies on your operating system and change the ``https://...`` URL into ``http://``.
+After you make the change the return value of ``urllib.request.getproxies()`` should be:
+
+.. code-block:: python
+
+    {  # Everything is good here! :)
+      "http": "http://127.0.0.1:8888",
+      "https": "http://127.0.0.1:8888"
+    }
+
+If you still can't figure out how to configure your proxy after all these steps
+please `join our community Discord <https://discord.gg/urllib3>`_ and we'll try to help you with your issue.
+
+SOCKS Proxies
+~~~~~~~~~~~~~
+
+
+For SOCKS, you can use :class:`~contrib.socks.SOCKSProxyManager` to connect to
+SOCKS4 or SOCKS5 proxies. In order to use SOCKS proxies you will need to
+install `PySocks <https://pypi.org/project/PySocks/>`_ or install urllib3 with
+the ``socks`` extra::
+
+     python -m pip install urllib3[socks]
+
+Once PySocks is installed, you can use
+:class:`~contrib.socks.SOCKSProxyManager`::
+
+    >>> from urllib3.contrib.socks import SOCKSProxyManager
+    >>> proxy = SOCKSProxyManager('socks5h://localhost:8889/')
+    >>> proxy.request('GET', 'http://google.com/')
+
+.. note::
+      It is recommended to use ``socks5h://`` or ``socks4a://`` schemes in
+      your ``proxy_url`` to ensure that DNS resolution is done from the remote
+      server instead of client-side when connecting to a domain name.
+
+.. _ssl_custom:
+.. _custom_ssl_certificates:
+
+Custom TLS Certificates
+-----------------------
+
+Instead of using `certifi <https://certifi.io/>`_ you can provide your
+own certificate authority bundle. This is useful for cases where you've
+generated your own certificates or when you're using a private certificate
+authority. Just provide the full path to the certificate bundle when creating a
+:class:`~poolmanager.PoolManager`::
+
+    >>> import urllib3
+    >>> http = urllib3.PoolManager(
+    ...     cert_reqs='CERT_REQUIRED',
+    ...     ca_certs='/path/to/your/certificate_bundle')
+
+When you specify your own certificate bundle only requests that can be
+verified with that bundle will succeed. It's recommended to use a separate
+:class:`~poolmanager.PoolManager` to make requests to URLs that do not need
+the custom certificate.
+
+.. _sni_custom:
+
+Custom SNI Hostname
+-------------------
+
+If you want to create a connection to a host over HTTPS which uses SNI, there
+are two places where the hostname is expected. It must be included in the Host
+header sent, so that the server will know which host is being requested. The
+hostname should also match the certificate served by the server, which is
+checked by urllib3.
+
+Normally, urllib3 takes care of setting and checking these values for you when
+you connect to a host by name. However, it's sometimes useful to set a
+connection's expected Host header and certificate hostname (subject),
+especially when you are connecting without using name resolution. For example,
+you could connect to a server by IP using HTTPS like so::
+
+    >>> import urllib3
+    >>> pool = urllib3.HTTPSConnectionPool(
+    ...     "10.0.0.10",
+    ...     assert_hostname="example.org",
+    ...     server_hostname="example.org"
+    ... )
+    >>> pool.urlopen(
+    ...     "GET",
+    ...     "/",
+    ...     headers={"Host": "example.org"},
+    ...     assert_same_host=False
+    ... )
+
+
+Note that when you use a connection in this way, you must specify
+``assert_same_host=False``.
+
+This is useful when DNS resolution for ``example.org`` does not match the
+address that you would like to use. The IP may be for a private interface, or
+you may want to use a specific host under round-robin DNS.
+
+
+.. _ssl_client:
+
+Client Certificates
+-------------------
+
+You can also specify a client certificate. This is useful when both the server
+and the client need to verify each other's identity. Typically these
+certificates are issued from the same authority. To use a client certificate,
+provide the full path when creating a :class:`~poolmanager.PoolManager`::
+
+    >>> http = urllib3.PoolManager(
+    ...     cert_file='/path/to/your/client_cert.pem',
+    ...     cert_reqs='CERT_REQUIRED',
+    ...     ca_certs='/path/to/your/certificate_bundle')
+
+If you have an encrypted client certificate private key you can use
+the ``key_password`` parameter to specify a password to decrypt the key. ::
+
+    >>> http = urllib3.PoolManager(
+    ...     cert_file='/path/to/your/client_cert.pem',
+    ...     cert_reqs='CERT_REQUIRED',
+    ...     key_file='/path/to/your/client.key',
+    ...     key_password='keyfile_password')
+
+If your key isn't encrypted the ``key_password`` parameter isn't required.
+
+.. _ssl_mac:
+.. _certificate_validation_and_mac_os_x:
+
+Certificate Validation and macOS
+--------------------------------
+
+Apple-provided Python and OpenSSL libraries contain a patches that make them
+automatically check the system keychain's certificates. This can be
+surprising if you specify custom certificates and see requests unexpectedly
+succeed. For example, if you are specifying your own certificate for validation
+and the server presents a different certificate you would expect the connection
+to fail. However, if that server presents a certificate that is in the system
+keychain then the connection will succeed.
+
+`This article <https://hynek.me/articles/apple-openssl-verification-surprises/>`_
+has more in-depth analysis and explanation.
+
+.. _ssl_warnings:
+
+TLS Warnings
+------------
+
+urllib3 will issue several different warnings based on the level of certificate
+verification support. These warnings indicate particular situations and can
+be resolved in different ways.
+
+* :class:`~exceptions.InsecureRequestWarning`
+    This happens when a request is made to an HTTPS URL without certificate
+    verification enabled. Follow the :ref:`certificate verification <ssl>`
+    guide to resolve this warning.
+* :class:`~exceptions.InsecurePlatformWarning`
+    This happens on Python 2 platforms that have an outdated :mod:`ssl` module.
+    These older :mod:`ssl` modules can cause some insecure requests to succeed
+    where they should fail and secure requests to fail where they should
+    succeed. Follow the :ref:`pyOpenSSL <ssl_py2>` guide to resolve this
+    warning.
+
+.. _sni_warning:
+
+* :class:`~exceptions.SNIMissingWarning`
+    This happens on Python 2 versions older than 2.7.9. These older versions
+    lack `SNI <https://en.wikipedia.org/wiki/Server_Name_Indication>`_ support.
+    This can cause servers to present a certificate that the client thinks is
+    invalid. Follow the :ref:`pyOpenSSL <ssl_py2>` guide to resolve this
+    warning.
+
+.. _disable_ssl_warnings:
+
+Making unverified HTTPS requests is **strongly** discouraged, however, if you
+understand the risks and wish to disable these warnings, you can use :func:`~urllib3.disable_warnings`:
+
+.. code-block:: pycon
+
+    >>> import urllib3
+    >>> urllib3.disable_warnings()
+
+Alternatively you can capture the warnings with the standard :mod:`logging` module:
+
+.. code-block:: pycon
+
+    >>> logging.captureWarnings(True)
+
+Finally, you can suppress the warnings at the interpreter level by setting the
+``PYTHONWARNINGS`` environment variable or by using the
+`-W flag <https://docs.python.org/3/using/cmdline.html#cmdoption-w>`_.
+
+Google App Engine
+-----------------
+
+urllib3 supports `Google App Engine <https://cloud.google.com/appengine>`_ with
+some caveats.
+
+If you're using the `Flexible environment
+<https://cloud.google.com/appengine/docs/flexible/>`_, you do not have to do
+any configuration- urllib3 will just work. However, if you're using the
+`Standard environment <https://cloud.google.com/appengine/docs/python/>`_ then
+you either have to use :mod:`urllib3.contrib.appengine`'s
+:class:`~urllib3.contrib.appengine.AppEngineManager` or use the `Sockets API
+<https://cloud.google.com/appengine/docs/python/sockets/>`_
+
+To use :class:`~urllib3.contrib.appengine.AppEngineManager`:
+
+.. code-block:: pycon
+
+    >>> from urllib3.contrib.appengine import AppEngineManager
+    >>> http = AppEngineManager()
+    >>> http.request('GET', 'https://google.com/')
+
+To use the Sockets API, add the following to your app.yaml and use
+:class:`~urllib3.poolmanager.PoolManager` as usual:
+
+.. code-block:: yaml
+
+    env_variables:
+        GAE_USE_SOCKETS_HTTPLIB : 'true'
+
+For more details on the limitations and gotchas, see
+:mod:`urllib3.contrib.appengine`.
+
+Brotli Encoding
+---------------
+
+Brotli is a compression algorithm created by Google with better compression
+than gzip and deflate and is supported by urllib3 if the
+`Brotli <https://pypi.org/Brotli>`_ package or
+`brotlicffi <https://github.com/python-hyper/brotlicffi>`_ package is installed.
+You may also request the package be installed via the ``urllib3[brotli]`` extra:
+
+.. code-block:: bash
+
+    $ python -m pip install urllib3[brotli]
+
+Here's an example using brotli encoding via the ``Accept-Encoding`` header:
+
+.. code-block:: pycon
+
+    >>> from urllib3 import PoolManager
+    >>> http = PoolManager()
+    >>> http.request('GET', 'https://www.google.com/', headers={'Accept-Encoding': 'br'})
+
+Decrypting Captured TLS Sessions with Wireshark
+-----------------------------------------------
+Python 3.8 and higher support logging of TLS pre-master secrets.
+With these secrets tools like `Wireshark <https://wireshark.org>`_ can decrypt captured
+network traffic.
+
+To enable this simply define environment variable `SSLKEYLOGFILE`:
+
+.. code-block:: bash
+
+    export SSLKEYLOGFILE=/path/to/keylogfile.txt
+
+Then configure the key logfile in `Wireshark <https://wireshark.org>`_, see
+`Wireshark TLS Decryption <https://wiki.wireshark.org/TLS#TLS_Decryption>`_ for instructions.

+ 90 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/conf.py

@@ -0,0 +1,90 @@
+# -*- coding: utf-8 -*-
+
+import os
+import sys
+from datetime import date
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+
+root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
+sys.path.insert(0, root_path)
+
+# Mock some expensive/platform-specific modules so build will work.
+# (https://read-the-docs.readthedocs.io/en/latest/faq.html#\
+#  i-get-import-errors-on-libraries-that-depend-on-c-modules)
+import mock
+
+
+class MockModule(mock.Mock):
+    @classmethod
+    def __getattr__(cls, name):
+        return MockModule()
+
+
+MOCK_MODULES = ("ntlm",)
+
+sys.modules.update((mod_name, MockModule()) for mod_name in MOCK_MODULES)
+
+
+import urllib3
+
+# -- General configuration -----------------------------------------------------
+
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = [
+    "sphinx.ext.autodoc",
+    "sphinx.ext.doctest",
+    "sphinx.ext.intersphinx",
+]
+
+# Test code blocks only when explicitly specified
+doctest_test_doctest_blocks = ""
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ["_templates"]
+
+# The suffix of source filenames.
+source_suffix = ".rst"
+
+# The master toctree document.
+master_doc = "index"
+
+# General information about the project.
+project = "urllib3"
+copyright = "{year}, Andrey Petrov".format(year=date.today().year)
+
+# The short X.Y version.
+version = urllib3.__version__
+# The full version, including alpha/beta/rc tags.
+release = version
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ["_build"]
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = "friendly"
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+html_theme = "furo"
+html_favicon = "images/favicon.png"
+
+html_static_path = ["_static"]
+html_theme_options = {
+    "announcement": """
+        <a style=\"text-decoration: none; color: white;\" 
+           href=\"https://github.com/sponsors/urllib3\">
+           <img src=\"/en/latest/_static/favicon.png\"/> Support urllib3 on GitHub Sponsors
+        </a>
+    """,
+    "sidebar_hide_name": True,
+    "light_logo": "banner.svg",
+    "dark_logo": "dark-logo.svg",
+}
+
+intersphinx_mapping = {"python": ("https://docs.python.org/3", None)}

+ 177 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/contributing.rst

@@ -0,0 +1,177 @@
+Contributing
+============
+
+urllib3 is a community-maintained project and we happily accept contributions.
+
+If you wish to add a new feature or fix a bug:
+
+#. `Check for open issues <https://github.com/urllib3/urllib3/issues>`_ or open
+   a fresh issue to start a discussion around a feature idea or a bug. There is
+   a *Contributor Friendly* tag for issues that should be ideal for people who
+   are not very familiar with the codebase yet.
+#. Fork the `urllib3 repository on Github <https://github.com/urllib3/urllib3>`_
+   to start making your changes.
+#. Write a test which shows that the bug was fixed or that the feature works
+   as expected.
+#. Format your changes with black using command `$ nox -rs format` and lint your
+   changes using command `nox -rs lint`.
+#. Send a pull request and bug the maintainer until it gets merged and published.
+
+
+Setting up your development environment
+---------------------------------------
+
+In order to setup the development environment all that you need is
+`nox <https://nox.thea.codes/en/stable/index.html>`_ installed in your machine::
+
+  $ python -m pip install --user --upgrade nox
+
+
+Running the tests
+-----------------
+
+We use some external dependencies, multiple interpreters and code coverage
+analysis while running test suite. Our ``noxfile.py`` handles much of this for
+you::
+
+  $ nox --reuse-existing-virtualenvs --sessions test-2.7 test-3.7
+  [ Nox will create virtualenv if needed, install the specified dependencies, and run the commands in order.]
+  nox > Running session test-2.7
+  .......
+  .......
+  nox > Session test-2.7 was successful.
+  .......
+  .......
+  nox > Running session test-3.7
+  .......
+  .......
+  nox > Session test-3.7 was successful.
+
+There is also a nox command for running all of our tests and multiple python
+versions.::
+
+  $ nox --reuse-existing-virtualenvs --sessions test
+
+Note that code coverage less than 100% is regarded as a failing run. Some
+platform-specific tests are skipped unless run in that platform.  To make sure
+the code works in all of urllib3's supported platforms, you can run our ``nox``
+suite::
+
+  $ nox --reuse-existing-virtualenvs --sessions test
+  [ Nox will create virtualenv if needed, install the specified dependencies, and run the commands in order.]
+  .......
+  .......
+  nox > Session test-2.7 was successful.
+  nox > Session test-3.6 was successful.
+  nox > Session test-3.7 was successful.
+  nox > Session test-3.8 was successful.
+  nox > Session test-3.9 was successful.
+  nox > Session test-3.10 was successful.
+  nox > Session test-3.11 was successful.
+  nox > Session test-pypy was successful.
+
+Our test suite `runs continuously on GitHub Actions
+<https://github.com/urllib3/urllib3/actions>`_ with every pull request.
+
+To run specific tests or quickly re-run without nox recreating the env, do the following::
+
+  $ nox --reuse-existing-virtualenvs --sessions test-3.8 -- pyTestArgument1 pyTestArgument2 pyTestArgumentN
+  [ Nox will create virtualenv, install the specified dependencies, and run the commands in order.]
+  nox > Running session test-3.8
+  nox > Re-using existing virtual environment at .nox/test-3-8.
+  .......
+  .......
+  nox > Session test-3.8 was successful.
+
+After the ``--`` indicator, any arguments will be passed to pytest.
+To specify an exact test case the following syntax also works:
+``test/dir/module_name.py::TestClassName::test_method_name``
+(eg.: ``test/with_dummyserver/test_https.py::TestHTTPS::test_simple``).
+The following argument is another valid example to pass to pytest: ``-k test_methode_name``.
+These are useful when developing new test cases and there is no point
+re-running the entire test suite every iteration. It is also possible to
+further parameterize pytest for local testing.
+
+For all valid arguments, check `the pytest documentation
+<https://docs.pytest.org/en/stable/usage.html#stopping-after-the-first-or-n-failures>`_.
+
+Getting paid for your contributions
+-----------------------------------
+
+urllib3 has a `pool of money hosted on Open Collective <https://opencollective.com/urllib3#category-BUDGET>`_
+which the team uses to pay contributors for their work. **That could be you, too!** If you complete all tasks in an issue
+that is marked with the `"💰 Bounty $X00" label <https://github.com/urllib3/urllib3/issues?q=is%3Aopen+is%3Aissue+label%3A%22%F0%9F%92%B0+Bounty+%24100%22%2C%22%F0%9F%92%B0+Bounty+%24200%22%2C%22%F0%9F%92%B0+Bounty+%24300%22%2C%22%F0%9F%92%B0+Bounty+%24400%22%2C%22%F0%9F%92%B0+Bounty+%24500%22+no%3Aassignee>`_ then you're eligible to be paid for your work.
+
+- Ensure that you're able to `receive funds from Open Collective for working on OSS <https://docs.opencollective.com/help/expenses-and-getting-paid/submitting-expenses>`_.
+  Consider your employment contract and taxes for possible restrictions.
+- If an issue is already assigned to someone on GitHub then it's likely they've
+  made substantial progress on the issue and will be given the bounty.
+  If you're interested in bounties you should look for issues which
+  aren't assigned to anyone.
+- **Don't "claim" issues or ask whether someone is already working on an issue.**
+  Instead, focus on researching and working on the tasks in the issue. Once you
+  have made considerable progress on the tasks in an issue we can assign your
+  account to the issue to ensure others don't start working on it in parallel.
+- If you've been assigned to an issue and haven't made progress or given an update
+  in over a week you will be unassigned from the issue to allow others a chance
+  at solving the issue.
+- The amount you will be paid for the completing an issue is shown in the label (either $100, $200, $300, etc).
+- If you have questions about how to create an invoice on Open Collective
+  `try reading their FAQ <https://docs.opencollective.com/help/expenses-and-getting-paid/expenses>`_.
+- If you have a proposal to work on urllib3 that's not listed in the issue tracker please open an issue
+  with your proposal and our team will discuss whether we'd pay for your work on your proposal.
+- If you have other questions get in contact with a maintainer in the `urllib3 Discord channel <https://discord.gg/urllib3>`_ or via email.
+- The list above isn't an exhaustive list of criteria or rules for how/when money is distributed.
+  **The final say on whether money will be distributed is up to maintainers.**
+
+This program is an experiment so if you have positive or negative feedback on the process you can contact the maintainers through one of the above channels. 
+
+Note that this program isn't a "bug bounty" program, we don't distribute funds to reporters of bugs or security vulnerabilities at this time.
+
+Contributing to documentation
+-----------------------------
+
+You can build the docs locally using ``nox``:
+
+.. code-block:: bash
+
+  $ nox -rs docs
+
+While writing documentation you should follow these guidelines:
+
+- Use the top-level ``urllib3.request()`` function for smaller code examples. For more involved examples use PoolManager, etc.
+- Use double quotes for all strings. (Output, Declaration etc.)
+- Use keyword arguments everywhere except for method and url. (ie ``http.request("GET", "https://example.com", headers={...})`` )
+- Use HTTPS in URLs everywhere unless HTTP is needed.
+- Rules for code examples and naming variables:
+
+  - ``PoolManager`` instances should be named ``http``. (ie ``http = urllib3.PoolManager(...)``)
+  - ``ProxyManager`` instances should be named ``proxy``.
+  - ``ConnectionPool`` instances should be named ``pool``.
+  - ``Connection`` instances should be named ``conn``.
+  - ``HTTPResponse`` instances should be named ``resp``.
+  -  Only use ``example.com`` or ``httpbin.org`` for example URLs
+
+- Comments within snippets should be useful, if what's being done is apparent
+  (such as parsing JSON, making a request) then it can be skipped for that section.
+- Comments should always go above a code section rather than below with the exception of print
+  statements where the comment containing the result goes below.
+- Imports should be their own section separated from the rest of the example with a line of whitespace.
+- Imports should minimized if possible. Use import urllib3 instead of from urllib3 import X. 
+- Sort imports similarly to isort, standard library first and third-party (like urllib3) come after.
+- No whitespace is required between the sections as normally would be in case of isort.
+- Add print statements along with a comment below them showing the output, potentially compressed.
+- This helps users using the copy-paste button immediately see the results from a script.
+
+Releases
+--------
+
+A release candidate can be created by any contributor.
+
+- Announce intent to release on Discord, see if anyone wants to include last minute
+  changes.
+- Update ``urllib3/_version.py`` with the proper version number
+- Commit the changes to a ``release-X.Y.Z`` branch.
+- Create a pull request and append ``&expand=1&template=release.md`` to the URL before
+  submitting in order to include our release checklist in the pull request description.
+- Follow the checklist!

+ 0 - 0
desktop/core/ext-py/urllib3-1.25.8/docs/images/demo-button.png → desktop/core/ext-py/urllib3-1.26.12/docs/images/demo-button.png


BIN
desktop/core/ext-py/urllib3-1.26.12/docs/images/favicon.png


+ 0 - 0
desktop/core/ext-py/urllib3-1.25.8/docs/images/learn-more-button.png → desktop/core/ext-py/urllib3-1.26.12/docs/images/learn-more-button.png


+ 0 - 0
desktop/core/ext-py/urllib3-1.25.8/docs/images/logo.png → desktop/core/ext-py/urllib3-1.26.12/docs/images/logo.png


+ 0 - 0
desktop/core/ext-py/urllib3-1.25.8/docs/images/logo.svg → desktop/core/ext-py/urllib3-1.26.12/docs/images/logo.svg


+ 45 - 17
desktop/core/ext-py/urllib3-1.25.8/docs/index.rst → desktop/core/ext-py/urllib3-1.26.12/docs/index.rst

@@ -3,29 +3,34 @@ urllib3
 
 .. toctree::
    :hidden:
-   :maxdepth: 2
+   :maxdepth: 3
 
    For Enterprise <https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=docs>
+   v2-roadmap
+   sponsors
    user-guide
    advanced-usage
    reference/index
    contributing
 
-urllib3 is a powerful, *sanity-friendly* HTTP client for Python. Much of the
-Python ecosystem :ref:`already uses <who-uses>` urllib3 and you should too.
+urllib3 is a powerful, *user-friendly* HTTP client for Python.
+:ref:`Much of the Python ecosystem already uses <who-uses>` urllib3 and you should too.
+
 urllib3 brings many critical features that are missing from the Python
 standard libraries:
 
 - Thread safety.
 - Connection pooling.
-- Client-side SSL/TLS verification.
+- Client-side TLS/SSL verification.
 - File uploads with multipart encoding.
 - Helpers for retrying requests and dealing with HTTP redirects.
-- Support for gzip and deflate encoding.
+- Support for gzip, deflate, and brotli encoding.
 - Proxy support for HTTP and SOCKS.
 - 100% test coverage.
 
-urllib3 is powerful and easy to use::
+urllib3 is powerful and easy to use:
+
+.. code-block:: python
 
     >>> import urllib3
     >>> http = urllib3.PoolManager()
@@ -38,29 +43,52 @@ urllib3 is powerful and easy to use::
 For Enterprise
 --------------
 
-`urllib3 is available as part of the Tidelift Subscription <https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=docs>`_
+.. |tideliftlogo| image:: https://nedbatchelder.com/pix/Tidelift_Logos_RGB_Tidelift_Shorthand_On-White_small.png
+   :width: 75
+   :alt: Tidelift
+
+.. list-table::
+   :widths: 10 100
+
+   * - |tideliftlogo|_
+     - Professional support for urllib3 is available as part of the `Tidelift
+       Subscription`_.  Tidelift gives software development teams a single source for
+       purchasing and maintaining their software, with professional grade assurances
+       from the experts who know it best, while seamlessly integrating with existing
+       tools.
 
-urllib3 and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use.
-If you want the flexibility of open source and the confidence of commercial-grade software, this is for you.
+.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=docs
+.. _tideliftlogo: https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=docs
 
 |learn-more|_ |request-a-demo|_
 
 .. |learn-more| image:: https://raw.githubusercontent.com/urllib3/urllib3/master/docs/images/learn-more-button.png
+   :width: 49%
+   :alt: Learn more about Tidelift Subscription
 .. _learn-more: https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=docs
+
 .. |request-a-demo| image:: https://raw.githubusercontent.com/urllib3/urllib3/master/docs/images/demo-button.png
+   :width: 49%
+   :alt: Request a Demo for the Tidelift Subscription
 .. _request-a-demo: https://tidelift.com/subscription/request-a-demo?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=docs
 
 Installing
 ----------
 
-urllib3 can be installed with `pip <https://pip.pypa.io>`_::
+urllib3 can be installed with `pip <https://pip.pypa.io>`_
+
+.. code-block:: bash
+
+  $ python -m pip install urllib3
 
-    $ pip install urllib3
+Alternatively, you can grab the latest source code from `GitHub <https://github.com/urllib3/urllib3>`_:
 
-Alternatively, you can grab the latest source code from `GitHub <https://github.com/urllib3/urllib3>`_::
+.. code-block:: bash
 
-    $ git clone git://github.com/urllib3/urllib3.git
-    $ python setup.py install
+  $ git clone https://github.com/urllib3/urllib3.git
+  $ cd urllib3
+  $ git checkout 1.26.x
+  $ pip install .
 
 Usage
 -----
@@ -75,9 +103,9 @@ The :doc:`reference/index` documentation provides API-level documentation.
 Who uses urllib3?
 -----------------
 
-* `Requests <http://python-requests.org/>`_
-* `Pip <https://pip.pypa.io>`_
-* & more!
+`urllib3 is one of the most downloaded packages on PyPI <https://pypistats.org/top>`_
+and is a dependency of many popular Python packages like `Requests <https://requests.readthedocs.io>`_,
+`Pip <https://pip.pypa.io>`_, and more!
 
 License
 -------

+ 0 - 0
desktop/core/ext-py/urllib3-1.25.8/docs/make.bat → desktop/core/ext-py/urllib3-1.26.12/docs/make.bat


+ 7 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/reference/contrib/appengine.rst

@@ -0,0 +1,7 @@
+Google App Engine
+=================
+
+.. automodule:: urllib3.contrib.appengine
+    :members:
+    :undoc-members:
+    :show-inheritance:

+ 13 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/reference/contrib/index.rst

@@ -0,0 +1,13 @@
+Third-Party Modules
+===================
+
+These modules implement various extra features, that may not be ready for
+prime time or that require optional third-party dependencies.
+
+.. toctree::
+
+   appengine
+   ntlmpool
+   pyopenssl
+   securetransport
+   socks

+ 7 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/reference/contrib/ntlmpool.rst

@@ -0,0 +1,7 @@
+NTLM Authentication
+===================
+
+.. automodule:: urllib3.contrib.ntlmpool
+    :members:
+    :undoc-members:
+    :show-inheritance:

+ 10 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/reference/contrib/pyopenssl.rst

@@ -0,0 +1,10 @@
+PyOpenSSL
+=========
+.. warning::
+    DEPRECATED: This module is deprecated and will be removed in a future 2.x release.
+    Read more in this `issue <https://github.com/urllib3/urllib3/issues/2680>`_.
+
+.. automodule:: urllib3.contrib.pyopenssl
+    :members:
+    :undoc-members:
+    :show-inheritance:

+ 28 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/reference/contrib/securetransport.rst

@@ -0,0 +1,28 @@
+macOS SecureTransport
+=====================
+
+`SecureTranport <https://developer.apple.com/documentation/security/secure_transport>`_
+support for urllib3 via ctypes.
+
+This makes platform-native TLS available to urllib3 users on macOS without the
+use of a compiler. This is an important feature because the Python Package
+Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL
+that ships with macOS is not capable of doing TLSv1.2. The only way to resolve
+this is to give macOS users an alternative solution to the problem, and that
+solution is to use SecureTransport.
+
+We use ctypes here because this solution must not require a compiler. That's
+because Pip is not allowed to require a compiler either.
+
+This code is a bastardised version of the code found in Will Bond's
+`oscrypto <https://github.com/wbond/oscrypto>`_ library. An enormous debt
+is owed to him for blazing this trail for us. For that reason, this code
+should be considered to be covered both by urllib3's license and by
+`oscrypto's <https://github.com/wbond/oscrypto/blob/master/LICENSE>`_.
+
+To use this module, simply import and inject it:
+
+.. code-block:: python
+
+    import urllib3.contrib.securetransport
+    urllib3.contrib.securetransport.inject_into_urllib3()

+ 7 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/reference/contrib/socks.rst

@@ -0,0 +1,7 @@
+SOCKS Proxies
+=============
+
+.. automodule:: urllib3.contrib.socks
+    :members:
+    :undoc-members:
+    :show-inheritance:

+ 14 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/reference/index.rst

@@ -0,0 +1,14 @@
+API Reference
+=============
+
+.. toctree::
+
+   urllib3.poolmanager
+   urllib3.connectionpool
+   urllib3.connection
+   urllib3.exceptions
+   urllib3.response
+   urllib3.fields
+   urllib3.request
+   urllib3.util
+   contrib/index

+ 11 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/reference/urllib3.connection.rst

@@ -0,0 +1,11 @@
+Connections
+===========
+
+.. autoclass:: urllib3.connection.HTTPConnection
+    :members:
+    :exclude-members: putrequest
+    :show-inheritance:
+
+.. autoclass:: urllib3.connection.HTTPSConnection
+    :members:
+    :show-inheritance:

+ 17 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/reference/urllib3.connectionpool.rst

@@ -0,0 +1,17 @@
+Connection Pools
+================
+
+.. autoclass:: urllib3.HTTPConnectionPool
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+.. autoclass:: urllib3.HTTPSConnectionPool
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+.. autoclass:: urllib3.connectionpool.ConnectionPool
+    :members:
+    :undoc-members:
+    :show-inheritance:

+ 7 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/reference/urllib3.exceptions.rst

@@ -0,0 +1,7 @@
+Exceptions
+==========
+
+.. automodule:: urllib3.exceptions
+    :members:
+    :undoc-members:
+    :show-inheritance:

+ 18 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/reference/urllib3.fields.rst

@@ -0,0 +1,18 @@
+Fields and Multipart Forms
+==========================
+
+Fields
+------
+
+.. automodule:: urllib3.fields
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+
+Multipart Forms
+---------------
+
+.. autofunction:: urllib3.encode_multipart_formdata
+.. autofunction:: urllib3.filepost.choose_boundary
+.. autofunction:: urllib3.filepost.iter_field_objects

+ 12 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/reference/urllib3.poolmanager.rst

@@ -0,0 +1,12 @@
+Pool Manager
+============
+
+.. autoclass:: urllib3.PoolManager
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+.. autoclass:: urllib3.ProxyManager
+    :members:
+    :undoc-members:
+    :show-inheritance:

+ 7 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/reference/urllib3.request.rst

@@ -0,0 +1,7 @@
+Request Methods
+===============
+
+.. automodule:: urllib3.request
+    :members:
+    :undoc-members:
+    :show-inheritance:

+ 22 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/reference/urllib3.response.rst

@@ -0,0 +1,22 @@
+Response and Decoders
+=====================
+
+Response
+--------
+
+.. autoclass:: urllib3.response.HTTPResponse
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+Decoders
+--------
+
+Decoder classes are used for transforming compressed HTTP bodies
+using the ``Content-Encoding`` into their uncompressed binary
+representation.
+
+.. autoclass:: urllib3.response.BrotliDecoder
+.. autoclass:: urllib3.response.DeflateDecoder
+.. autoclass:: urllib3.response.GzipDecoder
+.. autoclass:: urllib3.response.MultiDecoder

+ 17 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/reference/urllib3.util.rst

@@ -0,0 +1,17 @@
+Utilities
+=========
+
+Useful methods for working with :mod:`http.client`, completely decoupled from
+code specific to **urllib3**.
+
+At the very core, just like its predecessors, :mod:`urllib3` is built on top of
+:mod:`http.client` -- the lowest level HTTP library included in the Python
+standard library.
+
+To aid the limited functionality of the :mod:`http.client` module, :mod:`urllib3`
+provides various helper methods which are used with the higher level components
+but can also be used independently.
+
+.. automodule:: urllib3.util
+    :members:
+    :show-inheritance:

+ 2 - 2
desktop/core/ext-py/urllib3-1.25.8/docs/requirements.txt → desktop/core/ext-py/urllib3-1.26.12/docs/requirements.txt

@@ -1,4 +1,4 @@
 -r ../dev-requirements.txt
-sphinx
-alabaster
+sphinx>3.0.0
 requests>=2,<2.16
+furo

+ 78 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/sponsors.rst

@@ -0,0 +1,78 @@
+Sponsors and Supporters
+=======================
+
+Please consider sponsoring urllib3 development, especially if your company
+benefits from this library.
+
+Your contribution will go towards adding new features to urllib3 and making
+sure all functionality continues to meet our high quality standards.
+
+
+v2.0 Sponsor Perks
+------------------
+
+.. important::
+
+   `Get in contact <mailto:sethmichaellarson@gmail.com>`_ for additional
+   details on sponsorship and perks before making a contribution
+   through `GitHub Sponsors <https://github.com/sponsors/urllib3>`_ if you have questions.
+
+
+Silver v2.0 Sponsor Perks
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Your organization name and URL permanently added
+  to the **Sponsors and Grants** section below
+- Thank you within the v2.0 release announcement
+  and on Twitter from urllib3 maintainers
+
+➤ `Contribute to the "Silver v2.0 Sponsor" tier <https://opencollective.com/urllib3/contribute/silver-v2-sponsor-20442/checkout>`_
+on Open Collective.
+
+
+Gold v2.0 Sponsor Perks
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Organization logo and URL listed on top of the v2.0 Roadmap
+- Call with one or more urllib3 maintainer(s) to discuss
+  the v2.0 release and how it impacts your organization
+- Your organization will be thanked within the v2.0 release
+  announcement, within all blog posts and public updates related to v2.0
+  development, and multiple thank-you's on Twitter from
+  urllib3 maintainers throughout v2.0 development
+- All perks from the **Silver v2.0 Sponsors Perks** above
+
+➤ `Contribute to the "Gold v2.0 Sponsor" tier <https://opencollective.com/urllib3/contribute/gold-v2-sponsor-20443/checkout>`_
+on Open Collective.
+
+
+Sponsors and Grants
+-------------------
+
+A grant for contiguous full-time development has the biggest impact for
+progress. Periods of 3 to 10 days allow a contributor to tackle substantial
+complex issues which are otherwise left to linger until somebody can't afford
+to not fix them.
+
+Contact `@sethmlarson <https://github.com/sethmlarson>`_ or `@shazow <https://github.com/shazow>`_
+to arrange a grant for a core contributor.
+
+We also welcome sponsorship in the form of time. We greatly appreciate companies
+who encourage employees to contribute on an ongoing basis during their work hours.
+Let us know and we'll be glad to add you to our sponsors list.
+
+* `GitCoin Grants <https://gitcoin.co/grants>`_ (2019-2020), sponsored `@sethmlarson <https://github.com/sethmlarson>`_
+  and `@pquentin <https://github.com/pquentin>`_
+
+* `Abbott <https://abbott.com>`_ (2018-2019), sponsored `@sethmlarson <https://github.com/sethmlarson>`_
+
+* `Google Cloud Platform <https://cloud.google.com>`_ (2018-2019), sponsored `@theacodes <https://github.com/theacodes>`_
+
+* `GOVCERT.LU <https://govcert.lu>`_ (October 23, 2018), sponsored `@sethmlarson <https://github.com/sethmlarson>`_
+
+* `Akamai <https://akamai.com>`_ (2017-2018) sponsored `@haikuginger <https://github.com/haikuginger>`_
+
+* `Hewlett Packard Enterprise <https://hpe.com>`_ (2016-2017) sponsored
+  `@Lukasa <https://github.com/Lukasa>`_
+
+* `Stripe <https://stripe.com>`_ (June 23, 2014)

+ 177 - 76
desktop/core/ext-py/urllib3-1.25.8/docs/user-guide.rst → desktop/core/ext-py/urllib3-1.26.12/docs/user-guide.rst

@@ -3,20 +3,36 @@ User Guide
 
 .. currentmodule:: urllib3
 
-Making requests
+Installing
+----------
+
+urllib3 can be installed with `pip <https://pip.pypa.io>`_
+
+.. code-block:: bash
+
+  $ python -m pip install urllib3
+
+
+Making Requests
 ---------------
 
-First things first, import the urllib3 module::
+First things first, import the urllib3 module:
+
+.. code-block:: pycon
 
     >>> import urllib3
 
 You'll need a :class:`~poolmanager.PoolManager` instance to make requests.
 This object handles all of the details of connection pooling and thread safety
-so that you don't have to::
+so that you don't have to:
+
+.. code-block:: pycon
 
     >>> http = urllib3.PoolManager()
 
-To make a request use :meth:`~poolmanager.PoolManager.request`::
+To make a request use :meth:`~poolmanager.PoolManager.request`:
+
+.. code-block:: pycon
 
     >>> r = http.request('GET', 'http://httpbin.org/robots.txt')
     >>> r.data
@@ -26,24 +42,29 @@ To make a request use :meth:`~poolmanager.PoolManager.request`::
 :ref:`response_content` section explains how to handle various responses.
 
 You can use :meth:`~poolmanager.PoolManager.request` to make requests using any
-HTTP verb::
+HTTP verb:
+
+.. code-block:: pycon
 
     >>> r = http.request(
     ...     'POST',
     ...     'http://httpbin.org/post',
-    ...     fields={'hello': 'world'})
+    ...     fields={'hello': 'world'}
+    ... )
 
 The :ref:`request_data` section covers sending other kinds of requests data,
 including JSON, files, and binary data.
 
 .. _response_content:
 
-Response content
+Response Content
 ----------------
 
 The :class:`~response.HTTPResponse` object provides
 :attr:`~response.HTTPResponse.status`, :attr:`~response.HTTPResponse.data`, and
-:attr:`~response.HTTPResponse.header` attributes::
+:attr:`~response.HTTPResponse.headers` attributes:
+
+.. code-block:: pycon
 
     >>> r = http.request('GET', 'http://httpbin.org/ip')
     >>> r.status
@@ -53,22 +74,26 @@ The :class:`~response.HTTPResponse` object provides
     >>> r.headers
     HTTPHeaderDict({'Content-Length': '33', ...})
 
-JSON content
+JSON Content
 ~~~~~~~~~~~~
 
 JSON content can be loaded by decoding and deserializing the
-:attr:`~response.HTTPResponse.data` attribute of the request::
+:attr:`~response.HTTPResponse.data` attribute of the request:
+
+.. code-block:: pycon
 
     >>> import json
     >>> r = http.request('GET', 'http://httpbin.org/ip')
     >>> json.loads(r.data.decode('utf-8'))
     {'origin': '127.0.0.1'}
 
-Binary content
+Binary Content
 ~~~~~~~~~~~~~~
 
 The :attr:`~response.HTTPResponse.data` attribute of the response is always set
-to a byte string representing the response content::
+to a byte string representing the response content:
+
+.. code-block:: pycon
 
     >>> r = http.request('GET', 'http://httpbin.org/bytes/8')
     >>> r.data
@@ -77,13 +102,15 @@ to a byte string representing the response content::
 .. note:: For larger responses, it's sometimes better to :ref:`stream <stream>`
     the response.
 
-Using io Wrappers with Response content
+Using io Wrappers with Response Content
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Sometimes you want to use :class:`io.TextIOWrapper` or similar objects like a CSV reader
 directly with :class:`~response.HTTPResponse` data. Making these two interfaces play nice
 together requires using the :attr:`~response.HTTPResponse.auto_close` attribute by setting it
-to ``False``. By default HTTP responses are closed after reading all bytes, this disables that behavior::
+to ``False``. By default HTTP responses are closed after reading all bytes, this disables that behavior:
+
+.. code-block:: pycon
 
     >>> import io
     >>> r = http.request('GET', 'https://example.com', preload_content=False)
@@ -93,39 +120,47 @@ to ``False``. By default HTTP responses are closed after reading all bytes, this
 
 .. _request_data:
 
-Request data
+Request Data
 ------------
 
 Headers
 ~~~~~~~
 
-You can specify headers as a dictionary in the ``headers`` argument in :meth:`~poolmanager.PoolManager.request`::
+You can specify headers as a dictionary in the ``headers`` argument in :meth:`~poolmanager.PoolManager.request`:
+
+.. code-block:: pycon
 
     >>> r = http.request(
     ...     'GET',
     ...     'http://httpbin.org/headers',
     ...     headers={
     ...         'X-Something': 'value'
-    ...     })
+    ...     }
+    ... )
     >>> json.loads(r.data.decode('utf-8'))['headers']
     {'X-Something': 'value', ...}
 
-Query parameters
+Query Parameters
 ~~~~~~~~~~~~~~~~
 
 For ``GET``, ``HEAD``, and ``DELETE`` requests, you can simply pass the
 arguments as a dictionary in the ``fields`` argument to
-:meth:`~poolmanager.PoolManager.request`::
+:meth:`~poolmanager.PoolManager.request`:
+
+.. code-block:: pycon
 
     >>> r = http.request(
     ...     'GET',
     ...     'http://httpbin.org/get',
-    ...     fields={'arg': 'value'})
+    ...     fields={'arg': 'value'}
+    ... )
     >>> json.loads(r.data.decode('utf-8'))['args']
     {'arg': 'value'}
 
 For ``POST`` and ``PUT`` requests, you need to manually encode query parameters
-in the URL::
+in the URL:
+
+.. code-block:: pycon
 
     >>> from urllib.parse import urlencode
     >>> encoded_args = urlencode({'arg': 'value'})
@@ -137,17 +172,20 @@ in the URL::
 
 .. _form_data:
 
-Form data
+Form Data
 ~~~~~~~~~
 
 For ``PUT`` and ``POST`` requests, urllib3 will automatically form-encode the
 dictionary in the ``fields`` argument provided to
-:meth:`~poolmanager.PoolManager.request`::
+:meth:`~poolmanager.PoolManager.request`:
+
+.. code-block:: pycon
 
     >>> r = http.request(
     ...     'POST',
     ...     'http://httpbin.org/post',
-    ...     fields={'field': 'value'})
+    ...     fields={'field': 'value'}
+    ... )
     >>> json.loads(r.data.decode('utf-8'))['form']
     {'field': 'value'}
 
@@ -156,7 +194,9 @@ JSON
 
 You can send a JSON request by specifying the encoded data as the ``body``
 argument and setting the ``Content-Type`` header when calling
-:meth:`~poolmanager.PoolManager.request`::
+:meth:`~poolmanager.PoolManager.request`:
+
+.. code-block:: pycon
 
     >>> import json
     >>> data = {'attribute': 'value'}
@@ -165,16 +205,19 @@ argument and setting the ``Content-Type`` header when calling
     ...     'POST',
     ...     'http://httpbin.org/post',
     ...     body=encoded_data,
-    ...     headers={'Content-Type': 'application/json'})
+    ...     headers={'Content-Type': 'application/json'}
+    ... )
     >>> json.loads(r.data.decode('utf-8'))['json']
     {'attribute': 'value'}
 
-Files & binary data
+Files & Binary Data
 ~~~~~~~~~~~~~~~~~~~
 
 For uploading files using ``multipart/form-data`` encoding you can use the same
 approach as :ref:`form_data` and specify the file field as a tuple of
-``(file_name, file_data)``::
+``(file_name, file_data)``:
+
+.. code-block:: pycon
 
     >>> with open('example.txt') as fp:
     ...     file_data = fp.read()
@@ -183,23 +226,29 @@ approach as :ref:`form_data` and specify the file field as a tuple of
     ...     'http://httpbin.org/post',
     ...     fields={
     ...         'filefield': ('example.txt', file_data),
-    ...     })
+    ...     }
+    ... )
     >>> json.loads(r.data.decode('utf-8'))['files']
     {'filefield': '...'}
 
 While specifying the filename is not strictly required, it's recommended in
 order to match browser behavior. You can also pass a third item in the tuple
-to specify the file's MIME type explicitly::
+to specify the file's MIME type explicitly:
+
+.. code-block:: pycon
 
     >>> r = http.request(
     ...     'POST',
     ...     'http://httpbin.org/post',
     ...     fields={
     ...         'filefield': ('example.txt', file_data, 'text/plain'),
-    ...     })
+    ...     }
+    ... )
 
 For sending raw binary data simply specify the ``body`` argument. It's also
-recommended to set the ``Content-Type`` header::
+recommended to set the ``Content-Type`` header:
+
+.. code-block:: pycon
 
     >>> with open('example.jpg', 'rb') as fp:
     ...     binary_data = fp.read()
@@ -207,45 +256,55 @@ recommended to set the ``Content-Type`` header::
     ...     'POST',
     ...     'http://httpbin.org/post',
     ...     body=binary_data,
-    ...     headers={'Content-Type': 'image/jpeg'})
+    ...     headers={'Content-Type': 'image/jpeg'}
+    ... )
     >>> json.loads(r.data.decode('utf-8'))['data']
     b'...'
 
 .. _ssl:
 
-Certificate verification
+Certificate Verification
 ------------------------
 
- .. note:: *New in version 1.25*
+.. note:: *New in version 1.25:*
 
     HTTPS connections are now verified by default (``cert_reqs = 'CERT_REQUIRED'``).
 
-While you can disable certification verification, it is highly recommend to leave it on.
+While you can disable certification verification by setting ``cert_reqs = 'CERT_NONE'``, it is highly recommend to leave it on.
 
 Unless otherwise specified urllib3 will try to load the default system certificate stores.
 The most reliable cross-platform method is to use the `certifi <https://certifi.io/>`_
-package which provides Mozilla's root certificate bundle::
+package which provides Mozilla's root certificate bundle:
+
+.. code-block:: bash
 
-    pip install certifi
+    $ python -m pip install certifi
 
 You can also install certifi along with urllib3 by using the ``secure``
-extra::
+extra:
+
+.. code-block:: bash
 
-    pip install urllib3[secure]
+    $ python -m pip install urllib3[secure]
 
 .. warning:: If you're using Python 2 you may need additional packages. See the :ref:`section below <ssl_py2>` for more details.
 
 Once you have certificates, you can create a :class:`~poolmanager.PoolManager`
-that verifies certificates when making requests::
+that verifies certificates when making requests:
+
+.. code-block:: pycon
 
     >>> import certifi
     >>> import urllib3
     >>> http = urllib3.PoolManager(
     ...     cert_reqs='CERT_REQUIRED',
-    ...     ca_certs=certifi.where())
+    ...     ca_certs=certifi.where()
+    ... )
 
 The :class:`~poolmanager.PoolManager` will automatically handle certificate
-verification and will raise :class:`~exceptions.SSLError` if verification fails::
+verification and will raise :class:`~exceptions.SSLError` if verification fails:
+
+.. code-block:: pycon
 
     >>> http.request('GET', 'https://google.com')
     (No exception)
@@ -260,7 +319,7 @@ verification and will raise :class:`~exceptions.SSLError` if verification fails:
 
 .. _ssl_py2:
 
-Certificate verification in Python 2
+Certificate Verification in Python 2
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Older versions of Python 2 are built with an :mod:`ssl` module that lacks
@@ -268,9 +327,11 @@ Older versions of Python 2 are built with an :mod:`ssl` module that lacks
 `pyOpenSSL <https://pyopenssl.readthedocs.io/en/latest/>`_.
 
 If you install urllib3 with the ``secure`` extra, all required packages for
-certificate verification on Python 2 will be installed::
+certificate verification on Python 2 will be installed:
 
-    pip install urllib3[secure]
+.. code-block:: bash
+
+    $ python -m pip install urllib3[secure]
 
 If you want to install the packages manually, you will need ``pyOpenSSL``,
 ``cryptography``, ``idna``, and ``certifi``.
@@ -281,19 +342,24 @@ If you want to install the packages manually, you will need ``pyOpenSSL``,
     <https://cryptography.io/en/latest/installation/#building-cryptography-on-linux>`_
     for the list of packages required.
 
-Once installed, you can tell urllib3 to use pyOpenSSL by using :mod:`urllib3.contrib.pyopenssl`::
+Once installed, you can tell urllib3 to use pyOpenSSL by using :mod:`urllib3.contrib.pyopenssl`:
+
+.. code-block:: pycon
 
     >>> import urllib3.contrib.pyopenssl
     >>> urllib3.contrib.pyopenssl.inject_into_urllib3()
 
 Finally, you can create a :class:`~poolmanager.PoolManager` that verifies
-certificates when performing requests::
+certificates when performing requests:
+
+.. code-block:: pycon
 
     >>> import certifi
     >>> import urllib3
     >>> http = urllib3.PoolManager(
     ...     cert_reqs='CERT_REQUIRED',
-    ...     ca_certs=certifi.where())
+    ...     ca_certs=certifi.where()
+    ... )
 
 If you do not wish to use pyOpenSSL, you can simply omit the call to
 :func:`urllib3.contrib.pyopenssl.inject_into_urllib3`. urllib3 will fall back
@@ -303,56 +369,69 @@ to the standard-library :mod:`ssl` module. You may experience
 .. warning:: If you do not use pyOpenSSL, Python must be compiled with ssl
     support for certificate verification to work. It is uncommon, but it is
     possible to compile Python without SSL support. See this
-    `Stackoverflow thread <https://stackoverflow.com/questions/5128845/importerror-no-module-named-ssl>`_
+    `StackOverflow thread <https://stackoverflow.com/questions/5128845/importerror-no-module-named-ssl>`_
     for more details.
 
     If you are on Google App Engine, you must explicitly enable SSL
-    support in your ``app.yaml``::
+    support in your ``app.yaml``:
+
+    .. code-block:: yaml
 
         libraries:
         - name: ssl
           version: latest
 
-Using timeouts
+Using Timeouts
 --------------
 
 Timeouts allow you to control how long (in seconds) requests are allowed to run
 before being aborted. In simple cases, you can specify a timeout as a ``float``
-to :meth:`~poolmanager.PoolManager.request`::
+to :meth:`~poolmanager.PoolManager.request`:
+
+.. code-block:: pycon
 
     >>> http.request(
-    ...     'GET', 'http://httpbin.org/delay/3', timeout=4.0)
+    ...     'GET', 'http://httpbin.org/delay/3', timeout=4.0
+    ... )
     <urllib3.response.HTTPResponse>
     >>> http.request(
-    ...     'GET', 'http://httpbin.org/delay/3', timeout=2.5)
+    ...     'GET', 'http://httpbin.org/delay/3', timeout=2.5
+    ... )
     MaxRetryError caused by ReadTimeoutError
 
 For more granular control you can use a :class:`~util.timeout.Timeout`
-instance which lets you specify separate connect and read timeouts::
+instance which lets you specify separate connect and read timeouts:
+
+.. code-block:: pycon
 
     >>> http.request(
     ...     'GET',
     ...     'http://httpbin.org/delay/3',
-    ...     timeout=urllib3.Timeout(connect=1.0))
+    ...     timeout=urllib3.Timeout(connect=1.0)
+    ... )
     <urllib3.response.HTTPResponse>
     >>> http.request(
     ...     'GET',
     ...     'http://httpbin.org/delay/3',
-    ...     timeout=urllib3.Timeout(connect=1.0, read=2.0))
+    ...     timeout=urllib3.Timeout(connect=1.0, read=2.0)
+    ... )
     MaxRetryError caused by ReadTimeoutError
 
 
 If you want all requests to be subject to the same timeout, you can specify
-the timeout at the :class:`~urllib3.poolmanager.PoolManager` level::
+the timeout at the :class:`~urllib3.poolmanager.PoolManager` level:
+
+.. code-block:: pycon
 
     >>> http = urllib3.PoolManager(timeout=3.0)
     >>> http = urllib3.PoolManager(
-    ...     timeout=urllib3.Timeout(connect=1.0, read=2.0))
+    ...     timeout=urllib3.Timeout(connect=1.0, read=2.0)
+    ... )
 
 You still override this pool-level timeout by specifying ``timeout`` to
 :meth:`~poolmanager.PoolManager.request`.
 
-Retrying requests
+Retrying Requests
 -----------------
 
 urllib3 can automatically retry idempotent requests. This same mechanism also
@@ -360,55 +439,73 @@ handles redirects. You can control the retries using the ``retries`` parameter
 to :meth:`~poolmanager.PoolManager.request`. By default, urllib3 will retry
 requests 3 times and follow up to 3 redirects.
 
-To change the number of retries just specify an integer::
+To change the number of retries just specify an integer:
+
+.. code-block:: pycon
 
     >>> http.requests('GET', 'http://httpbin.org/ip', retries=10)
 
-To disable all retry and redirect logic specify ``retries=False``::
+To disable all retry and redirect logic specify ``retries=False``:
+
+.. code-block:: pycon
 
     >>> http.request(
-    ...     'GET', 'http://nxdomain.example.com', retries=False)
+    ...     'GET', 'http://nxdomain.example.com', retries=False
+    ... )
     NewConnectionError
     >>> r = http.request(
-    ...     'GET', 'http://httpbin.org/redirect/1', retries=False)
+    ...     'GET', 'http://httpbin.org/redirect/1', retries=False
+    ... )
     >>> r.status
     302
 
-To disable redirects but keep the retrying logic, specify ``redirect=False``::
+To disable redirects but keep the retrying logic, specify ``redirect=False``:
+
+.. code-block:: pycon
 
     >>> r = http.request(
-    ...     'GET', 'http://httpbin.org/redirect/1', redirect=False)
+    ...     'GET', 'http://httpbin.org/redirect/1', redirect=False
+    ... )
     >>> r.status
     302
 
 For more granular control you can use a :class:`~util.retry.Retry` instance.
 This class allows you far greater control of how requests are retried.
 
-For example, to do a total of 3 retries, but limit to only 2 redirects::
+For example, to do a total of 3 retries, but limit to only 2 redirects:
+
+.. code-block:: pycon
 
     >>> http.request(
     ...     'GET',
     ...     'http://httpbin.org/redirect/3',
-    ...     retries=urllib3.Retry(3, redirect=2))
+    ...     retries=urllib3.Retry(3, redirect=2)
+    ... )
     MaxRetryError
 
 You can also disable exceptions for too many redirects and just return the
-``302`` response::
+``302`` response:
+
+.. code-block:: pycon
 
     >>> r = http.request(
     ...     'GET',
     ...     'http://httpbin.org/redirect/3',
     ...     retries=urllib3.Retry(
-    ...         redirect=2, raise_on_redirect=False))
+    ...         redirect=2, raise_on_redirect=False)
+    ... )
     >>> r.status
     302
 
 If you want all requests to be subject to the same retry policy, you can
-specify the retry at the :class:`~urllib3.poolmanager.PoolManager` level::
+specify the retry at the :class:`~urllib3.poolmanager.PoolManager` level:
+
+.. code-block:: pycon
 
     >>> http = urllib3.PoolManager(retries=False)
     >>> http = urllib3.PoolManager(
-    ...     retries=urllib3.Retry(5, redirect=2))
+    ...     retries=urllib3.Retry(5, redirect=2)
+    ... )
 
 You still override this pool-level retry policy by specifying ``retries`` to
 :meth:`~poolmanager.PoolManager.request`.
@@ -416,11 +513,13 @@ You still override this pool-level retry policy by specifying ``retries`` to
 Errors & Exceptions
 -------------------
 
-urllib3 wraps lower-level exceptions, for example::
+urllib3 wraps lower-level exceptions, for example:
+
+.. code-block:: pycon
 
     >>> try:
     ...     http.request('GET', 'nx.example.com', retries=False)
-    >>> except urllib3.exceptions.NewConnectionError:
+    ... except urllib3.exceptions.NewConnectionError:
     ...     print('Connection failed.')
 
 See :mod:`~urllib3.exceptions` for the full list of all exceptions.
@@ -430,6 +529,8 @@ Logging
 
 If you are using the standard library :mod:`logging` module urllib3 will
 emit several logs. In some cases this can be undesirable. You can use the
-standard logger interface to change the log level for urllib3's logger::
+standard logger interface to change the log level for urllib3's logger:
+
+.. code-block:: pycon
 
     >>> logging.getLogger("urllib3").setLevel(logging.WARNING)

+ 177 - 0
desktop/core/ext-py/urllib3-1.26.12/docs/v2-roadmap.rst

@@ -0,0 +1,177 @@
+v2.0 Roadmap
+============
+
+.. important::
+
+   We're seeking `sponsors and supporters for urllib3 v2.0 on Open Collective <https://github.com/sponsors/urllib3>`_.
+   There's a lot of work to be done for our small team and we want to make sure
+   development can get completed on-time while also fairly compensating contributors
+   for the additional effort required for a large release like ``v2.0``.
+
+   Additional information available within the :doc:`sponsors` section of our documentation.
+
+
+**🚀 Functional API Compatibility**
+-----------------------------------
+
+We're maintaining **99% functional API compatibility** to make the
+migration an easy choice for most users. Migration from v1.x to v2.x
+should be the simplest major version upgrade you've ever completed.
+
+Most changes are either to default configurations, supported Python versions,
+and internal implementation details. So unless you're in a specific situation
+you should notice no changes! 🎉
+
+
+v1.26.x Security and Bug Fixes
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Thanks to support from `Tidelift <https://tidelift.com/subscription/pkg/pypi-urllib3>`_
+we're able to continue supporting v1.26.x releases with
+both security and bug fixes for the forseeable future 💖
+
+If your organization relies on urllib3 and is interested in continuing support you can learn
+more about the `Tidelift Subscription for Enterprise <https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=docs>`_.
+
+
+**🔐 Modern Security by Default**
+---------------------------------
+
+HTTPS requires TLS 1.2+
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Greater than 95% of websites support TLS 1.2 or above.
+At this point we're comfortable switching the default
+minimum TLS version to be 1.2 to ensure high security
+for users without breaking services.
+
+Dropping TLS 1.0 and 1.1 by default means you
+won't be vulnerable to TLS downgrade attacks
+if a vulnerability in TLS 1.0 or 1.1 were discovered in
+the future. Extra security for free! By dropping TLS 1.0
+and TLS 1.1 we also tighten the list of ciphers we need
+to support to ensure high security for data traveling
+over the wire.
+
+If you still need to use TLS 1.0 or 1.1 in your application
+you can still upgrade to v2.0, you'll only need to set
+``ssl_version`` to the proper values to continue using
+legacy TLS versions.
+
+
+Stop Verifying CommonName in Certificates
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Dropping support the long deprecated ``commonName``
+field on certificates in favor of only verifying
+``subjectAltName`` to put us in line with browsers and
+other HTTP client libraries and to improve security for our users.
+
+
+Certificate Verification via SSLContext
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+By default certificate verification is handled by urllib3
+to support legacy Python versions, but now we can
+rely on Python's certificate verification instead! This
+should result in a speedup for verifying certificates
+and means that any improvements made to certificate
+verification in Python or OpenSSL will be immediately
+available.
+
+
+**✨ Optimized for Python 3.6+**
+--------------------------------
+
+In v2.0 we'll be specifically be targeting
+CPython 3.6+ and PyPy 7.0+ (compatible with CPython 3.6)
+and dropping support Python versions 2.7 and 3.5.
+
+By dropping end-of-life Python versions we're able to optimize
+the codebase for Python 3.6+ by using new features to improve
+performance and reduce the amount of code that needs to be executed
+in order to support legacy versions.
+
+
+**🔮 Tracing**
+--------------
+
+Currently with urllib3 it's tough to get low-level insights into what
+how your HTTP client is performing and what your connection information
+looks like. In v2.0 we'll be adding tracing and telemetry information
+to HTTP response objects including:
+
+- Connection ID
+- IP Address resolved by DNS
+- Request Method, Target, and Headers
+- TLS Version and Cipher
+- Certificate Fingerprint, subjectAltName, and Validity Information
+- Timings for DNS, Request Data, First Byte in Response
+
+
+**📜 Type-Hinted APIs**
+-----------------------
+
+You'll finally be able to run Mypy or other type-checkers
+on code using urllib3. This also means that for IDEs
+that support type hints you'll receive better suggestions
+from auto-complete. No more confusing with ``**kwargs``!
+
+We'll also add API interfaces to ensure that when
+you're sub-classing an interface you're only using
+supported public APIs to ensure compatibility and
+minimize breakages down the road.
+
+
+**🎁 ...and many more features!**
+---------------------------------
+
+- Top-level ``urllib3.request()`` API
+- Streaming ``multipart/form-encoded`` Request Data
+- More Powerful and Configurable Retry Logic
+
+If there's a feature you don't see here but would like to see
+in urllib3 v2.0, there's an open GitHub issue for making
+feature suggestions.
+
+
+**📅 Release and Migration Schedule**
+-------------------------------------
+
+We're aiming for all ``v2.x`` features to be released in **mid-to-late 2021**.
+
+Here's what the release and migration schedule will look like leading up
+to v2.0 being released:
+
+- Development of ``v2.x`` breaking changes starts.
+- Release ``v1.26.0`` with deprecation warnings for ``v2.0.0`` breaking changes.
+  This will be the last non-patch release within the ``v1.x`` stream.
+- Release ``v2.0.0-alpha1`` once all breaking changes have been completed.
+  We'll wait for users to report issues, bugs, and unexpected
+  breakages at this stage to ensure the release ``v2.0.0`` goes smoothly.
+- Development of remaining ``v2.x`` features starts.
+- Release ``v2.0.0`` which will be identical to ``v2.0.0-alpha1``.
+- Release ``v2.1.0`` with remaining ``v2.x`` features.
+
+Deprecation warnings within ``v1.26.x`` will be opt-in by default.
+
+**More detailed Application Migration Guide coming soon.**
+
+For Package Maintainers
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Since this is the first major release in almost 9 years some users may
+be caught off-guard by a new major release of urllib3. We're mitigating this by
+trying to make ``v2.x`` API-compatible with ``v1.x``.
+
+If your application or library uses urllib3 and you'd like to be extra
+cautious about not breaking your users, you can pin urllib3 like so
+until you ensure compatibility with ``v2.x``:
+
+.. code-block:: python
+
+   # 'install_requires' or 'requirements.txt'
+   "urllib3>=1.25,<2"
+
+We'd really appreciate testing compatibility
+and providing feedback on ``v2.0.0-alpha1`` once released.

+ 0 - 0
desktop/core/ext-py/urllib3-1.25.8/dummyserver/__init__.py → desktop/core/ext-py/urllib3-1.26.12/dummyserver/__init__.py


+ 17 - 0
desktop/core/ext-py/urllib3-1.26.12/dummyserver/certs/README.rst

@@ -0,0 +1,17 @@
+Generating new certificates
+---------------------------
+
+Here's how you can regenerate the certificates::
+
+    import trustme
+
+    ca = trustme.CA()
+    server_cert = ca.issue_cert(u"localhost")
+
+    ca.cert_pem.write_to_path("cacert.pem")
+    ca.private_key_pem.write_to_path("cacert.key")
+    server_cert.cert_chain_pems[0].write_to_path("server.crt")
+    server_cert.private_key_pem.write_to_path("server.key")
+
+This will break a number of tests: you will need to update the
+relevant fingerprints and hashes.

+ 27 - 0
desktop/core/ext-py/urllib3-1.26.12/dummyserver/certs/cacert.key

@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAn330NEISY7w+GeZR2jh8Of1x2CtpenWRKuuD2u4FOaN0G1SN
+pm6Owum6xzhv93jmj+tZrp9kYvC9HcvGrgzH9yP566pLLfY2SEEAJYNNeVdqegY5
+9W1wa6vEDN5UYruVEbymgPHoItiYhfndgEDbagPN5dhrdNvaRNI2c5zMmBDlzzhC
+G7AZbXuthTp6OwTVye71f2lnNhKi6rzWtre/ji88fq8Qm406l29O1RTzmNttN5BZ
+nPWU9v4GnCYKXdY6BN1Ub6z8C9hna/oRgBqa0Zbv7kEuAuqhsFQeuFCfBhQm7NdP
+d/7Kh6LS+VIiCu3AOccZHOuFOjtHb/KyndmgCwIDAQABAoIBAGQg9wc308O5kmNA
+LXMKszLU4nwMBRRUaua/JPB1LeKZs3LVCnjKP+YuRox76g87X8RKxOrUNnnHGXNz
+UzBB5ehKNcS2DKy2Pi3uYOEsJZ9gOgCRmCF0q3dtRo+tpNy3V0bjYMTjGhGGWXsC
++wRhs15DNShvTkb3H3jFYFoEvo1YUKsvImBWJGwDbdDMfMZv4aeBWXlOrF+2fwt2
+TM3G1o8xzEEWBB4FLZBW+tq2zfUSa1KwqqyQ4ZIqXepjQcN6nNfuHADA+nxuruVV
+LPUhz4ZmsBEnJ7CL9zWJkLUw/al9/6Q14tleRmiZTTztqAlFgZUpNhaKSzVdsIc/
+Xz3+OgECgYEAzgNu7eFJAOzq+ZVFRrrbA7tu+f318FTCaADJ1kFgAJyj6b9yOGan
+LNL4TfXVjzgqtfQ4AIVqEHwXO7yS+YgTprvgzqRxqNRZ6ikuo2IPkIwXIAXZAlwd
+JsWLPBXOlOFW6LHvhYxjY2xF+A9y4AbuZ3UDRUQ+tp226VfEaeY80+ECgYEAxjDV
+cJqeBO06YRVGmcXfAYwRLJGT4hvIZeiSbxX/kJ0rx+cYLT/XZbAguJYQ5ZK2lkeA
+YneXYDlSTxmBxHxiWwWe3mcmctdE4Jbw8oIZ8a49a4KE/F2ojC4gmisIt3/OqGOw
+C4e/pDCE/QV64LWdazgUWHPGoVEmZx9/oMm/MWsCgYEAsLtlSJFB7ZdRpTcXLSxT
+gwoilDf36mrsNAipHjMLRrsaKwbf197If72k4kyJHspSabHO8TOC4A10aPzHIWZJ
+ZXo7y0prbyhs0mLt7Z/MNnbXx9L8bffT0lUZszwJ8tK1mf47utfK05opFDs8k0+e
+6gYJ/jwjiMoYBmoSx76KZEECgYBagJxHAmQcbdQV1yhZOhFe3H5PMt8sBnHZj32m
++o2slQkUDQRuTVPoHKikgeqPWxLDxzzqOiBHEYXzlvs6JW6okAV/G+1jzcenI2Y9
+54k/YsirWnut3nsEIGBE5lfhq5xMKtGOQlwR9xITlLgK+wQ6nO41ghD3Q15dAvY+
+D0KepwKBgQChHvbyzw0t76J2gLxUSyuG7VsId651bpqTYUsbSDFlRo4g8UbBAkHd
+fdv5BOon3ALJFreSK+a78es0kpiLwrS2SqG/y3mb9aUoLpCVB1haDmmP4Rn4AYXz
+OCfUkusuSoXOR8CMjqkXYl5QjeJAUAt9GTsZnXIbOQKbaZwkeV0HEg==
+-----END RSA PRIVATE KEY-----

+ 21 - 0
desktop/core/ext-py/urllib3-1.26.12/dummyserver/certs/cacert.pem

@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDfzCCAmegAwIBAgIUVGEi+7bkaGRIPoQrp9zFFAT5JYQwDQYJKoZIhvcNAQEL
+BQAwQDEXMBUGA1UECgwOdHJ1c3RtZSB2MC41LjMxJTAjBgNVBAsMHFRlc3Rpbmcg
+Q0EgIzdEUWJWOTBzV2xZSEstY0wwHhcNMDAwMTAxMDAwMDAwWhcNMzgwMTAxMDAw
+MDAwWjBAMRcwFQYDVQQKDA50cnVzdG1lIHYwLjUuMzElMCMGA1UECwwcVGVzdGlu
+ZyBDQSAjN0RRYlY5MHNXbFlISy1jTDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAJ999DRCEmO8PhnmUdo4fDn9cdgraXp1kSrrg9ruBTmjdBtUjaZujsLp
+usc4b/d45o/rWa6fZGLwvR3Lxq4Mx/cj+euqSy32NkhBACWDTXlXanoGOfVtcGur
+xAzeVGK7lRG8poDx6CLYmIX53YBA22oDzeXYa3Tb2kTSNnOczJgQ5c84QhuwGW17
+rYU6ejsE1cnu9X9pZzYSouq81ra3v44vPH6vEJuNOpdvTtUU85jbbTeQWZz1lPb+
+BpwmCl3WOgTdVG+s/AvYZ2v6EYAamtGW7+5BLgLqobBUHrhQnwYUJuzXT3f+yoei
+0vlSIgrtwDnHGRzrhTo7R2/ysp3ZoAsCAwEAAaNxMG8wHQYDVR0OBBYEFHWf39Hn
+rdChKjsOBoBGn1U+0VgxMBIGA1UdEwEB/wQIMAYBAf8CAQkwDgYDVR0PAQH/BAQD
+AgEGMCoGA1UdJQEB/wQgMB4GCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMw
+DQYJKoZIhvcNAQELBQADggEBAIAylnWX2WTB+mrVVpE2W8i0HollTMJIPJA9Jq3Q
+/t2uPjXDEAVAcBmQju8qy2tHpamvzpQseVm3EF3UFNlGxwOGKsTzU4J45qOJITZk
+eLRAcWNEt6cgqj8ml8PuMHU7oDnp7pP6VPe5KQH1a0FYQnDNEwg7MyX+GjnXeRwd
+re6y9nMC+XKCYUAd1/nQcrZdnSsws1M5lzXir2vuyyN9EUkf2xMMKA2E1s0f+5he
+3eNghAXtZw616ITBoMb7ckG6a0+YobbiQ0tKgB8D3MG2544Gx6xhCXf7pX4q4g//
+1nTPeYFsBDyqEOEhcW1o9/MSSbjpUJC+QUmCb2Y1wYeum+w=
+-----END CERTIFICATE-----

+ 21 - 0
desktop/core/ext-py/urllib3-1.26.12/dummyserver/certs/server.crt

@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDeTCCAmGgAwIBAgIUQeadxkH6YMoSecB2rNbFEr1u1kUwDQYJKoZIhvcNAQEL
+BQAwQDEXMBUGA1UECgwOdHJ1c3RtZSB2MC41LjMxJTAjBgNVBAsMHFRlc3Rpbmcg
+Q0EgIzdEUWJWOTBzV2xZSEstY0wwHhcNMDAwMTAxMDAwMDAwWhcNMzgwMTAxMDAw
+MDAwWjBCMRcwFQYDVQQKDA50cnVzdG1lIHYwLjUuMzEnMCUGA1UECwweVGVzdGlu
+ZyBjZXJ0ICMtSGRsMnMyTEYyeVp0NDFOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEArRLZX+5dyCh4N7q90sH2Q4Ea6QLK8OfoUQPWtpzAtINDUAdfSXCC
+/qYTtGeSCGjB4W0LfvRTI8afHoD/M+YpaCRnx7T1sy1taA2rnGrEVXEHalVP+RI4
+t4ZWtX56aez2M0Fs6o4MtzAuP6fKgSdWzIvOmtCxqn0Zf2KbfEHnQylsy2LgPa/x
+Lg50fbZ195+h4EAB3d2/jqaeFGGhN+7zrrv4+L1eeW3bzOkvPEkTNepq3Gy/8r5e
+0i2icEnM+eBfl8NYgQ1toJYvDIy5Qi2TRzaFxBVmqUOc8EFtHpL7E9YLbTTW15xd
+oLVLdXI5igGxkwPYoeiiAJWxIsC/hL1RRQIDAQABo2kwZzAdBgNVHQ4EFgQUMU6+
+uwNmL8TxLwjrj7jzzlwDPiowDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBR1n9/R
+563QoSo7DgaARp9VPtFYMTAXBgNVHREBAf8EDTALgglsb2NhbGhvc3QwDQYJKoZI
+hvcNAQELBQADggEBAJ6w5neQKw+/efA/I3IHzt8GaSHQ/YehMHx8GxCViJUmLg6P
+Vf74k856Knvh7IsVaqF1uRi6qQaFPik6CwtBCj7/ZftdseOCDljd+8EWyQ+ZWie7
++tzMIdQWZxYSdR9Ov42VD++a6oWJtfJhWV5eyDit99FFK31/M1ZXoceiDS5AsIG6
+wfsxrFj1qV9pLNSIlfrnycYhYx7avVJTf+2mfZgTO9Tx+VPapkZrfCnP/2jpN39u
+zblFFjP9Ir0QqBw7MXjVX+Y1HkQ2TQnEeSsp1HuFRIZYx72Cttnckv1Lxcx/HiQB
+oebTDYiRfxOAEeIMgIhX88Jca8vNIRcXDeGK9mU=
+-----END CERTIFICATE-----

+ 27 - 0
desktop/core/ext-py/urllib3-1.26.12/dummyserver/certs/server.key

@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpQIBAAKCAQEArRLZX+5dyCh4N7q90sH2Q4Ea6QLK8OfoUQPWtpzAtINDUAdf
+SXCC/qYTtGeSCGjB4W0LfvRTI8afHoD/M+YpaCRnx7T1sy1taA2rnGrEVXEHalVP
++RI4t4ZWtX56aez2M0Fs6o4MtzAuP6fKgSdWzIvOmtCxqn0Zf2KbfEHnQylsy2Lg
+Pa/xLg50fbZ195+h4EAB3d2/jqaeFGGhN+7zrrv4+L1eeW3bzOkvPEkTNepq3Gy/
+8r5e0i2icEnM+eBfl8NYgQ1toJYvDIy5Qi2TRzaFxBVmqUOc8EFtHpL7E9YLbTTW
+15xdoLVLdXI5igGxkwPYoeiiAJWxIsC/hL1RRQIDAQABAoIBAQCZ/62f6G9WDHx7
+yhPhlmjTw+r37l45YYCbpbjFoFDvzeR1LzogFJbak1fxLD8KcHwjY23ZNvlLWg53
+i/yIZ4Hsgog9cM0283LoJVHPykiMZhhdCzAvxYDl/AjnUXUHD6w6CzsoseCql5pv
+VZOgvCpFsxjRNGUB+HJZoJoNRG7MmHaY638pGHGMiVbskT9Ww3emtMLdTKy1rQcj
+9XO/4mlaBGD79wYxy5Hlysbh2UYuQRv8XN5V46Uugk6sC/i2G7VC8KkqPQ2pM+rA
+LaeWSuN9dfBwiKcHtJssMP95ilsXsjqh3NoVuFODDXHv3u+nBAxtg2TnLZFkDZXH
+FvxPJu8BAoGBANwWWzvl/dnTtVDFbhF/61v3AVZV4vVpokXRJKny05CZPZWROTc4
+LXMVw9kxeecNdo0yR4jn1yyNUmKnQpTmpsR9Yo9NYH+Z1CLxswpc7ILfVRZBK6bK
+cCG43lM5xZprG6FXhqkHN2u9z5Y8/PuaMzC8iVs402/gakgPKmn8OjdhAoGBAMlQ
+mmrx24n9YY/dOn55XC5V/iN3Z6mIsHThnDIU515bwLwZVG7chOLSiWHAh4JzUH+v
+bV3NnlE1jhf5ln0WAadCtIeVprJG6msNTQlbTMTTV5kVNdbfYX6sFQEI+hC1LCiV
+yJtuNIa4P5W/PtoC3FWUlcAH8C91S/M4CeZZ0HhlAoGBAIxflgE2SBrO9S53PiTb
+OfqGKMwwK3nrzhxJsODUiCwKEUV8Qsn9gr+MekXlUKMV6y9Tily/wnYgDRPvKoBe
+PK/GaT6NU6cPLka7cj6B1jgCyfpPxs+y/qIDj4n1pxs+hXj6omDcwXRutCBW9eRk
+DZJgLhuIuxL4R9F+GsdOoLMBAoGAKQn1cLe9OXQd32YJ9p5m3EtLc49z4murDSiw
+3sTEJcgukinXvIHX1SV2PCczeLRpRJ5OfUDddVCllt2agAVscNx4UOuA//bU8t3T
+RoUGMVmkEeDxCMyg42HRJlTeJWnJhryCGK1up8gHrk8+UNMkd43CuVLk88fFo99Y
+pUzJ4sECgYEAvBDTo3k3sD18qV6p6tQwy+MVjvQb9V81GHP18tYcVKta3LkkqUFa
+3qSyVxi7gl3JtynG7NJ7+GDx6zxW2xUR72NTcJwWvesLI+1orM288pyNDVw9MJ/j
+AyVFnW5SEYEqdizTnQxL+rQB4CyeHfwZx2/1/Qr0ezLGUJv51lnk4mQ=
+-----END RSA PRIVATE KEY-----

+ 18 - 14
desktop/core/ext-py/urllib3-1.25.8/dummyserver/handlers.py → desktop/core/ext-py/urllib3-1.26.12/dummyserver/handlers.py

@@ -8,16 +8,15 @@ import logging
 import sys
 import time
 import zlib
-
+from datetime import datetime, timedelta
 from io import BytesIO
-from tornado.web import RequestHandler
+
 from tornado import httputil
-from datetime import datetime
-from datetime import timedelta
+from tornado.web import RequestHandler
 
+from urllib3.packages.six import binary_type, ensure_str
 from urllib3.packages.six.moves.http_client import responses
 from urllib3.packages.six.moves.urllib.parse import urlsplit
-from urllib3.packages.six import binary_type, ensure_str
 
 log = logging.getLogger(__name__)
 
@@ -63,27 +62,27 @@ class TestingApp(RequestHandler):
     """
 
     def get(self):
-        """ Handle GET requests """
+        """Handle GET requests"""
         self._call_method()
 
     def post(self):
-        """ Handle POST requests """
+        """Handle POST requests"""
         self._call_method()
 
     def put(self):
-        """ Handle PUT requests """
+        """Handle PUT requests"""
         self._call_method()
 
     def options(self):
-        """ Handle OPTIONS requests """
+        """Handle OPTIONS requests"""
         self._call_method()
 
     def head(self):
-        """ Handle HEAD requests """
+        """Handle HEAD requests"""
         self._call_method()
 
     def _call_method(self):
-        """ Call the correct method in this class based on the incoming URI """
+        """Call the correct method in this class based on the incoming URI"""
         req = self.request
         req.params = {}
         for k, v in req.arguments.items():
@@ -93,7 +92,7 @@ class TestingApp(RequestHandler):
         if not path.startswith("/"):
             path = urlsplit(path).path
 
-        target = path[1:].replace("/", "_")
+        target = path[1:].split("/", 1)[0]
         method = getattr(self, target, self.index)
 
         resp = method(req)
@@ -116,6 +115,11 @@ class TestingApp(RequestHandler):
             subject = dict((k, v) for (k, v) in [y for z in cert["subject"] for y in z])
         return Response(json.dumps(subject))
 
+    def alpn_protocol(self, request):
+        """Return the selected ALPN protocol."""
+        proto = request.connection.stream.socket.selected_alpn_protocol()
+        return Response(proto.encode("utf8") if proto is not None else u"")
+
     def source_address(self, request):
         """Return the requester's IP address."""
         return Response(request.remote_ip)
@@ -261,7 +265,7 @@ class TestingApp(RequestHandler):
         return Response(json.dumps(dict(request.headers)))
 
     def successful_retry(self, request):
-        """ Handler which will return an error and then success
+        """Handler which will return an error and then success
 
         It's not currently very flexible as the number of retries is hard-coded.
         """
@@ -316,7 +320,7 @@ class TestingApp(RequestHandler):
         date = request.params.get("date")
         if date:
             retry_after = str(
-                httputil.format_timestamp(datetime.fromtimestamp(float(date)))
+                httputil.format_timestamp(datetime.utcfromtimestamp(float(date)))
             )
         else:
             retry_after = "1"

+ 10 - 2
desktop/core/ext-py/urllib3-1.25.8/dummyserver/proxy.py → desktop/core/ext-py/urllib3-1.26.12/dummyserver/proxy.py

@@ -25,15 +25,16 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 # THE SOFTWARE.
 
-import sys
 import socket
+import ssl
+import sys
 
 import tornado.gen
+import tornado.httpclient
 import tornado.httpserver
 import tornado.ioloop
 import tornado.iostream
 import tornado.web
-import tornado.httpclient
 
 __all__ = ["ProxyHandler", "run_proxy"]
 
@@ -66,6 +67,12 @@ class ProxyHandler(tornado.web.RequestHandler):
                     self.write(response.body)
                 self.finish()
 
+        upstream_ca_certs = self.application.settings.get("upstream_ca_certs", None)
+        ssl_options = None
+
+        if upstream_ca_certs:
+            ssl_options = ssl.create_default_context(cafile=upstream_ca_certs)
+
         req = tornado.httpclient.HTTPRequest(
             url=self.request.uri,
             method=self.request.method,
@@ -73,6 +80,7 @@ class ProxyHandler(tornado.web.RequestHandler):
             headers=self.request.headers,
             follow_redirects=False,
             allow_nonstandard_methods=True,
+            ssl_options=ssl_options,
         )
 
         client = tornado.httpclient.AsyncHTTPClient()

+ 76 - 28
desktop/core/ext-py/urllib3-1.25.8/dummyserver/server.py → desktop/core/ext-py/urllib3-1.26.12/dummyserver/server.py

@@ -7,22 +7,23 @@ from __future__ import print_function
 
 import logging
 import os
-import random
-import string
+import socket
+import ssl
 import sys
 import threading
-import socket
 import warnings
-import ssl
 from datetime import datetime
 
-from urllib3.exceptions import HTTPWarning
-
 import tornado.httpserver
 import tornado.ioloop
 import tornado.netutil
 import tornado.web
+import trustme
+from cryptography.hazmat.backends import default_backend
+from cryptography.hazmat.primitives import serialization
 
+from urllib3.exceptions import HTTPWarning
+from urllib3.util import ALPN_PROTOCOLS, resolve_cert_reqs, resolve_ssl_version
 
 log = logging.getLogger(__name__)
 
@@ -32,21 +33,28 @@ DEFAULT_CERTS = {
     "keyfile": os.path.join(CERTS_PATH, "server.key"),
     "cert_reqs": ssl.CERT_OPTIONAL,
     "ca_certs": os.path.join(CERTS_PATH, "cacert.pem"),
+    "alpn_protocols": ALPN_PROTOCOLS,
 }
-CLIENT_INTERMEDIATE_PEM = "client_intermediate.pem"
-CLIENT_NO_INTERMEDIATE_PEM = "client_no_intermediate.pem"
-CLIENT_INTERMEDIATE_KEY = "client_intermediate.key"
-CLIENT_CERT = os.path.join(CERTS_PATH, CLIENT_INTERMEDIATE_PEM)
-PASSWORD_KEYFILE = os.path.join(CERTS_PATH, "server_password.key")
-PASSWORD_CLIENT_KEYFILE = os.path.join(CERTS_PATH, "client_password.key")
 DEFAULT_CA = os.path.join(CERTS_PATH, "cacert.pem")
 DEFAULT_CA_KEY = os.path.join(CERTS_PATH, "cacert.key")
-DEFAULT_CA_BAD = os.path.join(CERTS_PATH, "client_bad.pem")
-COMBINED_CERT_AND_KEY = os.path.join(CERTS_PATH, "server.combined.pem")
+
+
+def _resolves_to_ipv6(host):
+    """Returns True if the system resolves host to an IPv6 address by default."""
+    resolves_to_ipv6 = False
+    try:
+        for res in socket.getaddrinfo(host, None, socket.AF_UNSPEC):
+            af, _, _, _, _ = res
+            if af == socket.AF_INET6:
+                resolves_to_ipv6 = True
+    except socket.gaierror:
+        pass
+
+    return resolves_to_ipv6
 
 
 def _has_ipv6(host):
-    """ Returns True if the system can bind an IPv6 address. """
+    """Returns True if the system can bind an IPv6 address."""
     sock = None
     has_ipv6 = False
 
@@ -59,7 +67,7 @@ def _has_ipv6(host):
         try:
             sock = socket.socket(socket.AF_INET6)
             sock.bind((host, 0))
-            has_ipv6 = True
+            has_ipv6 = _resolves_to_ipv6("localhost")
         except Exception:
             pass
 
@@ -126,6 +134,39 @@ class SocketServerThread(threading.Thread):
         self.server = self._start_server()
 
 
+def ssl_options_to_context(
+    keyfile=None,
+    certfile=None,
+    server_side=None,
+    cert_reqs=None,
+    ssl_version=None,
+    ca_certs=None,
+    do_handshake_on_connect=None,
+    suppress_ragged_eofs=None,
+    ciphers=None,
+    alpn_protocols=None,
+):
+    """Return an equivalent SSLContext based on ssl.wrap_socket args."""
+    ssl_version = resolve_ssl_version(ssl_version)
+    cert_none = resolve_cert_reqs("CERT_NONE")
+    if cert_reqs is None:
+        cert_reqs = cert_none
+    else:
+        cert_reqs = resolve_cert_reqs(cert_reqs)
+
+    ctx = ssl.SSLContext(ssl_version)
+    ctx.load_cert_chain(certfile, keyfile)
+    ctx.verify_mode = cert_reqs
+    if ctx.verify_mode != cert_none:
+        ctx.load_verify_locations(cafile=ca_certs)
+    if alpn_protocols and hasattr(ctx, "set_alpn_protocols"):
+        try:
+            ctx.set_alpn_protocols(alpn_protocols)
+        except NotImplementedError:
+            pass
+    return ctx
+
+
 def run_tornado_app(app, io_loop, certs, scheme, host):
     assert io_loop == tornado.ioloop.IOLoop.current()
 
@@ -134,7 +175,11 @@ def run_tornado_app(app, io_loop, certs, scheme, host):
     app.last_req = datetime(1970, 1, 1)
 
     if scheme == "https":
-        http_server = tornado.httpserver.HTTPServer(app, ssl_options=certs)
+        if sys.version_info < (2, 7, 9):
+            ssl_opts = certs
+        else:
+            ssl_opts = ssl_options_to_context(**certs)
+        http_server = tornado.httpserver.HTTPServer(app, ssl_options=ssl_opts)
     else:
         http_server = tornado.httpserver.HTTPServer(app)
 
@@ -151,17 +196,8 @@ def run_loop_in_thread(io_loop):
 
 
 def get_unreachable_address():
-    while True:
-        host = "".join(random.choice(string.ascii_lowercase) for _ in range(60))
-        sockaddr = (host, 54321)
-
-        # check if we are really "lucky" and hit an actual server
-        try:
-            s = socket.create_connection(sockaddr)
-        except socket.error:
-            return sockaddr
-        else:
-            s.close()
+    # reserved as per rfc2606
+    return ("something.invalid", 54321)
 
 
 if __name__ == "__main__":
@@ -176,3 +212,15 @@ if __name__ == "__main__":
     server_thread = run_loop_in_thread(io_loop)
 
     print("Listening on http://{host}:{port}".format(host=host, port=port))
+
+
+def encrypt_key_pem(private_key_pem, password):
+    private_key = serialization.load_pem_private_key(
+        private_key_pem.bytes(), password=None, backend=default_backend()
+    )
+    encrypted_key = private_key.private_bytes(
+        serialization.Encoding.PEM,
+        serialization.PrivateFormat.TraditionalOpenSSL,
+        serialization.BestAvailableEncryption(password),
+    )
+    return trustme.Blob(encrypted_key)

+ 77 - 6
desktop/core/ext-py/urllib3-1.25.8/dummyserver/testcase.py → desktop/core/ext-py/urllib3-1.26.12/dummyserver/testcase.py

@@ -1,17 +1,19 @@
 import threading
+from contextlib import contextmanager
 
 import pytest
 from tornado import ioloop, web
 
+from dummyserver.handlers import TestingApp
+from dummyserver.proxy import ProxyHandler
 from dummyserver.server import (
-    SocketServerThread,
-    run_tornado_app,
-    run_loop_in_thread,
     DEFAULT_CERTS,
     HAS_IPV6,
+    SocketServerThread,
+    run_loop_in_thread,
+    run_tornado_app,
 )
-from dummyserver.handlers import TestingApp
-from dummyserver.proxy import ProxyHandler
+from urllib3.connection import HTTPConnection
 
 
 def consume_socket(sock, chunks=65536):
@@ -106,7 +108,7 @@ class IPV4SocketDummyServerTestCase(SocketDummyServerTestCase):
 
 
 class HTTPDummyServerTestCase(object):
-    """ A simple HTTP server that runs when your test class runs
+    """A simple HTTP server that runs when your test class runs
 
     Have your test class inherit from this one, and then a simple server
     will start when your tests run, and automatically shut down when they
@@ -180,6 +182,14 @@ class HTTPDummyProxyTestCase(object):
             app, cls.io_loop, None, "http", cls.proxy_host
         )
 
+        upstream_ca_certs = cls.https_certs.get("ca_certs", None)
+        app = web.Application(
+            [(r".*", ProxyHandler)], upstream_ca_certs=upstream_ca_certs
+        )
+        cls.https_proxy_server, cls.https_proxy_port = run_tornado_app(
+            app, cls.io_loop, cls.https_certs, "https", cls.proxy_host
+        )
+
         cls.server_thread = run_loop_in_thread(cls.io_loop)
 
     @classmethod
@@ -187,6 +197,7 @@ class HTTPDummyProxyTestCase(object):
         cls.io_loop.add_callback(cls.http_server.stop)
         cls.io_loop.add_callback(cls.https_server.stop)
         cls.io_loop.add_callback(cls.proxy_server.stop)
+        cls.io_loop.add_callback(cls.https_proxy_server.stop)
         cls.io_loop.add_callback(cls.io_loop.stop)
         cls.server_thread.join()
 
@@ -208,3 +219,63 @@ class IPv6HTTPDummyProxyTestCase(HTTPDummyProxyTestCase):
 
     proxy_host = "::1"
     proxy_host_alt = "127.0.0.1"
+
+
+class ConnectionMarker(object):
+    """
+    Marks an HTTP(S)Connection's socket after a request was made.
+
+    Helps a test server understand when a client finished a request,
+    without implementing a complete HTTP server.
+    """
+
+    MARK_FORMAT = b"$#MARK%04x*!"
+
+    @classmethod
+    @contextmanager
+    def mark(cls, monkeypatch):
+        """
+        Mark connections under in that context.
+        """
+
+        orig_request = HTTPConnection.request
+        orig_request_chunked = HTTPConnection.request_chunked
+
+        def call_and_mark(target):
+            def part(self, *args, **kwargs):
+                result = target(self, *args, **kwargs)
+                self.sock.sendall(cls._get_socket_mark(self.sock, False))
+                return result
+
+            return part
+
+        with monkeypatch.context() as m:
+            m.setattr(HTTPConnection, "request", call_and_mark(orig_request))
+            m.setattr(
+                HTTPConnection, "request_chunked", call_and_mark(orig_request_chunked)
+            )
+            yield
+
+    @classmethod
+    def consume_request(cls, sock, chunks=65536):
+        """
+        Consume a socket until after the HTTP request is sent.
+        """
+        consumed = bytearray()
+        mark = cls._get_socket_mark(sock, True)
+        while True:
+            b = sock.recv(chunks)
+            if not b:
+                break
+            consumed += b
+            if consumed.endswith(mark):
+                break
+        return consumed
+
+    @classmethod
+    def _get_socket_mark(cls, sock, server):
+        if server:
+            port = sock.getpeername()[1]
+        else:
+            port = sock.getsockname()[1]
+        return cls.MARK_FORMAT % (port,)

+ 7 - 1
desktop/core/ext-py/urllib3-1.25.8/setup.cfg → desktop/core/ext-py/urllib3-1.26.12/setup.cfg

@@ -18,13 +18,19 @@ requires-dist =
 	idna>=2.0.0; extra == 'secure'
 	certifi; extra == 'secure'
 	ipaddress; python_version=="2.7" and extra == 'secure'
+	urllib3-secure-extra; extra == 'secure'
 	PySocks>=1.5.6,<2.0,!=1.5.7; extra == 'socks'
-	brotlipy>=0.6.0; extra == 'brotli'
+	brotli>=1.0.9; (os_name != 'nt' or python_version >= '3') and platform_python_implementation == 'CPython' and extra == 'brotli'
+	brotlicffi>=0.8.0; (os_name != 'nt' or python_version >= '3') and platform_python_implementation != 'CPython' and extra == 'brotli'
+	brotlipy>=0.6.0; os_name == 'nt' and python_version < '3' and extra == 'brotli'
 
 [tool:pytest]
 xfail_strict = true
 python_classes = Test *TestCase
 
+[isort]
+profile = black
+
 [egg_info]
 tag_build = 
 tag_date = 0

+ 28 - 17
desktop/core/ext-py/urllib3-1.25.8/setup.py → desktop/core/ext-py/urllib3-1.26.12/setup.py

@@ -1,22 +1,35 @@
 #!/usr/bin/env python
+# This file is protected via CODEOWNERS
 
-from setuptools import setup
-
+import codecs
 import os
 import re
-import codecs
+
+from setuptools import setup
 
 base_path = os.path.dirname(__file__)
 
 # Get the version (borrowed from SQLAlchemy)
-with open(os.path.join(base_path, "src", "urllib3", "__init__.py")) as fp:
+with open(os.path.join(base_path, "src", "urllib3", "_version.py")) as fp:
     VERSION = (
         re.compile(r""".*__version__ = ["'](.*?)['"]""", re.S).match(fp.read()).group(1)
     )
 
 
 with codecs.open("README.rst", encoding="utf-8") as fp:
-    readme = fp.read()
+    # Remove reST raw directive from README as they're not allowed on PyPI
+    # Those blocks start with a newline and continue until the next newline
+    mode = None
+    lines = []
+    for line in fp:
+        if line.startswith(".. raw::"):
+            mode = "ignore_nl"
+        elif line == "\n":
+            mode = "wait_nl" if mode == "ignore_nl" else None
+
+        if mode is None:
+            lines.append(line)
+    readme = "".join(lines)
 
 with codecs.open("CHANGES.rst", encoding="utf-8") as fp:
     changes = fp.read()
@@ -28,6 +41,7 @@ setup(
     version=version,
     description="HTTP library with thread-safe connection pooling, file post, and more.",
     long_description=u"\n\n".join([readme, changes]),
+    long_description_content_type="text/x-rst",
     classifiers=[
         "Environment :: Web Environment",
         "Intended Audience :: Developers",
@@ -37,11 +51,12 @@ setup(
         "Programming Language :: Python :: 2",
         "Programming Language :: Python :: 2.7",
         "Programming Language :: Python :: 3",
-        "Programming Language :: Python :: 3.5",
         "Programming Language :: Python :: 3.6",
         "Programming Language :: Python :: 3.7",
         "Programming Language :: Python :: 3.8",
         "Programming Language :: Python :: 3.9",
+        "Programming Language :: Python :: 3.10",
+        "Programming Language :: Python :: 3.11",
         "Programming Language :: Python :: Implementation :: CPython",
         "Programming Language :: Python :: Implementation :: PyPy",
         "Topic :: Internet :: WWW/HTTP",
@@ -60,7 +75,6 @@ setup(
     packages=[
         "urllib3",
         "urllib3.packages",
-        "urllib3.packages.ssl_match_hostname",
         "urllib3.packages.backports",
         "urllib3.contrib",
         "urllib3.contrib._securetransport",
@@ -68,23 +82,20 @@ setup(
     ],
     package_dir={"": "src"},
     requires=[],
-    python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4",
-    tests_require=[
-        # These are a less-specific subset of dev-requirements.txt, for the
-        # convenience of distro package maintainers.
-        "pytest",
-        "mock",
-        "tornado",
-    ],
-    test_suite="test",
+    python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4",
     extras_require={
-        "brotli": ["brotlipy>=0.6.0"],
+        "brotli": [
+            "brotli>=1.0.9; (os_name != 'nt' or python_version >= '3') and platform_python_implementation == 'CPython'",
+            "brotlicffi>=0.8.0; (os_name != 'nt' or python_version >= '3') and platform_python_implementation != 'CPython'",
+            "brotlipy>=0.6.0; os_name == 'nt' and python_version < '3'",
+        ],
         "secure": [
             "pyOpenSSL>=0.14",
             "cryptography>=1.3.4",
             "idna>=2.0.0",
             "certifi",
             "ipaddress; python_version=='2.7'",
+            "urllib3-secure-extra",
         ],
         "socks": ["PySocks>=1.5.6,<2.0,!=1.5.7"],
     },

+ 26 - 10
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/__init__.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/__init__.py

@@ -1,28 +1,44 @@
 """
-urllib3 - Thread-safe connection pooling and re-using.
+Python HTTP library with thread-safe connection pooling, file post support, user friendly, and more
 """
 from __future__ import absolute_import
-import warnings
 
-from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, connection_from_url
+# Set default logging handler to avoid "No handler found" warnings.
+import logging
+import warnings
+from logging import NullHandler
 
 from . import exceptions
+from ._version import __version__
+from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, connection_from_url
 from .filepost import encode_multipart_formdata
 from .poolmanager import PoolManager, ProxyManager, proxy_from_url
 from .response import HTTPResponse
 from .util.request import make_headers
-from .util.url import get_host
-from .util.timeout import Timeout
 from .util.retry import Retry
+from .util.timeout import Timeout
+from .util.url import get_host
 
-
-# Set default logging handler to avoid "No handler found" warnings.
-import logging
-from logging import NullHandler
+# === NOTE TO REPACKAGERS AND VENDORS ===
+# Please delete this block, this logic is only
+# for urllib3 being distributed via PyPI.
+# See: https://github.com/urllib3/urllib3/issues/2680
+try:
+    import urllib3_secure_extra  # type: ignore # noqa: F401
+except ImportError:
+    pass
+else:
+    warnings.warn(
+        "'urllib3[secure]' extra is deprecated and will be removed "
+        "in a future release of urllib3 2.x. Read more in this issue: "
+        "https://github.com/urllib3/urllib3/issues/2680",
+        category=DeprecationWarning,
+        stacklevel=2,
+    )
 
 __author__ = "Andrey Petrov (andrey.petrov@shazow.net)"
 __license__ = "MIT"
-__version__ = "1.25.8"
+__version__ = __version__
 
 __all__ = (
     "HTTPConnectionPool",

+ 5 - 4
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/_collections.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/_collections.py

@@ -17,9 +17,10 @@ except ImportError:  # Platform-specific: No threads available
 
 
 from collections import OrderedDict
-from .exceptions import InvalidHeader
-from .packages.six import iterkeys, itervalues, PY3
 
+from .exceptions import InvalidHeader
+from .packages import six
+from .packages.six import iterkeys, itervalues
 
 __all__ = ["RecentlyUsedContainer", "HTTPHeaderDict"]
 
@@ -174,7 +175,7 @@ class HTTPHeaderDict(MutableMapping):
     def __ne__(self, other):
         return not self.__eq__(other)
 
-    if not PY3:  # Python 2
+    if six.PY2:  # Python 2
         iterkeys = MutableMapping.iterkeys
         itervalues = MutableMapping.itervalues
 
@@ -190,7 +191,7 @@ class HTTPHeaderDict(MutableMapping):
 
     def pop(self, key, default=__marker):
         """D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
-          If key is not found, d is returned if given, otherwise KeyError is raised.
+        If key is not found, d is returned if given, otherwise KeyError is raised.
         """
         # Using the MutableMapping function directly fails due to the private marker.
         # Using ordinary dict.pop would expose the internal structures.

+ 2 - 0
desktop/core/ext-py/urllib3-1.26.12/src/urllib3/_version.py

@@ -0,0 +1,2 @@
+# This file is protected via CODEOWNERS
+__version__ = "1.26.12"

+ 216 - 63
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/connection.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/connection.py

@@ -1,13 +1,18 @@
 from __future__ import absolute_import
+
 import datetime
 import logging
 import os
+import re
 import socket
-from socket import error as SocketError, timeout as SocketTimeout
 import warnings
+from socket import error as SocketError
+from socket import timeout as SocketTimeout
+
 from .packages import six
 from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection
 from .packages.six.moves.http_client import HTTPException  # noqa: F401
+from .util.proxy import create_proxy_ssl_context
 
 try:  # Compiled with SSL?
     import ssl
@@ -29,26 +34,33 @@ except NameError:
         pass
 
 
+try:  # Python 3:
+    # Not a no-op, we're adding this to the namespace so it can be imported.
+    BrokenPipeError = BrokenPipeError
+except NameError:  # Python 2:
+
+    class BrokenPipeError(Exception):
+        pass
+
+
+from ._collections import HTTPHeaderDict  # noqa (historical, removed in v2)
+from ._version import __version__
 from .exceptions import (
-    NewConnectionError,
     ConnectTimeoutError,
+    NewConnectionError,
     SubjectAltNameWarning,
     SystemTimeWarning,
 )
-from .packages.ssl_match_hostname import match_hostname, CertificateError
-
+from .util import SKIP_HEADER, SKIPPABLE_HEADERS, connection
 from .util.ssl_ import (
-    resolve_cert_reqs,
-    resolve_ssl_version,
     assert_fingerprint,
     create_urllib3_context,
+    is_ipaddress,
+    resolve_cert_reqs,
+    resolve_ssl_version,
     ssl_wrap_socket,
 )
-
-
-from .util import connection
-
-from ._collections import HTTPHeaderDict
+from .util.ssl_match_hostname import CertificateError, match_hostname
 
 log = logging.getLogger(__name__)
 
@@ -56,37 +68,35 @@ port_by_scheme = {"http": 80, "https": 443}
 
 # When it comes time to update this value as a part of regular maintenance
 # (ie test_recent_date is failing) update it to ~6 months before the current date.
-RECENT_DATE = datetime.date(2019, 1, 1)
-
-
-class DummyConnection(object):
-    """Used to detect a failed ConnectionCls import."""
+RECENT_DATE = datetime.date(2022, 1, 1)
 
-    pass
+_CONTAINS_CONTROL_CHAR_RE = re.compile(r"[^-!#$%&'*+.^_`|~0-9a-zA-Z]")
 
 
 class HTTPConnection(_HTTPConnection, object):
     """
-    Based on httplib.HTTPConnection but provides an extra constructor
+    Based on :class:`http.client.HTTPConnection` but provides an extra constructor
     backwards-compatibility layer between older and newer Pythons.
 
     Additional keyword parameters are used to configure attributes of the connection.
     Accepted parameters include:
 
-      - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool`
-      - ``source_address``: Set the source address for the current connection.
-      - ``socket_options``: Set specific options on the underlying socket. If not specified, then
-        defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling
-        Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy.
+    - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool`
+    - ``source_address``: Set the source address for the current connection.
+    - ``socket_options``: Set specific options on the underlying socket. If not specified, then
+      defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling
+      Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy.
 
-        For example, if you wish to enable TCP Keep Alive in addition to the defaults,
-        you might pass::
+      For example, if you wish to enable TCP Keep Alive in addition to the defaults,
+      you might pass:
 
-            HTTPConnection.default_socket_options + [
-                (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),
-            ]
+      .. code-block:: python
 
-        Or you may want to disable the defaults by passing an empty list (e.g., ``[]``).
+         HTTPConnection.default_socket_options + [
+             (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),
+         ]
+
+      Or you may want to disable the defaults by passing an empty list (e.g., ``[]``).
     """
 
     default_port = port_by_scheme["http"]
@@ -98,6 +108,10 @@ class HTTPConnection(_HTTPConnection, object):
     #: Whether this connection verifies the host's certificate.
     is_verified = False
 
+    #: Whether this proxy connection (if used) verifies the proxy host's
+    #: certificate.
+    proxy_is_verified = None
+
     def __init__(self, *args, **kw):
         if not six.PY2:
             kw.pop("strict", None)
@@ -109,6 +123,10 @@ class HTTPConnection(_HTTPConnection, object):
         #: provided, we use the default options.
         self.socket_options = kw.pop("socket_options", self.default_socket_options)
 
+        # Proxy options provided by the user.
+        self.proxy = kw.pop("proxy", None)
+        self.proxy_config = kw.pop("proxy_config", None)
+
         _HTTPConnection.__init__(self, *args, **kw)
 
     @property
@@ -141,7 +159,7 @@ class HTTPConnection(_HTTPConnection, object):
         self._dns_host = value
 
     def _new_conn(self):
-        """ Establish a socket connection and set nodelay settings on it.
+        """Establish a socket connection and set nodelay settings on it.
 
         :return: New socket connection.
         """
@@ -171,10 +189,13 @@ class HTTPConnection(_HTTPConnection, object):
 
         return conn
 
+    def _is_using_tunnel(self):
+        # Google App Engine's httplib does not define _tunnel_host
+        return getattr(self, "_tunnel_host", None)
+
     def _prepare_conn(self, conn):
         self.sock = conn
-        # Google App Engine's httplib does not define _tunnel_host
-        if getattr(self, "_tunnel_host", None):
+        if self._is_using_tunnel():
             # TODO: Fix tunnel so it doesn't depend on self.sock state.
             self._tunnel()
             # Mark this connection as not reusable
@@ -184,20 +205,56 @@ class HTTPConnection(_HTTPConnection, object):
         conn = self._new_conn()
         self._prepare_conn(conn)
 
+    def putrequest(self, method, url, *args, **kwargs):
+        """ """
+        # Empty docstring because the indentation of CPython's implementation
+        # is broken but we don't want this method in our documentation.
+        match = _CONTAINS_CONTROL_CHAR_RE.search(method)
+        if match:
+            raise ValueError(
+                "Method cannot contain non-token characters %r (found at least %r)"
+                % (method, match.group())
+            )
+
+        return _HTTPConnection.putrequest(self, method, url, *args, **kwargs)
+
+    def putheader(self, header, *values):
+        """ """
+        if not any(isinstance(v, str) and v == SKIP_HEADER for v in values):
+            _HTTPConnection.putheader(self, header, *values)
+        elif six.ensure_str(header.lower()) not in SKIPPABLE_HEADERS:
+            raise ValueError(
+                "urllib3.util.SKIP_HEADER only supports '%s'"
+                % ("', '".join(map(str.title, sorted(SKIPPABLE_HEADERS))),)
+            )
+
+    def request(self, method, url, body=None, headers=None):
+        if headers is None:
+            headers = {}
+        else:
+            # Avoid modifying the headers passed into .request()
+            headers = headers.copy()
+        if "user-agent" not in (six.ensure_str(k.lower()) for k in headers):
+            headers["User-Agent"] = _get_default_user_agent()
+        super(HTTPConnection, self).request(method, url, body=body, headers=headers)
+
     def request_chunked(self, method, url, body=None, headers=None):
         """
         Alternative to the common request method, which sends the
         body with chunked encoding and not as one block
         """
-        headers = HTTPHeaderDict(headers if headers is not None else {})
-        skip_accept_encoding = "accept-encoding" in headers
-        skip_host = "host" in headers
+        headers = headers or {}
+        header_keys = set([six.ensure_str(k.lower()) for k in headers])
+        skip_accept_encoding = "accept-encoding" in header_keys
+        skip_host = "host" in header_keys
         self.putrequest(
             method, url, skip_accept_encoding=skip_accept_encoding, skip_host=skip_host
         )
+        if "user-agent" not in header_keys:
+            self.putheader("User-Agent", _get_default_user_agent())
         for header, value in headers.items():
             self.putheader(header, value)
-        if "transfer-encoding" not in headers:
+        if "transfer-encoding" not in header_keys:
             self.putheader("Transfer-Encoding", "chunked")
         self.endheaders()
 
@@ -211,19 +268,31 @@ class HTTPConnection(_HTTPConnection, object):
                 if not isinstance(chunk, bytes):
                     chunk = chunk.encode("utf8")
                 len_str = hex(len(chunk))[2:]
-                self.send(len_str.encode("utf-8"))
-                self.send(b"\r\n")
-                self.send(chunk)
-                self.send(b"\r\n")
+                to_send = bytearray(len_str.encode())
+                to_send += b"\r\n"
+                to_send += chunk
+                to_send += b"\r\n"
+                self.send(to_send)
 
         # After the if clause, to always have a closed body
         self.send(b"0\r\n\r\n")
 
 
 class HTTPSConnection(HTTPConnection):
+    """
+    Many of the parameters to this constructor are passed to the underlying SSL
+    socket by means of :py:func:`urllib3.util.ssl_wrap_socket`.
+    """
+
     default_port = port_by_scheme["https"]
 
+    cert_reqs = None
+    ca_certs = None
+    ca_cert_dir = None
+    ca_cert_data = None
     ssl_version = None
+    assert_fingerprint = None
+    tls_in_tls_required = False
 
     def __init__(
         self,
@@ -251,19 +320,6 @@ class HTTPSConnection(HTTPConnection):
         # HTTPS requests to go out as HTTP. (See Issue #356)
         self._protocol = "https"
 
-
-class VerifiedHTTPSConnection(HTTPSConnection):
-    """
-    Based on httplib.HTTPSConnection but wraps the socket with
-    SSL certification.
-    """
-
-    cert_reqs = None
-    ca_certs = None
-    ca_cert_dir = None
-    ssl_version = None
-    assert_fingerprint = None
-
     def set_cert(
         self,
         key_file=None,
@@ -274,6 +330,7 @@ class VerifiedHTTPSConnection(HTTPSConnection):
         assert_hostname=None,
         assert_fingerprint=None,
         ca_cert_dir=None,
+        ca_cert_data=None,
     ):
         """
         This method should only be called once, before the connection is used.
@@ -294,15 +351,19 @@ class VerifiedHTTPSConnection(HTTPSConnection):
         self.assert_fingerprint = assert_fingerprint
         self.ca_certs = ca_certs and os.path.expanduser(ca_certs)
         self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir)
+        self.ca_cert_data = ca_cert_data
 
     def connect(self):
         # Add certificate verification
-        conn = self._new_conn()
+        self.sock = conn = self._new_conn()
         hostname = self.host
+        tls_in_tls = False
+
+        if self._is_using_tunnel():
+            if self.tls_in_tls_required:
+                self.sock = conn = self._connect_tls_proxy(hostname, conn)
+                tls_in_tls = True
 
-        # Google App Engine's httplib does not define _tunnel_host
-        if getattr(self, "_tunnel_host", None):
-            self.sock = conn
             # Calls self._set_hostport(), so self.host is
             # self._tunnel_host below.
             self._tunnel()
@@ -344,6 +405,7 @@ class VerifiedHTTPSConnection(HTTPSConnection):
         if (
             not self.ca_certs
             and not self.ca_cert_dir
+            and not self.ca_cert_data
             and default_ssl_context
             and hasattr(context, "load_default_certs")
         ):
@@ -356,10 +418,29 @@ class VerifiedHTTPSConnection(HTTPSConnection):
             key_password=self.key_password,
             ca_certs=self.ca_certs,
             ca_cert_dir=self.ca_cert_dir,
+            ca_cert_data=self.ca_cert_data,
             server_hostname=server_hostname,
             ssl_context=context,
+            tls_in_tls=tls_in_tls,
         )
 
+        # If we're using all defaults and the connection
+        # is TLSv1 or TLSv1.1 we throw a DeprecationWarning
+        # for the host.
+        if (
+            default_ssl_context
+            and self.ssl_version is None
+            and hasattr(self.sock, "version")
+            and self.sock.version() in {"TLSv1", "TLSv1.1"}
+        ):
+            warnings.warn(
+                "Negotiating TLSv1/TLSv1.1 by default is deprecated "
+                "and will be disabled in urllib3 v2.0.0. Connecting to "
+                "'%s' with '%s' can be enabled by explicitly opting-in "
+                "with 'ssl_version'" % (self.host, self.sock.version()),
+                DeprecationWarning,
+            )
+
         if self.assert_fingerprint:
             assert_fingerprint(
                 self.sock.getpeercert(binary_form=True), self.assert_fingerprint
@@ -390,8 +471,71 @@ class VerifiedHTTPSConnection(HTTPSConnection):
             or self.assert_fingerprint is not None
         )
 
+    def _connect_tls_proxy(self, hostname, conn):
+        """
+        Establish a TLS connection to the proxy using the provided SSL context.
+        """
+        proxy_config = self.proxy_config
+        ssl_context = proxy_config.ssl_context
+        if ssl_context:
+            # If the user provided a proxy context, we assume CA and client
+            # certificates have already been set
+            return ssl_wrap_socket(
+                sock=conn,
+                server_hostname=hostname,
+                ssl_context=ssl_context,
+            )
+
+        ssl_context = create_proxy_ssl_context(
+            self.ssl_version,
+            self.cert_reqs,
+            self.ca_certs,
+            self.ca_cert_dir,
+            self.ca_cert_data,
+        )
+
+        # If no cert was provided, use only the default options for server
+        # certificate validation
+        socket = ssl_wrap_socket(
+            sock=conn,
+            ca_certs=self.ca_certs,
+            ca_cert_dir=self.ca_cert_dir,
+            ca_cert_data=self.ca_cert_data,
+            server_hostname=hostname,
+            ssl_context=ssl_context,
+        )
+
+        if ssl_context.verify_mode != ssl.CERT_NONE and not getattr(
+            ssl_context, "check_hostname", False
+        ):
+            # While urllib3 attempts to always turn off hostname matching from
+            # the TLS library, this cannot always be done. So we check whether
+            # the TLS Library still thinks it's matching hostnames.
+            cert = socket.getpeercert()
+            if not cert.get("subjectAltName", ()):
+                warnings.warn(
+                    (
+                        "Certificate for {0} has no `subjectAltName`, falling back to check for a "
+                        "`commonName` for now. This feature is being removed by major browsers and "
+                        "deprecated by RFC 2818. (See https://github.com/urllib3/urllib3/issues/497 "
+                        "for details.)".format(hostname)
+                    ),
+                    SubjectAltNameWarning,
+                )
+            _match_hostname(cert, hostname)
+
+        self.proxy_is_verified = ssl_context.verify_mode == ssl.CERT_REQUIRED
+        return socket
+
 
 def _match_hostname(cert, asserted_hostname):
+    # Our upstream implementation of ssl.match_hostname()
+    # only applies this normalization to IP addresses so it doesn't
+    # match DNS SANs so we do the same thing!
+    stripped_hostname = asserted_hostname.strip("u[]")
+    if is_ipaddress(stripped_hostname):
+        asserted_hostname = stripped_hostname
+
     try:
         match_hostname(cert, asserted_hostname)
     except CertificateError as e:
@@ -406,9 +550,18 @@ def _match_hostname(cert, asserted_hostname):
         raise
 
 
-if ssl:
-    # Make a copy for testing.
-    UnverifiedHTTPSConnection = HTTPSConnection
-    HTTPSConnection = VerifiedHTTPSConnection
-else:
-    HTTPSConnection = DummyConnection
+def _get_default_user_agent():
+    return "python-urllib3/%s" % __version__
+
+
+class DummyConnection(object):
+    """Used to detect a failed ConnectionCls import."""
+
+    pass
+
+
+if not ssl:
+    HTTPSConnection = DummyConnection  # noqa: F811
+
+
+VerifiedHTTPSConnection = HTTPSConnection

+ 151 - 92
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/connectionpool.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/connectionpool.py

@@ -1,57 +1,54 @@
 from __future__ import absolute_import
+
 import errno
 import logging
+import re
+import socket
 import sys
 import warnings
+from socket import error as SocketError
+from socket import timeout as SocketTimeout
 
-from socket import error as SocketError, timeout as SocketTimeout
-import socket
-
-
+from .connection import (
+    BaseSSLError,
+    BrokenPipeError,
+    DummyConnection,
+    HTTPConnection,
+    HTTPException,
+    HTTPSConnection,
+    VerifiedHTTPSConnection,
+    port_by_scheme,
+)
 from .exceptions import (
     ClosedPoolError,
-    ProtocolError,
     EmptyPoolError,
     HeaderParsingError,
     HostChangedError,
+    InsecureRequestWarning,
     LocationValueError,
     MaxRetryError,
+    NewConnectionError,
+    ProtocolError,
     ProxyError,
     ReadTimeoutError,
     SSLError,
     TimeoutError,
-    InsecureRequestWarning,
-    NewConnectionError,
 )
-from .packages.ssl_match_hostname import CertificateError
 from .packages import six
 from .packages.six.moves import queue
-from .connection import (
-    port_by_scheme,
-    DummyConnection,
-    HTTPConnection,
-    HTTPSConnection,
-    VerifiedHTTPSConnection,
-    HTTPException,
-    BaseSSLError,
-)
 from .request import RequestMethods
 from .response import HTTPResponse
-
 from .util.connection import is_connection_dropped
+from .util.proxy import connection_requires_http_tunnel
+from .util.queue import LifoQueue
 from .util.request import set_file_position
 from .util.response import assert_header_parsing
 from .util.retry import Retry
+from .util.ssl_match_hostname import CertificateError
 from .util.timeout import Timeout
-from .util.url import (
-    get_host,
-    parse_url,
-    Url,
-    _normalize_host as normalize_host,
-    _encode_target,
-)
-from .util.queue import LifoQueue
-
+from .util.url import Url, _encode_target
+from .util.url import _normalize_host as normalize_host
+from .util.url import get_host, parse_url
 
 xrange = six.moves.xrange
 
@@ -65,6 +62,11 @@ class ConnectionPool(object):
     """
     Base class for all connection pools, such as
     :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`.
+
+    .. note::
+       ConnectionPool.urlopen() does not normalize or percent-encode target URIs
+       which is useful if your target server doesn't support percent-encoded
+       target URIs.
     """
 
     scheme = None
@@ -106,16 +108,16 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
 
     :param host:
         Host used for this HTTP Connection (e.g. "localhost"), passed into
-        :class:`httplib.HTTPConnection`.
+        :class:`http.client.HTTPConnection`.
 
     :param port:
         Port used for this HTTP Connection (None is equivalent to 80), passed
-        into :class:`httplib.HTTPConnection`.
+        into :class:`http.client.HTTPConnection`.
 
     :param strict:
         Causes BadStatusLine to be raised if the status line can't be parsed
         as a valid HTTP/1.0 or 1.1 status line, passed into
-        :class:`httplib.HTTPConnection`.
+        :class:`http.client.HTTPConnection`.
 
         .. note::
            Only works in Python 2. This parameter is ignored in Python 3.
@@ -149,11 +151,11 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
 
     :param _proxy:
         Parsed proxy URL, should not be used directly, instead, see
-        :class:`urllib3.connectionpool.ProxyManager`"
+        :class:`urllib3.ProxyManager`
 
     :param _proxy_headers:
         A dictionary with proxy headers, should not be used directly,
-        instead, see :class:`urllib3.connectionpool.ProxyManager`"
+        instead, see :class:`urllib3.ProxyManager`
 
     :param \\**conn_kw:
         Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`,
@@ -176,6 +178,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
         retries=None,
         _proxy=None,
         _proxy_headers=None,
+        _proxy_config=None,
         **conn_kw
     ):
         ConnectionPool.__init__(self, host, port)
@@ -197,6 +200,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
 
         self.proxy = _proxy
         self.proxy_headers = _proxy_headers or {}
+        self.proxy_config = _proxy_config
 
         # Fill the queue up so that doing get() on it will block properly
         for _ in xrange(maxsize):
@@ -213,6 +217,9 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
             # list.
             self.conn_kw.setdefault("socket_options", [])
 
+            self.conn_kw["proxy"] = self.proxy
+            self.conn_kw["proxy_config"] = self.proxy_config
+
     def _new_conn(self):
         """
         Return a fresh :class:`HTTPConnection`.
@@ -263,11 +270,11 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
 
         # If this is a persistent connection, check if it got disconnected
         if conn and is_connection_dropped(conn):
-            log.debug("Resetting dropped connection: %s:%s", self.host, self.port or "80")
+            log.debug("Resetting dropped connection: %s", self.host)
             conn.close()
             if getattr(conn, "auto_open", 1) == 0:
                 # This is a proxied connection that has been mutated by
-                # httplib._tunnel() and cannot be reused (since it would
+                # http.client._tunnel() and cannot be reused (since it would
                 # attempt to bypass the proxy)
                 conn = None
 
@@ -295,8 +302,11 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
             pass
         except queue.Full:
             # This should never happen if self.block == True
-            log.warning("Connection pool is full, discarding connection: %s:%s", self.host, self.port or "80")
-
+            log.warning(
+                "Connection pool is full, discarding connection: %s. Connection pool size: %s",
+                self.host,
+                self.pool.qsize(),
+            )
         # Connection never got put back into the pool, close it.
         if conn:
             conn.close()
@@ -312,7 +322,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
         pass
 
     def _get_timeout(self, timeout):
-        """ Helper that always returns a :class:`urllib3.util.Timeout` """
+        """Helper that always returns a :class:`urllib3.util.Timeout`"""
         if timeout is _Default:
             return self.timeout.clone()
 
@@ -379,12 +389,30 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
             self._raise_timeout(err=e, url=url, timeout_value=conn.timeout)
             raise
 
-        # conn.request() calls httplib.*.request, not the method in
+        # conn.request() calls http.client.*.request, not the method in
         # urllib3.request. It also calls makefile (recv) on the socket.
-        if chunked:
-            conn.request_chunked(method, url, **httplib_request_kw)
-        else:
-            conn.request(method, url, **httplib_request_kw)
+        try:
+            if chunked:
+                conn.request_chunked(method, url, **httplib_request_kw)
+            else:
+                conn.request(method, url, **httplib_request_kw)
+
+        # We are swallowing BrokenPipeError (errno.EPIPE) since the server is
+        # legitimately able to close the connection after sending a valid response.
+        # With this behaviour, the received response is still readable.
+        except BrokenPipeError:
+            # Python 3
+            pass
+        except IOError as e:
+            # Python 2 and macOS/Linux
+            # EPIPE and ESHUTDOWN are BrokenPipeError on Python 2, and EPROTOTYPE is needed on macOS
+            # https://erickt.github.io/blog/2014/11/19/adventures-in-debugging-a-potential-osx-kernel-bug/
+            if e.errno not in {
+                errno.EPIPE,
+                errno.ESHUTDOWN,
+                errno.EPROTOTYPE,
+            }:
+                raise
 
         # Reset the timeout for the recv() on the socket
         read_timeout = timeout_obj.read_timeout
@@ -527,10 +555,12 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
         :param method:
             HTTP request method (such as GET, POST, PUT, etc.)
 
+        :param url:
+            The URL to perform the request on.
+
         :param body:
-            Data to send in the request body (useful for creating
-            POST requests, see HTTPConnectionPool.post_url for
-            more convenience).
+            Data to send in the request body, either :class:`str`, :class:`bytes`,
+            an iterable of :class:`str`/:class:`bytes`, or a file-like object.
 
         :param headers:
             Dictionary of custom headers to send, such as User-Agent,
@@ -560,7 +590,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
 
         :param assert_same_host:
             If ``True``, will make sure that the host of the pool requests is
-            consistent else will raise HostChangedError. When False, you can
+            consistent else will raise HostChangedError. When ``False``, you can
             use the pool on an HTTP proxy and request foreign hosts.
 
         :param timeout:
@@ -597,6 +627,10 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
             Additional parameters are passed to
             :meth:`urllib3.response.HTTPResponse.from_httplib`
         """
+
+        parsed_url = parse_url(url)
+        destination_scheme = parsed_url.scheme
+
         if headers is None:
             headers = self.headers
 
@@ -614,7 +648,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
         if url.startswith("/"):
             url = six.ensure_str(_encode_target(url))
         else:
-            url = six.ensure_str(parse_url(url).url)
+            url = six.ensure_str(parsed_url.url)
 
         conn = None
 
@@ -629,10 +663,14 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
         # [1] <https://github.com/urllib3/urllib3/issues/651>
         release_this_conn = release_conn
 
-        # Merge the proxy headers. Only do this in HTTP. We have to copy the
-        # headers dict so we can safely change it without those changes being
-        # reflected in anyone else's copy.
-        if self.scheme == "http":
+        http_tunnel_required = connection_requires_http_tunnel(
+            self.proxy, self.proxy_config, destination_scheme
+        )
+
+        # Merge the proxy headers. Only done when not using HTTP CONNECT. We
+        # have to copy the headers dict so we can safely change it without those
+        # changes being reflected in anyone else's copy.
+        if not http_tunnel_required:
             headers = headers.copy()
             headers.update(self.proxy_headers)
 
@@ -658,7 +696,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
             is_new_proxy_conn = self.proxy is not None and not getattr(
                 conn, "sock", None
             )
-            if is_new_proxy_conn:
+            if is_new_proxy_conn and http_tunnel_required:
                 self._prepare_proxy(conn)
 
             # Make the request on the httplib connection object.
@@ -693,9 +731,11 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
             # Everything went great!
             clean_exit = True
 
-        except queue.Empty:
-            # Timed out by queue.
-            raise EmptyPoolError(self, "No pool connections are available.")
+        except EmptyPoolError:
+            # Didn't get a connection from the pool, no need to clean up
+            clean_exit = True
+            release_this_conn = False
+            raise
 
         except (
             TimeoutError,
@@ -709,7 +749,35 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
             # Discard the connection for these exceptions. It will be
             # replaced during the next _get_conn() call.
             clean_exit = False
-            if isinstance(e, (BaseSSLError, CertificateError)):
+
+            def _is_ssl_error_message_from_http_proxy(ssl_error):
+                # We're trying to detect the message 'WRONG_VERSION_NUMBER' but
+                # SSLErrors are kinda all over the place when it comes to the message,
+                # so we try to cover our bases here!
+                message = " ".join(re.split("[^a-z]", str(ssl_error).lower()))
+                return (
+                    "wrong version number" in message or "unknown protocol" in message
+                )
+
+            # Try to detect a common user error with proxies which is to
+            # set an HTTP proxy to be HTTPS when it should be 'http://'
+            # (ie {'http': 'http://proxy', 'https': 'https://proxy'})
+            # Instead we add a nice error message and point to a URL.
+            if (
+                isinstance(e, BaseSSLError)
+                and self.proxy
+                and _is_ssl_error_message_from_http_proxy(e)
+                and conn.proxy
+                and conn.proxy.scheme == "https"
+            ):
+                e = ProxyError(
+                    "Your proxy appears to only use HTTP and not HTTPS, "
+                    "try changing your proxy URL to be HTTP. See: "
+                    "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html"
+                    "#https-proxy-error-http-proxy",
+                    SSLError(e),
+                )
+            elif isinstance(e, (BaseSSLError, CertificateError)):
                 e = SSLError(e)
             elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy:
                 e = ProxyError("Cannot connect to proxy.", e)
@@ -760,21 +828,6 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
                 **response_kw
             )
 
-        def drain_and_release_conn(response):
-            try:
-                # discard any remaining response body, the connection will be
-                # released back to the pool once the entire response is read
-                response.read()
-            except (
-                TimeoutError,
-                HTTPException,
-                SocketError,
-                ProtocolError,
-                BaseSSLError,
-                SSLError,
-            ):
-                pass
-
         # Handle redirect?
         redirect_location = redirect and response.get_redirect_location()
         if redirect_location:
@@ -785,15 +838,11 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
                 retries = retries.increment(method, url, response=response, _pool=self)
             except MaxRetryError:
                 if retries.raise_on_redirect:
-                    # Drain and release the connection for this response, since
-                    # we're not returning it to be released manually.
-                    drain_and_release_conn(response)
+                    response.drain_conn()
                     raise
                 return response
 
-            # drain and return the connection to the pool before recursing
-            drain_and_release_conn(response)
-
+            response.drain_conn()
             retries.sleep_for_retry(response)
             log.debug("Redirecting %s -> %s", url, redirect_location)
             return self.urlopen(
@@ -819,15 +868,11 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
                 retries = retries.increment(method, url, response=response, _pool=self)
             except MaxRetryError:
                 if retries.raise_on_status:
-                    # Drain and release the connection for this response, since
-                    # we're not returning it to be released manually.
-                    drain_and_release_conn(response)
+                    response.drain_conn()
                     raise
                 return response
 
-            # drain and return the connection to the pool before recursing
-            drain_and_release_conn(response)
-
+            response.drain_conn()
             retries.sleep(response)
             log.debug("Retry: %s", url)
             return self.urlopen(
@@ -853,11 +898,7 @@ class HTTPSConnectionPool(HTTPConnectionPool):
     """
     Same as :class:`.HTTPConnectionPool`, but HTTPS.
 
-    When Python is compiled with the :mod:`ssl` module, then
-    :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates,
-    instead of :class:`.HTTPSConnection`.
-
-    :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``,
+    :class:`.HTTPSConnection` uses one of ``assert_fingerprint``,
     ``assert_hostname`` and ``host`` in this order to verify connections.
     If ``assert_hostname`` is False, no verification is done.
 
@@ -941,15 +982,22 @@ class HTTPSConnectionPool(HTTPConnectionPool):
 
     def _prepare_proxy(self, conn):
         """
-        Establish tunnel connection early, because otherwise httplib
-        would improperly set Host: header to proxy's IP:port.
+        Establishes a tunnel connection through HTTP CONNECT.
+
+        Tunnel connection is established early because otherwise httplib would
+        improperly set Host: header to proxy's IP:port.
         """
+
         conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers)
+
+        if self.proxy.scheme == "https":
+            conn.tls_in_tls_required = True
+
         conn.connect()
 
     def _new_conn(self):
         """
-        Return a fresh :class:`httplib.HTTPSConnection`.
+        Return a fresh :class:`http.client.HTTPSConnection`.
         """
         self.num_connections += 1
         log.debug(
@@ -998,12 +1046,23 @@ class HTTPSConnectionPool(HTTPConnectionPool):
                 (
                     "Unverified HTTPS request is being made to host '%s'. "
                     "Adding certificate verification is strongly advised. See: "
-                    "https://urllib3.readthedocs.io/en/latest/advanced-usage.html"
+                    "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html"
                     "#ssl-warnings" % conn.host
                 ),
                 InsecureRequestWarning,
             )
 
+        if getattr(conn, "proxy_is_verified", None) is False:
+            warnings.warn(
+                (
+                    "Unverified HTTPS connection done to an HTTPS proxy. "
+                    "Adding certificate verification is strongly advised. See: "
+                    "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html"
+                    "#ssl-warnings"
+                ),
+                InsecureRequestWarning,
+            )
+
 
 def connection_from_url(url, **kw):
     """

+ 0 - 0
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/contrib/__init__.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/__init__.py


+ 0 - 0
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/contrib/_appengine_environ.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/_appengine_environ.py


+ 0 - 0
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/contrib/_securetransport/__init__.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/_securetransport/__init__.py


+ 44 - 18
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/contrib/_securetransport/bindings.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/_securetransport/bindings.py

@@ -32,30 +32,26 @@ license and by oscrypto's:
 from __future__ import absolute_import
 
 import platform
-from ctypes.util import find_library
 from ctypes import (
-    c_void_p,
-    c_int32,
+    CDLL,
+    CFUNCTYPE,
+    POINTER,
+    c_bool,
+    c_byte,
     c_char_p,
+    c_int32,
+    c_long,
     c_size_t,
-    c_byte,
     c_uint32,
     c_ulong,
-    c_long,
-    c_bool,
+    c_void_p,
 )
-from ctypes import CDLL, POINTER, CFUNCTYPE
-
-
-security_path = find_library("Security")
-if not security_path:
-    raise ImportError("The library Security could not be found")
-
+from ctypes.util import find_library
 
-core_foundation_path = find_library("CoreFoundation")
-if not core_foundation_path:
-    raise ImportError("The library CoreFoundation could not be found")
+from ...packages.six import raise_from
 
+if platform.system() != "Darwin":
+    raise ImportError("Only macOS is supported")
 
 version = platform.mac_ver()[0]
 version_info = tuple(map(int, version.split(".")))
@@ -65,8 +61,31 @@ if version_info < (10, 8):
         % (version_info[0], version_info[1])
     )
 
-Security = CDLL(security_path, use_errno=True)
-CoreFoundation = CDLL(core_foundation_path, use_errno=True)
+
+def load_cdll(name, macos10_16_path):
+    """Loads a CDLL by name, falling back to known path on 10.16+"""
+    try:
+        # Big Sur is technically 11 but we use 10.16 due to the Big Sur
+        # beta being labeled as 10.16.
+        if version_info >= (10, 16):
+            path = macos10_16_path
+        else:
+            path = find_library(name)
+        if not path:
+            raise OSError  # Caught and reraised as 'ImportError'
+        return CDLL(path, use_errno=True)
+    except OSError:
+        raise_from(ImportError("The library %s failed to load" % name), None)
+
+
+Security = load_cdll(
+    "Security", "/System/Library/Frameworks/Security.framework/Security"
+)
+CoreFoundation = load_cdll(
+    "CoreFoundation",
+    "/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation",
+)
+
 
 Boolean = c_bool
 CFIndex = c_long
@@ -276,6 +295,13 @@ try:
     Security.SSLSetProtocolVersionMax.argtypes = [SSLContextRef, SSLProtocol]
     Security.SSLSetProtocolVersionMax.restype = OSStatus
 
+    try:
+        Security.SSLSetALPNProtocols.argtypes = [SSLContextRef, CFArrayRef]
+        Security.SSLSetALPNProtocols.restype = OSStatus
+    except AttributeError:
+        # Supported only in 10.12+
+        pass
+
     Security.SecCopyErrorMessageString.argtypes = [OSStatus, c_void_p]
     Security.SecCopyErrorMessageString.restype = CFStringRef
 

+ 72 - 3
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/contrib/_securetransport/low_level.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/_securetransport/low_level.py

@@ -10,13 +10,13 @@ appropriate and useful assistance to the higher-level code.
 import base64
 import ctypes
 import itertools
-import re
 import os
+import re
 import ssl
+import struct
 import tempfile
 
-from .bindings import Security, CoreFoundation, CFConst
-
+from .bindings import CFConst, CoreFoundation, Security
 
 # This regular expression is used to grab PEM data out of a PEM bundle.
 _PEM_CERTS_RE = re.compile(
@@ -56,6 +56,51 @@ def _cf_dictionary_from_tuples(tuples):
     )
 
 
+def _cfstr(py_bstr):
+    """
+    Given a Python binary data, create a CFString.
+    The string must be CFReleased by the caller.
+    """
+    c_str = ctypes.c_char_p(py_bstr)
+    cf_str = CoreFoundation.CFStringCreateWithCString(
+        CoreFoundation.kCFAllocatorDefault,
+        c_str,
+        CFConst.kCFStringEncodingUTF8,
+    )
+    return cf_str
+
+
+def _create_cfstring_array(lst):
+    """
+    Given a list of Python binary data, create an associated CFMutableArray.
+    The array must be CFReleased by the caller.
+
+    Raises an ssl.SSLError on failure.
+    """
+    cf_arr = None
+    try:
+        cf_arr = CoreFoundation.CFArrayCreateMutable(
+            CoreFoundation.kCFAllocatorDefault,
+            0,
+            ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks),
+        )
+        if not cf_arr:
+            raise MemoryError("Unable to allocate memory!")
+        for item in lst:
+            cf_str = _cfstr(item)
+            if not cf_str:
+                raise MemoryError("Unable to allocate memory!")
+            try:
+                CoreFoundation.CFArrayAppendValue(cf_arr, cf_str)
+            finally:
+                CoreFoundation.CFRelease(cf_str)
+    except BaseException as e:
+        if cf_arr:
+            CoreFoundation.CFRelease(cf_arr)
+        raise ssl.SSLError("Unable to allocate array: %s" % (e,))
+    return cf_arr
+
+
 def _cf_string_to_unicode(value):
     """
     Creates a Unicode string from a CFString object. Used entirely for error
@@ -143,6 +188,7 @@ def _cert_array_from_pem(pem_bundle):
         # We only want to do that if an error occurs: otherwise, the caller
         # should free.
         CoreFoundation.CFRelease(cert_array)
+        raise
 
     return cert_array
 
@@ -326,3 +372,26 @@ def _load_client_cert_chain(keychain, *paths):
     finally:
         for obj in itertools.chain(identities, certificates):
             CoreFoundation.CFRelease(obj)
+
+
+TLS_PROTOCOL_VERSIONS = {
+    "SSLv2": (0, 2),
+    "SSLv3": (3, 0),
+    "TLSv1": (3, 1),
+    "TLSv1.1": (3, 2),
+    "TLSv1.2": (3, 3),
+}
+
+
+def _build_tls_unknown_ca_alert(version):
+    """
+    Builds a TLS alert record for an unknown CA.
+    """
+    ver_maj, ver_min = TLS_PROTOCOL_VERSIONS[version]
+    severity_fatal = 0x02
+    description_unknown_ca = 0x30
+    msg = struct.pack(">BB", severity_fatal, description_unknown_ca)
+    msg_len = len(msg)
+    record_type_alert = 0x15
+    record = struct.pack(">BBBH", record_type_alert, ver_maj, ver_min, msg_len) + msg
+    return record

+ 6 - 6
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/contrib/appengine.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/appengine.py

@@ -39,24 +39,24 @@ urllib3 on Google App Engine:
 """
 
 from __future__ import absolute_import
+
 import io
 import logging
 import warnings
-from ..packages.six.moves.urllib.parse import urljoin
 
 from ..exceptions import (
     HTTPError,
     HTTPWarning,
     MaxRetryError,
     ProtocolError,
-    TimeoutError,
     SSLError,
+    TimeoutError,
 )
-
+from ..packages.six.moves.urllib.parse import urljoin
 from ..request import RequestMethods
 from ..response import HTTPResponse
-from ..util.timeout import Timeout
 from ..util.retry import Retry
+from ..util.timeout import Timeout
 from . import _appengine_environ
 
 try:
@@ -90,7 +90,7 @@ class AppEngineManager(RequestMethods):
         * If you attempt to use this on App Engine Flexible, as full socket
           support is available.
         * If a request size is more than 10 megabytes.
-        * If a response size is more than 32 megabtyes.
+        * If a response size is more than 32 megabytes.
         * If you use an unsupported request method such as OPTIONS.
 
     Beyond those cases, it will raise normal urllib3 errors.
@@ -111,7 +111,7 @@ class AppEngineManager(RequestMethods):
         warnings.warn(
             "urllib3 is using URLFetch on Google App Engine sandbox instead "
             "of sockets. To use sockets directly instead of URLFetch see "
-            "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.",
+            "https://urllib3.readthedocs.io/en/1.26.x/reference/urllib3.contrib.html.",
             AppEnginePlatformWarning,
         )
 

+ 9 - 0
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/contrib/ntlmpool.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/ntlmpool.py

@@ -5,12 +5,21 @@ Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10
 """
 from __future__ import absolute_import
 
+import warnings
 from logging import getLogger
+
 from ntlm import ntlm
 
 from .. import HTTPSConnectionPool
 from ..packages.six.moves.http_client import HTTPSConnection
 
+warnings.warn(
+    "The 'urllib3.contrib.ntlmpool' module is deprecated and will be removed "
+    "in urllib3 v2.0 release, urllib3 is not able to support it properly due "
+    "to reasons listed in issue: https://github.com/urllib3/urllib3/issues/2282. "
+    "If you are a user of this module please comment in the mentioned issue.",
+    DeprecationWarning,
+)
 
 log = getLogger(__name__)
 

+ 37 - 16
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/contrib/pyopenssl.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/pyopenssl.py

@@ -1,27 +1,31 @@
 """
-SSL with SNI_-support for Python 2. Follow these instructions if you would
-like to verify SSL certificates in Python 2. Note, the default libraries do
+TLS with SNI_-support for Python 2. Follow these instructions if you would
+like to verify TLS certificates in Python 2. Note, the default libraries do
 *not* do certificate checking; you need to do additional work to validate
 certificates yourself.
 
 This needs the following packages installed:
 
-* pyOpenSSL (tested with 16.0.0)
-* cryptography (minimum 1.3.4, from pyopenssl)
-* idna (minimum 2.0, from cryptography)
+* `pyOpenSSL`_ (tested with 16.0.0)
+* `cryptography`_ (minimum 1.3.4, from pyopenssl)
+* `idna`_ (minimum 2.0, from cryptography)
 
 However, pyopenssl depends on cryptography, which depends on idna, so while we
 use all three directly here we end up having relatively few packages required.
 
 You can install them with the following command:
 
-    pip install pyopenssl cryptography idna
+.. code-block:: bash
+
+    $ python -m pip install pyopenssl cryptography idna
 
 To activate certificate checking, call
 :func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code
 before you begin making HTTP requests. This can be done in a ``sitecustomize``
 module, or at any other time before your application begins using ``urllib3``,
-like this::
+like this:
+
+.. code-block:: python
 
     try:
         import urllib3.contrib.pyopenssl
@@ -35,11 +39,11 @@ when the required modules are installed.
 Activating this module also has the positive side effect of disabling SSL/TLS
 compression in Python 2 (see `CRIME attack`_).
 
-If you want to configure the default list of supported cipher suites, you can
-set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable.
-
 .. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication
 .. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit)
+.. _pyopenssl: https://www.pyopenssl.org
+.. _cryptography: https://cryptography.io
+.. _idna: https://github.com/kjd/idna
 """
 from __future__ import absolute_import
 
@@ -56,8 +60,9 @@ except ImportError:
         pass
 
 
-from socket import timeout, error as SocketError
 from io import BytesIO
+from socket import error as SocketError
+from socket import timeout
 
 try:  # Platform-specific: Python 2
     from socket import _fileobject
@@ -67,11 +72,20 @@ except ImportError:  # Platform-specific: Python 3
 
 import logging
 import ssl
-from ..packages import six
 import sys
+import warnings
 
 from .. import util
+from ..packages import six
+from ..util.ssl_ import PROTOCOL_TLS_CLIENT
 
+warnings.warn(
+    "'urllib3.contrib.pyopenssl' module is deprecated and will be removed "
+    "in a future release of urllib3 2.x. Read more in this issue: "
+    "https://github.com/urllib3/urllib3/issues/2680",
+    category=DeprecationWarning,
+    stacklevel=2,
+)
 
 __all__ = ["inject_into_urllib3", "extract_from_urllib3"]
 
@@ -81,6 +95,7 @@ HAS_SNI = True
 # Map from urllib3 to PyOpenSSL compatible parameter-values.
 _openssl_versions = {
     util.PROTOCOL_TLS: OpenSSL.SSL.SSLv23_METHOD,
+    PROTOCOL_TLS_CLIENT: OpenSSL.SSL.SSLv23_METHOD,
     ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD,
 }
 
@@ -400,7 +415,6 @@ if _fileobject:  # Platform-specific: Python 2
         self._makefile_refs += 1
         return _fileobject(self, mode, bufsize, close=True)
 
-
 else:  # Platform-specific: Python 3
     makefile = backport_makefile
 
@@ -450,9 +464,12 @@ class PyOpenSSLContext(object):
             cafile = cafile.encode("utf-8")
         if capath is not None:
             capath = capath.encode("utf-8")
-        self._ctx.load_verify_locations(cafile, capath)
-        if cadata is not None:
-            self._ctx.load_verify_locations(BytesIO(cadata))
+        try:
+            self._ctx.load_verify_locations(cafile, capath)
+            if cadata is not None:
+                self._ctx.load_verify_locations(BytesIO(cadata))
+        except OpenSSL.SSL.Error as e:
+            raise ssl.SSLError("unable to load trusted certificates: %r" % e)
 
     def load_cert_chain(self, certfile, keyfile=None, password=None):
         self._ctx.use_certificate_chain_file(certfile)
@@ -462,6 +479,10 @@ class PyOpenSSLContext(object):
             self._ctx.set_passwd_cb(lambda *_: password)
         self._ctx.use_privatekey_file(keyfile or certfile)
 
+    def set_alpn_protocols(self, protocols):
+        protocols = [six.ensure_binary(p) for p in protocols]
+        return self._ctx.set_alpn_protos(protocols)
+
     def wrap_socket(
         self,
         sock,

+ 75 - 13
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/contrib/securetransport.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/securetransport.py

@@ -29,6 +29,8 @@ library. An enormous debt is owed to him for blazing this trail for us. For
 that reason, this code should be considered to be covered both by urllib3's
 license and by oscrypto's:
 
+.. code-block::
+
     Copyright (c) 2015-2016 Will Bond <will@wbond.net>
 
     Permission is hereby granted, free of charge, to any person obtaining a
@@ -58,16 +60,22 @@ import os.path
 import shutil
 import socket
 import ssl
+import struct
 import threading
 import weakref
 
+import six
+
 from .. import util
-from ._securetransport.bindings import Security, SecurityConst, CoreFoundation
+from ..util.ssl_ import PROTOCOL_TLS_CLIENT
+from ._securetransport.bindings import CoreFoundation, Security, SecurityConst
 from ._securetransport.low_level import (
     _assert_no_error,
+    _build_tls_unknown_ca_alert,
     _cert_array_from_pem,
-    _temporary_keychain,
+    _create_cfstring_array,
     _load_client_cert_chain,
+    _temporary_keychain,
 )
 
 try:  # Platform-specific: Python 2
@@ -147,7 +155,8 @@ CIPHER_SUITES = [
 # TLSv1 and a high of TLSv1.2. For everything else, we pin to that version.
 # TLSv1 to 1.2 are supported on macOS 10.8+
 _protocol_to_min_max = {
-    util.PROTOCOL_TLS: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12)
+    util.PROTOCOL_TLS: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12),
+    PROTOCOL_TLS_CLIENT: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12),
 }
 
 if hasattr(ssl, "PROTOCOL_SSLv2"):
@@ -374,16 +383,55 @@ class WrappedSocket(object):
         )
         _assert_no_error(result)
 
+    def _set_alpn_protocols(self, protocols):
+        """
+        Sets up the ALPN protocols on the context.
+        """
+        if not protocols:
+            return
+        protocols_arr = _create_cfstring_array(protocols)
+        try:
+            result = Security.SSLSetALPNProtocols(self.context, protocols_arr)
+            _assert_no_error(result)
+        finally:
+            CoreFoundation.CFRelease(protocols_arr)
+
     def _custom_validate(self, verify, trust_bundle):
         """
         Called when we have set custom validation. We do this in two cases:
         first, when cert validation is entirely disabled; and second, when
         using a custom trust DB.
+        Raises an SSLError if the connection is not trusted.
         """
         # If we disabled cert validation, just say: cool.
         if not verify:
             return
 
+        successes = (
+            SecurityConst.kSecTrustResultUnspecified,
+            SecurityConst.kSecTrustResultProceed,
+        )
+        try:
+            trust_result = self._evaluate_trust(trust_bundle)
+            if trust_result in successes:
+                return
+            reason = "error code: %d" % (trust_result,)
+        except Exception as e:
+            # Do not trust on error
+            reason = "exception: %r" % (e,)
+
+        # SecureTransport does not send an alert nor shuts down the connection.
+        rec = _build_tls_unknown_ca_alert(self.version())
+        self.socket.sendall(rec)
+        # close the connection immediately
+        # l_onoff = 1, activate linger
+        # l_linger = 0, linger for 0 seoncds
+        opts = struct.pack("ii", 1, 0)
+        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, opts)
+        self.close()
+        raise ssl.SSLError("certificate verify failed, %s" % reason)
+
+    def _evaluate_trust(self, trust_bundle):
         # We want data in memory, so load it up.
         if os.path.isfile(trust_bundle):
             with open(trust_bundle, "rb") as f:
@@ -421,15 +469,7 @@ class WrappedSocket(object):
             if cert_array is not None:
                 CoreFoundation.CFRelease(cert_array)
 
-        # Ok, now we can look at what the result was.
-        successes = (
-            SecurityConst.kSecTrustResultUnspecified,
-            SecurityConst.kSecTrustResultProceed,
-        )
-        if trust_result.value not in successes:
-            raise ssl.SSLError(
-                "certificate verify failed, error code: %d" % trust_result.value
-            )
+        return trust_result.value
 
     def handshake(
         self,
@@ -441,6 +481,7 @@ class WrappedSocket(object):
         client_cert,
         client_key,
         client_key_passphrase,
+        alpn_protocols,
     ):
         """
         Actually performs the TLS handshake. This is run automatically by
@@ -481,6 +522,9 @@ class WrappedSocket(object):
         # Setup the ciphers.
         self._set_ciphers()
 
+        # Setup the ALPN protocols.
+        self._set_alpn_protocols(alpn_protocols)
+
         # Set the minimum and maximum TLS versions.
         result = Security.SSLSetProtocolVersionMin(self.context, min_version)
         _assert_no_error(result)
@@ -726,7 +770,6 @@ if _fileobject:  # Platform-specific: Python 2
         self._makefile_refs += 1
         return _fileobject(self, mode, bufsize, close=True)
 
-
 else:  # Platform-specific: Python 3
 
     def makefile(self, mode="r", buffering=None, *args, **kwargs):
@@ -754,6 +797,7 @@ class SecureTransportContext(object):
         self._client_cert = None
         self._client_key = None
         self._client_key_passphrase = None
+        self._alpn_protocols = None
 
     @property
     def check_hostname(self):
@@ -819,6 +863,11 @@ class SecureTransportContext(object):
         if capath is not None:
             raise ValueError("SecureTransport does not support cert directories")
 
+        # Raise if cafile does not exist.
+        if cafile is not None:
+            with open(cafile):
+                pass
+
         self._trust_bundle = cafile or cadata
 
     def load_cert_chain(self, certfile, keyfile=None, password=None):
@@ -826,6 +875,18 @@ class SecureTransportContext(object):
         self._client_key = keyfile
         self._client_cert_passphrase = password
 
+    def set_alpn_protocols(self, protocols):
+        """
+        Sets the ALPN protocols that will later be set on the context.
+
+        Raises a NotImplementedError if ALPN is not supported.
+        """
+        if not hasattr(Security, "SSLSetALPNProtocols"):
+            raise NotImplementedError(
+                "SecureTransport supports ALPN only in macOS 10.12+"
+            )
+        self._alpn_protocols = [six.ensure_binary(p) for p in protocols]
+
     def wrap_socket(
         self,
         sock,
@@ -855,5 +916,6 @@ class SecureTransportContext(object):
             self._client_cert,
             self._client_key,
             self._client_key_passphrase,
+            self._alpn_protocols,
         )
         return wrapped_socket

+ 14 - 8
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/contrib/socks.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/contrib/socks.py

@@ -14,22 +14,26 @@ supports the following SOCKS features:
 - SOCKS5 with local DNS (``proxy_url='socks5://...``)
 - Usernames and passwords for the SOCKS proxy
 
- .. note::
-    It is recommended to use ``socks5h://`` or ``socks4a://`` schemes in
-    your ``proxy_url`` to ensure that DNS resolution is done from the remote
-    server instead of client-side when connecting to a domain name.
+.. note::
+   It is recommended to use ``socks5h://`` or ``socks4a://`` schemes in
+   your ``proxy_url`` to ensure that DNS resolution is done from the remote
+   server instead of client-side when connecting to a domain name.
 
 SOCKS4 supports IPv4 and domain names with the SOCKS4A extension. SOCKS5
 supports IPv4, IPv6, and domain names.
 
 When connecting to a SOCKS4 proxy the ``username`` portion of the ``proxy_url``
-will be sent as the ``userid`` section of the SOCKS request::
+will be sent as the ``userid`` section of the SOCKS request:
+
+.. code-block:: python
 
     proxy_url="socks4a://<userid>@proxy-host"
 
 When connecting to a SOCKS5 proxy the ``username`` and ``password`` portion
 of the ``proxy_url`` will be sent as the username/password to authenticate
-with the proxy::
+with the proxy:
+
+.. code-block:: python
 
     proxy_url="socks5h://<username>:<password>@proxy-host"
 
@@ -40,19 +44,21 @@ try:
     import socks
 except ImportError:
     import warnings
+
     from ..exceptions import DependencyWarning
 
     warnings.warn(
         (
             "SOCKS support in urllib3 requires the installation of optional "
             "dependencies: specifically, PySocks.  For more information, see "
-            "https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies"
+            "https://urllib3.readthedocs.io/en/1.26.x/contrib.html#socks-proxies"
         ),
         DependencyWarning,
     )
     raise
 
-from socket import error as SocketError, timeout as SocketTimeout
+from socket import error as SocketError
+from socket import timeout as SocketTimeout
 
 from ..connection import HTTPConnection, HTTPSConnection
 from ..connectionpool import HTTPConnectionPool, HTTPSConnectionPool

+ 106 - 38
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/exceptions.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/exceptions.py

@@ -1,21 +1,24 @@
 from __future__ import absolute_import
+
 from .packages.six.moves.http_client import IncompleteRead as httplib_IncompleteRead
 
 # Base Exceptions
 
 
 class HTTPError(Exception):
-    "Base exception used by this module."
+    """Base exception used by this module."""
+
     pass
 
 
 class HTTPWarning(Warning):
-    "Base warning used by this module."
+    """Base warning used by this module."""
+
     pass
 
 
 class PoolError(HTTPError):
-    "Base exception for errors caused within a pool."
+    """Base exception for errors caused within a pool."""
 
     def __init__(self, pool, message):
         self.pool = pool
@@ -27,7 +30,7 @@ class PoolError(HTTPError):
 
 
 class RequestError(PoolError):
-    "Base exception for PoolErrors that have associated URLs."
+    """Base exception for PoolErrors that have associated URLs."""
 
     def __init__(self, pool, url, message):
         self.url = url
@@ -39,22 +42,28 @@ class RequestError(PoolError):
 
 
 class SSLError(HTTPError):
-    "Raised when SSL certificate fails in an HTTPS connection."
+    """Raised when SSL certificate fails in an HTTPS connection."""
+
     pass
 
 
 class ProxyError(HTTPError):
-    "Raised when the connection to a proxy fails."
-    pass
+    """Raised when the connection to a proxy fails."""
+
+    def __init__(self, message, error, *args):
+        super(ProxyError, self).__init__(message, error, *args)
+        self.original_error = error
 
 
 class DecodeError(HTTPError):
-    "Raised when automatic decoding based on Content-Type fails."
+    """Raised when automatic decoding based on Content-Type fails."""
+
     pass
 
 
 class ProtocolError(HTTPError):
-    "Raised when something unexpected happens mid-request/response."
+    """Raised when something unexpected happens mid-request/response."""
+
     pass
 
 
@@ -84,7 +93,7 @@ class MaxRetryError(RequestError):
 
 
 class HostChangedError(RequestError):
-    "Raised when an existing pool gets a request for a foreign host."
+    """Raised when an existing pool gets a request for a foreign host."""
 
     def __init__(self, pool, url, retries=3):
         message = "Tried to open a foreign host with url: %s" % url
@@ -93,13 +102,13 @@ class HostChangedError(RequestError):
 
 
 class TimeoutStateError(HTTPError):
-    """ Raised when passing an invalid state to a timeout """
+    """Raised when passing an invalid state to a timeout"""
 
     pass
 
 
 class TimeoutError(HTTPError):
-    """ Raised when a socket timeout error occurs.
+    """Raised when a socket timeout error occurs.
 
     Catching this error will catch both :exc:`ReadTimeoutErrors
     <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`.
@@ -109,39 +118,45 @@ class TimeoutError(HTTPError):
 
 
 class ReadTimeoutError(TimeoutError, RequestError):
-    "Raised when a socket timeout occurs while receiving data from a server"
+    """Raised when a socket timeout occurs while receiving data from a server"""
+
     pass
 
 
 # This timeout error does not have a URL attached and needs to inherit from the
 # base HTTPError
 class ConnectTimeoutError(TimeoutError):
-    "Raised when a socket timeout occurs while connecting to a server"
+    """Raised when a socket timeout occurs while connecting to a server"""
+
     pass
 
 
 class NewConnectionError(ConnectTimeoutError, PoolError):
-    "Raised when we fail to establish a new connection. Usually ECONNREFUSED."
+    """Raised when we fail to establish a new connection. Usually ECONNREFUSED."""
+
     pass
 
 
 class EmptyPoolError(PoolError):
-    "Raised when a pool runs out of connections and no more are allowed."
+    """Raised when a pool runs out of connections and no more are allowed."""
+
     pass
 
 
 class ClosedPoolError(PoolError):
-    "Raised when a request enters a pool after the pool has been closed."
+    """Raised when a request enters a pool after the pool has been closed."""
+
     pass
 
 
 class LocationValueError(ValueError, HTTPError):
-    "Raised when there is something wrong with a given URL input."
+    """Raised when there is something wrong with a given URL input."""
+
     pass
 
 
 class LocationParseError(LocationValueError):
-    "Raised when get_host or similar fails to parse the URL input."
+    """Raised when get_host or similar fails to parse the URL input."""
 
     def __init__(self, location):
         message = "Failed to parse: %s" % location
@@ -150,39 +165,56 @@ class LocationParseError(LocationValueError):
         self.location = location
 
 
+class URLSchemeUnknown(LocationValueError):
+    """Raised when a URL input has an unsupported scheme."""
+
+    def __init__(self, scheme):
+        message = "Not supported URL scheme %s" % scheme
+        super(URLSchemeUnknown, self).__init__(message)
+
+        self.scheme = scheme
+
+
 class ResponseError(HTTPError):
-    "Used as a container for an error reason supplied in a MaxRetryError."
+    """Used as a container for an error reason supplied in a MaxRetryError."""
+
     GENERIC_ERROR = "too many error responses"
     SPECIFIC_ERROR = "too many {status_code} error responses"
 
 
 class SecurityWarning(HTTPWarning):
-    "Warned when performing security reducing actions"
+    """Warned when performing security reducing actions"""
+
     pass
 
 
 class SubjectAltNameWarning(SecurityWarning):
-    "Warned when connecting to a host with a certificate missing a SAN."
+    """Warned when connecting to a host with a certificate missing a SAN."""
+
     pass
 
 
 class InsecureRequestWarning(SecurityWarning):
-    "Warned when making an unverified HTTPS request."
+    """Warned when making an unverified HTTPS request."""
+
     pass
 
 
 class SystemTimeWarning(SecurityWarning):
-    "Warned when system time is suspected to be wrong"
+    """Warned when system time is suspected to be wrong"""
+
     pass
 
 
 class InsecurePlatformWarning(SecurityWarning):
-    "Warned when certain SSL configuration is not available on a platform."
+    """Warned when certain TLS/SSL configuration is not available on a platform."""
+
     pass
 
 
 class SNIMissingWarning(HTTPWarning):
-    "Warned when making a HTTPS request without SNI available."
+    """Warned when making a HTTPS request without SNI available."""
+
     pass
 
 
@@ -196,14 +228,15 @@ class DependencyWarning(HTTPWarning):
 
 
 class ResponseNotChunked(ProtocolError, ValueError):
-    "Response needs to be chunked in order to read it as chunks."
+    """Response needs to be chunked in order to read it as chunks."""
+
     pass
 
 
 class BodyNotHttplibCompatible(HTTPError):
     """
-    Body should be httplib.HTTPResponse like (have an fp attribute which
-    returns raw chunks) for read_chunked().
+    Body should be :class:`http.client.HTTPResponse` like
+    (have an fp attribute which returns raw chunks) for read_chunked().
     """
 
     pass
@@ -213,9 +246,8 @@ class IncompleteRead(HTTPError, httplib_IncompleteRead):
     """
     Response length doesn't match expected Content-Length
 
-    Subclass of http_client.IncompleteRead to allow int value
-    for `partial` to avoid creating large objects on streamed
-    reads.
+    Subclass of :class:`http.client.IncompleteRead` to allow int value
+    for ``partial`` to avoid creating large objects on streamed reads.
     """
 
     def __init__(self, partial, expected):
@@ -228,22 +260,57 @@ class IncompleteRead(HTTPError, httplib_IncompleteRead):
         )
 
 
+class InvalidChunkLength(HTTPError, httplib_IncompleteRead):
+    """Invalid chunk length in a chunked response."""
+
+    def __init__(self, response, length):
+        super(InvalidChunkLength, self).__init__(
+            response.tell(), response.length_remaining
+        )
+        self.response = response
+        self.length = length
+
+    def __repr__(self):
+        return "InvalidChunkLength(got length %r, %i bytes read)" % (
+            self.length,
+            self.partial,
+        )
+
+
 class InvalidHeader(HTTPError):
-    "The header provided was somehow invalid."
+    """The header provided was somehow invalid."""
+
     pass
 
 
-class ProxySchemeUnknown(AssertionError, ValueError):
-    "ProxyManager does not support the supplied scheme"
+class ProxySchemeUnknown(AssertionError, URLSchemeUnknown):
+    """ProxyManager does not support the supplied scheme"""
+
     # TODO(t-8ch): Stop inheriting from AssertionError in v2.0.
 
     def __init__(self, scheme):
-        message = "Not supported proxy scheme %s" % scheme
+        # 'localhost' is here because our URL parser parses
+        # localhost:8080 -> scheme=localhost, remove if we fix this.
+        if scheme == "localhost":
+            scheme = None
+        if scheme is None:
+            message = "Proxy URL had no scheme, should start with http:// or https://"
+        else:
+            message = (
+                "Proxy URL had unsupported scheme %s, should use http:// or https://"
+                % scheme
+            )
         super(ProxySchemeUnknown, self).__init__(message)
 
 
+class ProxySchemeUnsupported(ValueError):
+    """Fetching HTTPS resources through HTTPS proxies is unsupported"""
+
+    pass
+
+
 class HeaderParsingError(HTTPError):
-    "Raised by assert_header_parsing, but we convert it to a log.warning statement."
+    """Raised by assert_header_parsing, but we convert it to a log.warning statement."""
 
     def __init__(self, defects, unparsed_data):
         message = "%s, unparsed data: %r" % (defects or "Unknown", unparsed_data)
@@ -251,5 +318,6 @@ class HeaderParsingError(HTTPError):
 
 
 class UnrewindableBodyError(HTTPError):
-    "urllib3 encountered an error when trying to rewind a body"
+    """urllib3 encountered an error when trying to rewind a body"""
+
     pass

+ 3 - 2
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/fields.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/fields.py

@@ -1,4 +1,5 @@
 from __future__ import absolute_import
+
 import email.utils
 import mimetypes
 import re
@@ -26,7 +27,8 @@ def format_header_param_rfc2231(name, value):
     strategy defined in RFC 2231.
 
     Particularly useful for header parameters which might contain
-    non-ASCII values, like file names. This follows RFC 2388 Section 4.4.
+    non-ASCII values, like file names. This follows
+    `RFC 2388 Section 4.4 <https://tools.ietf.org/html/rfc2388#section-4.4>`_.
 
     :param name:
         The name of the parameter, a string expected to be ASCII only.
@@ -65,7 +67,6 @@ _HTML5_REPLACEMENTS = {
     u"\u0022": u"%22",
     # Replace "\" with "\\".
     u"\u005C": u"\u005C\u005C",
-    u"\u005C": u"\u005C\u005C",
 }
 
 # All control characters from 0x00 to 0x1F *except* 0x1B.

+ 2 - 2
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/filepost.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/filepost.py

@@ -1,13 +1,13 @@
 from __future__ import absolute_import
+
 import binascii
 import codecs
 import os
-
 from io import BytesIO
 
+from .fields import RequestField
 from .packages import six
 from .packages.six import b
-from .fields import RequestField
 
 writer = codecs.lookup("utf-8")[3]
 

+ 0 - 0
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/packages/backports/__init__.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/packages/__init__.py


+ 0 - 0
desktop/core/ext-py/urllib3-1.25.8/test/appengine/__init__.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/packages/backports/__init__.py


+ 0 - 1
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/packages/backports/makefile.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/packages/backports/makefile.py

@@ -7,7 +7,6 @@ Backports the Python 3 ``socket.makefile`` method for use with anything that
 wants to create a "fake" socket object.
 """
 import io
-
 from socket import SocketIO
 
 

+ 90 - 35
desktop/core/ext-py/urllib3-1.25.8/src/urllib3/packages/six.py → desktop/core/ext-py/urllib3-1.26.12/src/urllib3/packages/six.py

@@ -1,4 +1,4 @@
-# Copyright (c) 2010-2019 Benjamin Peterson
+# Copyright (c) 2010-2020 Benjamin Peterson
 #
 # Permission is hereby granted, free of charge, to any person obtaining a copy
 # of this software and associated documentation files (the "Software"), to deal
@@ -29,7 +29,7 @@ import sys
 import types
 
 __author__ = "Benjamin Peterson <benjamin@python.org>"
-__version__ = "1.12.0"
+__version__ = "1.16.0"
 
 
 # Useful for very coarse version differentiation.
@@ -71,6 +71,11 @@ else:
             MAXSIZE = int((1 << 63) - 1)
         del X
 
+if PY34:
+    from importlib.util import spec_from_loader
+else:
+    spec_from_loader = None
+
 
 def _add_doc(func, doc):
     """Add documentation to a function."""
@@ -182,6 +187,11 @@ class _SixMetaPathImporter(object):
             return self
         return None
 
+    def find_spec(self, fullname, path, target=None):
+        if fullname in self.known_modules:
+            return spec_from_loader(fullname, self)
+        return None
+
     def __get_module(self, fullname):
         try:
             return self.known_modules[fullname]
@@ -220,6 +230,12 @@ class _SixMetaPathImporter(object):
 
     get_source = get_code  # same as get_code
 
+    def create_module(self, spec):
+        return self.load_module(spec.name)
+
+    def exec_module(self, module):
+        pass
+
 
 _importer = _SixMetaPathImporter(__name__)
 
@@ -260,9 +276,19 @@ _moved_attributes = [
     ),
     MovedModule("builtins", "__builtin__"),
     MovedModule("configparser", "ConfigParser"),
+    MovedModule(
+        "collections_abc",
+        "collections",
+        "collections.abc" if sys.version_info >= (3, 3) else "collections",
+    ),
     MovedModule("copyreg", "copy_reg"),
     MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
-    MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
+    MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"),
+    MovedModule(
+        "_dummy_thread",
+        "dummy_thread",
+        "_dummy_thread" if sys.version_info < (3, 9) else "_thread",
+    ),
     MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
     MovedModule("http_cookies", "Cookie", "http.cookies"),
     MovedModule("html_entities", "htmlentitydefs", "html.entities"),
@@ -307,7 +333,9 @@ _moved_attributes = [
 ]
 # Add windows specific modules.
 if sys.platform == "win32":
-    _moved_attributes += [MovedModule("winreg", "_winreg")]
+    _moved_attributes += [
+        MovedModule("winreg", "_winreg"),
+    ]
 
 for attr in _moved_attributes:
     setattr(_MovedItems, attr.name, attr)
@@ -476,7 +504,7 @@ class Module_six_moves_urllib_robotparser(_LazyModule):
 
 
 _urllib_robotparser_moved_attributes = [
-    MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser")
+    MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
 ]
 for attr in _urllib_robotparser_moved_attributes:
     setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
@@ -678,9 +706,11 @@ if PY3:
     if sys.version_info[1] <= 1:
         _assertRaisesRegex = "assertRaisesRegexp"
         _assertRegex = "assertRegexpMatches"
+        _assertNotRegex = "assertNotRegexpMatches"
     else:
         _assertRaisesRegex = "assertRaisesRegex"
         _assertRegex = "assertRegex"
+        _assertNotRegex = "assertNotRegex"
 else:
 
     def b(s):
@@ -707,6 +737,7 @@ else:
     _assertCountEqual = "assertItemsEqual"
     _assertRaisesRegex = "assertRaisesRegexp"
     _assertRegex = "assertRegexpMatches"
+    _assertNotRegex = "assertNotRegexpMatches"
 _add_doc(b, """Byte literal""")
 _add_doc(u, """Text literal""")
 
@@ -723,6 +754,10 @@ def assertRegex(self, *args, **kwargs):
     return getattr(self, _assertRegex)(*args, **kwargs)
 
 
+def assertNotRegex(self, *args, **kwargs):
+    return getattr(self, _assertNotRegex)(*args, **kwargs)
+
+
 if PY3:
     exec_ = getattr(moves.builtins, "exec")
 
@@ -737,7 +772,6 @@ if PY3:
             value = None
             tb = None
 
-
 else:
 
     def exec_(_code_, _globs_=None, _locs_=None):
@@ -750,7 +784,7 @@ else:
             del frame
         elif _locs_ is None:
             _locs_ = _globs_
-        exec("""exec _code_ in _globs_, _locs_""")
+        exec ("""exec _code_ in _globs_, _locs_""")
 
     exec_(
         """def reraise(tp, value, tb=None):
@@ -762,18 +796,7 @@ else:
     )
 
 
-if sys.version_info[:2] == (3, 2):
-    exec_(
-        """def raise_from(value, from_value):
-    try:
-        if from_value is None:
-            raise value
-        raise value from from_value
-    finally:
-        value = None
-"""
-    )
-elif sys.version_info[:2] > (3, 2):
+if sys.version_info[:2] > (3,):
     exec_(
         """def raise_from(value, from_value):
     try:
@@ -863,19 +886,41 @@ if sys.version_info[:2] < (3, 3):
 _add_doc(reraise, """Reraise an exception.""")
 
 if sys.version_info[0:2] < (3, 4):
+    # This does exactly the same what the :func:`py3:functools.update_wrapper`
+    # function does on Python versions after 3.2. It sets the ``__wrapped__``
+    # attribute on ``wrapper`` object and it doesn't raise an error if any of
+    # the attributes mentioned in ``assigned`` and ``updated`` are missing on
+    # ``wrapped`` object.
+    def _update_wrapper(
+        wrapper,
+        wrapped,
+        assigned=functools.WRAPPER_ASSIGNMENTS,
+        updated=functools.WRAPPER_UPDATES,
+    ):
+        for attr in assigned:
+            try:
+                value = getattr(wrapped, attr)
+            except AttributeError:
+                continue
+            else:
+                setattr(wrapper, attr, value)
+        for attr in updated:
+            getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
+        wrapper.__wrapped__ = wrapped
+        return wrapper
+
+    _update_wrapper.__doc__ = functools.update_wrapper.__doc__
 
     def wraps(
         wrapped,
         assigned=functools.WRAPPER_ASSIGNMENTS,
         updated=functools.WRAPPER_UPDATES,
     ):
-        def wrapper(f):
-            f = functools.wraps(wrapped, assigned, updated)(f)
-            f.__wrapped__ = wrapped
-            return f
-
-        return wrapper
+        return functools.partial(
+            _update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated
+        )
 
+    wraps.__doc__ = functools.wraps.__doc__
 
 else:
     wraps = functools.wraps
@@ -888,7 +933,15 @@ def with_metaclass(meta, *bases):
     # the actual metaclass.
     class metaclass(type):
         def __new__(cls, name, this_bases, d):
-            return meta(name, bases, d)
+            if sys.version_info[:2] >= (3, 7):
+                # This version introduced PEP 560 that requires a bit
+                # of extra care (we mimic what is done by __build_class__).
+                resolved_bases = types.resolve_bases(bases)
+                if resolved_bases is not bases:
+                    d["__orig_bases__"] = bases
+            else:
+                resolved_bases = bases
+            return meta(name, resolved_bases, d)
 
         @classmethod
         def __prepare__(cls, name, this_bases):
@@ -928,12 +981,11 @@ def ensure_binary(s, encoding="utf-8", errors="strict"):
       - `str` -> encoded to `bytes`
       - `bytes` -> `bytes`
     """
+    if isinstance(s, binary_type):
+        return s
     if isinstance(s, text_type):
         return s.encode(encoding, errors)
-    elif isinstance(s, binary_type):
-        return s
-    else:
-        raise TypeError("not expecting type '%s'" % type(s))
+    raise TypeError("not expecting type '%s'" % type(s))
 
 
 def ensure_str(s, encoding="utf-8", errors="strict"):
@@ -947,12 +999,15 @@ def ensure_str(s, encoding="utf-8", errors="strict"):
       - `str` -> `str`
       - `bytes` -> decoded to `str`
     """
-    if not isinstance(s, (text_type, binary_type)):
-        raise TypeError("not expecting type '%s'" % type(s))
+    # Optimization: Fast return for the common case.
+    if type(s) is str:
+        return s
     if PY2 and isinstance(s, text_type):
-        s = s.encode(encoding, errors)
+        return s.encode(encoding, errors)
     elif PY3 and isinstance(s, binary_type):
-        s = s.decode(encoding, errors)
+        return s.decode(encoding, errors)
+    elif not isinstance(s, (text_type, binary_type)):
+        raise TypeError("not expecting type '%s'" % type(s))
     return s
 
 
@@ -977,7 +1032,7 @@ def ensure_text(s, encoding="utf-8", errors="strict"):
 
 def python_2_unicode_compatible(klass):
     """
-    A decorator that defines __unicode__ and __str__ methods under Python 2.
+    A class decorator that defines __unicode__ and __str__ methods under Python 2.
     Under Python 3 it does nothing.
 
     To support Python 2 and 3 with a single code base, define a __str__ method

Some files were not shown because too many files changed in this diff